-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathWebComponentProject.jsx
More file actions
100 lines (91 loc) · 2.93 KB
/
WebComponentProject.jsx
File metadata and controls
100 lines (91 loc) · 2.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
import React, { useEffect, useState } from "react";
import { useDispatch, useSelector } from "react-redux";
import { useMediaQuery } from "react-responsive";
import Project from "../Editor/Project/Project";
import MobileProject from "../Mobile/MobileProject/MobileProject";
import Output from "../Editor/Output/Output";
import { defaultMZCriteria } from "../../utils/DefaultMZCriteria";
import Sk from "skulpt";
import { setIsSplitView, setWebComponent } from "../../redux/EditorSlice";
import { MOBILE_MEDIA_QUERY } from "../../utils/mediaQueryBreakpoints";
import {
codeChangedEvent,
runCompletedEvent,
runStartedEvent,
stepChangedEvent,
} from "../../events/WebComponentCustomEvents";
const WebComponentProject = ({
withProjectbar = false,
withSidebar = false,
sidebarOptions = [],
outputOnly = false,
}) => {
const loading = useSelector((state) => state.editor.loading);
const project = useSelector((state) => state.editor.project);
const codeRunTriggered = useSelector(
(state) => state.editor.codeRunTriggered,
);
const error = useSelector((state) => state.editor.error);
const codeHasBeenRun = useSelector((state) => state.editor.codeHasBeenRun);
const currentStepPosition = useSelector(
(state) => state.instructions.currentStepPosition,
);
const isMobile = useMediaQuery({ query: MOBILE_MEDIA_QUERY });
const [codeHasRun, setCodeHasRun] = useState(codeHasBeenRun);
const dispatch = useDispatch();
dispatch(setIsSplitView(false));
dispatch(setWebComponent(true));
console.log(`outputOnly: ${outputOnly}`);
useEffect(() => {
setCodeHasRun(false);
const timeout = setTimeout(() => {
document.dispatchEvent(codeChangedEvent);
}, 2000);
return () => clearTimeout(timeout);
}, [project]);
useEffect(() => {
if (codeRunTriggered) {
document.dispatchEvent(runStartedEvent);
setCodeHasRun(true);
} else if (codeHasRun) {
const mz_criteria = Sk.sense_hat
? Sk.sense_hat.mz_criteria
: { ...defaultMZCriteria };
document.dispatchEvent(
runCompletedEvent({
isErrorFree: error === "",
...mz_criteria,
}),
);
}
}, [codeRunTriggered, codeHasRun, error]);
useEffect(() => {
document.dispatchEvent(stepChangedEvent(currentStepPosition));
}, [currentStepPosition]);
return (
<>
{!outputOnly &&
(isMobile ? (
<MobileProject
withSidebar={withSidebar}
sidebarOptions={sidebarOptions}
/>
) : (
<Project
forWebComponent={true}
withProjectbar={withProjectbar}
withSidebar={withSidebar}
sidebarOptions={sidebarOptions}
/>
))}
{outputOnly && (
<div className="embedded-viewer">
{loading === "success" && (
<Output embedded={true} browserPreview={false} />
)}
</div>
)}
</>
);
};
export default WebComponentProject;