@@ -0,0 +1,74 @@
1+module CompileEditor.Component where
2+
3+import Prelude hiding (add)
4+import Button.Component (ButtonType(..), mkButton)
5+import Card.Component (mkCard)
6+import Data.Foldable (for_)
7+import Data.Nullable (null)
8+import Data.Tuple.Nested ((/\))
9+import Editor (getValue, mkEditor)
10+import Effect (Effect)
11+import Effect.Aff (Aff, launchAff_)
12+import Effect.Class (liftEffect)
13+import Milkis as M
14+import Milkis.Impl.Window (windowFetch)
15+import React.Basic (ReactComponent)
16+import React.Basic.DOM (css)
17+import React.Basic.DOM as R
18+import React.Basic.Events (handler_)
19+import React.Basic.Hooks (component, element, fragment, readRefMaybe, useRef, useState)
20+import React.Basic.Hooks as React
21+import Shared.Json (readAff)
22+import Shared.Models.Body as Body
23+import Simple.JSON (writeJSON)
24+
25+mkCompileEditor ∷ Effect (ReactComponent {})
26+mkCompileEditor = do
27+ editor <- mkEditor
28+ card <- mkCard
29+ button <- mkButton
30+ component "StorybookEditor" \{} -> React.do
31+ editorRef <- useRef null
32+ compileResult /\ modifyCompileResult <- useState ""
33+ let
34+ setCompileResult = modifyCompileResult <<< const
35+ pure
36+ $ fragment
37+ [ element button
38+ { buttonType: PlainButton
39+ , children: [ R.text "Compile"]
40+ , buttonProps:
41+ { onClick:
42+ handler_ do
43+ maybeEditor <- (readRefMaybe editorRef)
44+ for_ maybeEditor \ed -> do
45+ code <- getValue ed
46+ launchAff_ do
47+ res <- compile { code }
48+ res2 <- run
49+ setCompileResult res2.stdout # liftEffect
50+ }
51+ }
52+ , element card { children: [ R.text compileResult ] }
53+ , R.div { children: [ element editor { editorRef } ], style: css { height: "100%" } }
54+ ]
55+
56+fetch ∷ M.Fetch
57+fetch = M.fetch windowFetch
58+
59+compile ∷ Body.CompileRequest -> Aff Body.CompileResult
60+compile body = do
61+ fetch (M.URL "/api/compile")
62+ { method: M.postMethod
63+ , body: writeJSON body
64+ , headers: M.makeHeaders { "Content-Type": "application/json" }
65+ }
66+ >>= M.json
67+ >>= readAff
68+
69+run ∷ Aff Body.RunResult
70+run = do
71+ fetch (M.URL "/api/run")
72+ { method: M.postMethod }
73+ >>= M.json
74+ >>= readAff