Skip to content

Commit 9d3a72f

Browse files
committed
use dispatch for execution
1 parent 556d744 commit 9d3a72f

File tree

7 files changed

+240
-194
lines changed

7 files changed

+240
-194
lines changed

src/ConsolePanel.res

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,23 @@ type logLevel = [
33
| #warn
44
| #error
55
]
6+
type log = {level: logLevel, content: array<string>}
67

78
@react.component
8-
let make = (~logs, ~setLogs) => {
9+
let make = (~logs, ~appendLog) => {
910
React.useEffect(() => {
1011
let cb = e => {
1112
let data = e["data"]
1213
switch data["type"] {
1314
| #...logLevel as logLevel =>
1415
let args: array<string> = data["args"]
15-
setLogs(previous => previous->Array.concat([(logLevel, args)]))
16+
appendLog(logLevel, args)
1617
| _ => ()
1718
}
1819
}
1920
Webapi.Window.addEventListener("message", cb)
2021
Some(() => Webapi.Window.removeEventListener("message", cb))
21-
}, [])
22+
}, [appendLog])
2223

2324
<div className="px-2 py-6 relative flex flex-col flex-1 overflow-y-hidden">
2425
<h2 className="font-bold text-gray-5/50 absolute right-2 top-2"> {React.string("Console")} </h2>
@@ -30,7 +31,7 @@ let make = (~logs, ~setLogs) => {
3031
| logs =>
3132
let content =
3233
logs
33-
->Array.mapWithIndex(((logLevel, log), i) => {
34+
->Array.mapWithIndex(({level: logLevel, content: log}, i) => {
3435
let log = Array.join(log, " ")
3536
<pre
3637
key={RescriptCore.Int.toString(i)}

src/OutputPanel.res

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,21 @@
11
@react.component
2-
let make = (~runOutput, ~compilerState, ~logs, ~setLogs) => {
2+
let make = (~compilerState, ~appendLog) => {
3+
let validReact = switch compilerState {
4+
| CompilerManagerHook.Executing({state: {validReactCode: true}})
5+
| Compiling({validReactCode: true})
6+
| Ready({validReactCode: true}) => true
7+
| _ => false
8+
}
9+
10+
let logs = switch compilerState {
11+
| CompilerManagerHook.Executing({state: {logs}})
12+
| Compiling({logs})
13+
| Ready({logs}) => logs
14+
| _ => []
15+
}
316
<div className="h-full flex flex-col overflow-y-hidden">
4-
<RenderPanel runOutput compilerState clearLogs={() => setLogs(_ => [])} />
17+
<RenderPanel validReact />
518
<hr className="border-gray-60" />
6-
<ConsolePanel logs setLogs />
19+
<ConsolePanel logs appendLog />
720
</div>
821
}

src/Playground.res

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1130,21 +1130,27 @@ module ControlPanel = {
11301130
~state: CompilerManagerHook.state,
11311131
~dispatch: CompilerManagerHook.action => unit,
11321132
~editorCode: React.ref<string>,
1133-
~runOutput,
1134-
~toggleRunOutput,
11351133
) => {
11361134
let children = switch state {
11371135
| Init => React.string("Initializing...")
11381136
| SwitchingCompiler(_ready, _version) => React.string("Switching Compiler...")
1139-
| Compiling(_, _)
1137+
| Compiling(_)
1138+
| Executing(_)
11401139
| Ready(_) =>
11411140
let onFormatClick = evt => {
11421141
ReactEvent.Mouse.preventDefault(evt)
11431142
dispatch(Format(editorCode.current))
11441143
}
11451144

1145+
let autoRun = switch state {
1146+
| CompilerManagerHook.Executing({state: {autoRun: true}})
1147+
| Compiling({autoRun: true})
1148+
| Ready({autoRun: true}) => true
1149+
| _ => false
1150+
}
1151+
11461152
<div className="flex flex-row gap-x-2">
1147-
<ToggleButton checked=runOutput onChange={_ => toggleRunOutput()}>
1153+
<ToggleButton checked=autoRun onChange={_ => dispatch(ToggleAutoRun)}>
11481154
{React.string("Auto-run")}
11491155
</ToggleButton>
11501156
<Button onClick=onFormatClick> {React.string("Format")} </Button>
@@ -1176,7 +1182,6 @@ module OutputPanel = {
11761182
~compilerState: CompilerManagerHook.state,
11771183
~editorCode: React.ref<string>,
11781184
~currentTab: tab,
1179-
~runOutput,
11801185
) => {
11811186
/*
11821187
We need the prevState to understand different
@@ -1199,8 +1204,9 @@ module OutputPanel = {
11991204
}
12001205
| (_, Ready({result: Comp(Success(_)) as result})) =>
12011206
ControlPanel.codeFromResult(result)->Some
1202-
| (Ready({result: Comp(Success(_)) as result}), Compiling(_, _)) =>
1207+
| (Ready({result: Comp(Success(_)) as result}), Compiling(_)) =>
12031208
ControlPanel.codeFromResult(result)->Some
1209+
| (_, Executing({jsCode})) => Some(jsCode)
12041210
| _ => None
12051211
}
12061212
| None =>
@@ -1213,8 +1219,9 @@ module OutputPanel = {
12131219
prevState.current = Some(compilerState)
12141220

12151221
let resultPane = switch compilerState {
1216-
| Compiling(ready, _)
1217-
| Ready(ready) =>
1222+
| Compiling(ready)
1223+
| Ready(ready)
1224+
| Executing({state: ready}) =>
12181225
switch ready.result {
12191226
| Comp(Success(_))
12201227
| Conv(Success(_)) => React.null
@@ -1246,8 +1253,9 @@ module OutputPanel = {
12461253
</div>
12471254

12481255
let errorPane = switch compilerState {
1249-
| Compiling(ready, _)
1256+
| Compiling(ready)
12501257
| Ready(ready)
1258+
| Executing({state: ready})
12511259
| SwitchingCompiler(ready, _) =>
12521260
<ResultPane
12531261
targetLang=ready.targetLang
@@ -1260,7 +1268,8 @@ module OutputPanel = {
12601268

12611269
let settingsPane = switch compilerState {
12621270
| Ready(ready)
1263-
| Compiling(ready, _)
1271+
| Compiling(ready)
1272+
| Executing({state: ready})
12641273
| SwitchingCompiler(ready, _) =>
12651274
let config = ready.selected.config
12661275
let setConfig = config => compilerDispatch(UpdateConfig(config))
@@ -1273,7 +1282,9 @@ module OutputPanel = {
12731282
let prevSelected = React.useRef(0)
12741283

12751284
let selected = switch compilerState {
1276-
| Compiling(_, _) => prevSelected.current
1285+
| Executing(_)
1286+
| Compiling(_) =>
1287+
prevSelected.current
12771288
| Ready(ready) =>
12781289
switch ready.result {
12791290
| Comp(Success(_))
@@ -1285,10 +1296,10 @@ module OutputPanel = {
12851296

12861297
prevSelected.current = selected
12871298

1288-
let (logs, setLogs) = React.useState(_ => [])
1299+
let appendLog = (level, content) => compilerDispatch(AppendLog({level, content}))
12891300

12901301
let tabs = [
1291-
(Output, <OutputPanel runOutput compilerState logs setLogs />),
1302+
(Output, <OutputPanel compilerState appendLog />),
12921303
(JavaScript, output),
12931304
(Problems, errorPane),
12941305
(Settings, settingsPane),
@@ -1483,7 +1494,7 @@ let make = (~versions: array<string>) => {
14831494
}
14841495

14851496
None
1486-
}, [compilerState])
1497+
}, (compilerState, compilerDispatch))
14871498

14881499
let (layout, setLayout) = React.useState(_ =>
14891500
Webapi.Window.innerWidth < breakingPoint ? Column : Row
@@ -1693,17 +1704,12 @@ let make = (~versions: array<string>) => {
16931704
</button>
16941705
})
16951706

1696-
let (runOutput, setRunOutput) = React.useState(() => false)
1697-
let toggleRunOutput = () => setRunOutput(prev => !prev)
1698-
16991707
<main className={"flex flex-col bg-gray-100 overflow-hidden"}>
17001708
<ControlPanel
17011709
actionIndicatorKey={Int.toString(actionCount)}
17021710
state=compilerState
17031711
dispatch=compilerDispatch
17041712
editorCode
1705-
runOutput
1706-
toggleRunOutput
17071713
/>
17081714
<div
17091715
className={`flex ${layout == Column ? "flex-col" : "flex-row"}`}
@@ -1758,7 +1764,7 @@ let make = (~versions: array<string>) => {
17581764
{React.array(headers)}
17591765
</div>
17601766
<div ref={ReactDOM.Ref.domRef(subPanelRef)} className="overflow-auto">
1761-
<OutputPanel currentTab compilerDispatch compilerState editorCode runOutput />
1767+
<OutputPanel currentTab compilerDispatch compilerState editorCode />
17621768
</div>
17631769
</div>
17641770
</div>

src/RenderPanel.res

Lines changed: 1 addition & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,68 +1,5 @@
1-
let wrapReactApp = code =>
2-
`(function () {
3-
${code}
4-
window.reactRoot.render(React.createElement(App.make, {}));
5-
})();`
6-
7-
let capitalizeFirstLetter = string => {
8-
let firstLetter = string->String.charAt(0)->String.toUpperCase
9-
`${firstLetter}${string->String.sliceToEnd(~start=1)}`
10-
}
11-
121
@react.component
13-
let make = (~compilerState: CompilerManagerHook.state, ~clearLogs, ~runOutput) => {
14-
let (validReact, setValidReact) = React.useState(() => false)
15-
React.useEffect(() => {
16-
if runOutput {
17-
switch compilerState {
18-
| CompilerManagerHook.Ready({selected, result: Comp(Success({js_code}))}) =>
19-
clearLogs()
20-
open Babel
21-
22-
let ast = Parser.parse(js_code, {sourceType: "module"})
23-
let {entryPointExists, code, imports} = PlaygroundValidator.validate(ast)
24-
let imports = imports->Dict.mapValues(path => {
25-
let filename = path->String.sliceToEnd(~start=9) // the part after "./stdlib/"
26-
let filename = switch selected.id {
27-
| {major: 12, minor: 0, patch: 0, preRelease: Some(Alpha(alpha))} if alpha < 8 =>
28-
let filename = if filename->String.startsWith("core__") {
29-
filename->String.sliceToEnd(~start=6)
30-
} else {
31-
filename
32-
}
33-
capitalizeFirstLetter(filename)
34-
| {major} if major < 12 && filename->String.startsWith("core__") =>
35-
capitalizeFirstLetter(filename)
36-
| _ => filename
37-
}
38-
let compilerVersion = switch selected.id {
39-
| {major: 12, minor: 0, patch: 0, preRelease: Some(Alpha(alpha))} if alpha < 8 => {
40-
Semver.major: 12,
41-
minor: 0,
42-
patch: 0,
43-
preRelease: Some(Alpha(8)),
44-
}
45-
| {major, minor} if (major === 11 && minor < 2) || major < 11 => {
46-
major: 11,
47-
minor: 2,
48-
patch: 0,
49-
preRelease: Some(Beta(1)),
50-
}
51-
| version => version
52-
}
53-
CompilerManagerHook.CdnMeta.getStdlibRuntimeUrl(compilerVersion, filename)
54-
})
55-
56-
entryPointExists
57-
? code->wrapReactApp->EvalIFrame.sendOutput(imports)
58-
: EvalIFrame.sendOutput(code, imports)
59-
setValidReact(_ => entryPointExists)
60-
| _ => ()
61-
}
62-
}
63-
None
64-
}, (compilerState, runOutput))
65-
2+
let make = (~validReact) => {
663
<div className={`px-2 relative ${validReact ? "flex-1 py-2 overflow-y-auto" : "h-auto py-6"}`}>
674
<h2 className="font-bold text-gray-5/50 absolute right-2 top-2"> {React.string("React")} </h2>
685
{validReact

src/RenderPanel.resi

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,2 @@
11
@react.component
2-
let make: (
3-
~compilerState: CompilerManagerHook.state,
4-
~clearLogs: unit => unit,
5-
~runOutput: bool,
6-
) => Jsx.element
2+
let make: (~validReact: bool) => Jsx.element

0 commit comments

Comments
 (0)