@@ -1,11 +1,13 @@
11module PSLayout where
22
33import Prelude
4+
45import Data.Array as A
56import Data.Array as Array
67import Data.Array.NonEmpty as NEA
7−import Data.Maybe (Maybe(..), fromMaybe)
8−import Data.Nullable (Nullable)
8+import Data.Function.Uncurried (mkFn2)
9+import Data.Maybe (Maybe(..), fromMaybe, isJust)
10+import Data.Nullable (Nullable, toMaybe)
911import Data.Nullable as Nullable
1012import Data.String as String
1113import Data.Tuple.Nested ((/\))
@@ -14,7 +16,7 @@ import Effect (Effect)
1416import JSS (jss, jssClasses)
1517import Justifill (justifill)
1618import Milkis.Impl (FetchImpl)
17−import React.Basic (JSX, ReactComponent)
19+import React.Basic (JSX, ReactComponent, fragment)
1820import React.Basic.DOM (unsafeCreateDOMComponent)
1921import React.Basic.DOM as R
2022import React.Basic.Helpers (jsx)
@@ -24,8 +26,9 @@ import Unsafe.Coerce (unsafeCoerce)
2426import Yoga.Box.Component as Box
2527import Yoga.CompileEditor.Component (mkCompileEditor)
2628import Yoga.Compiler.Api (apiCompiler)
29+import Yoga.Compiler.Types (Compiler)
2730import Yoga.FillInTheGaps.Component as FillInTheGaps
28−import Yoga.FillInTheGaps.Logic (parseSegments)
31+import Yoga.FillInTheGaps.Logic (complete, parseSegments)
2932import Yoga.Header.Component (mkHeader)
3033import Yoga.Helpers ((?||))
3134import Yoga.InlineCode.Component as InlineCode
@@ -70,7 +73,7 @@ mkLayout ∷
7073 )
7174mkLayout fetchImpl = do
7275 themeProvider <- mkThemeProvider
73− mdxProviderComponent <- mkMdxProviderComponent fetchImpl
76+ mdxProviderComponent <- mkMdxProviderComponent (apiCompiler fetchImpl)
7477 componentWithChildren "MDXLayout" \{ children, siteInfo } -> React.do
7578 pure
7679 $ element themeProvider
@@ -96,16 +99,17 @@ mkSecret = do
9699 }
97100
98101mkMdxProviderComponent ∷
99− FetchImpl ->
102+ ∀ r.
103+ { | Compiler r } ->
100104 Effect
101105 ( ReactComponent
102106 { children ∷ ReactChildren JSX
103107 , siteInfo ∷ SiteQueryResult
104108 }
105109 )
106−mkMdxProviderComponent fetchImpl = do
110+mkMdxProviderComponent compiler = do
107111 cssBaseline <- mkCssBaseline
108− editor <- mkCompileEditor fetchImpl
112+ editor <- mkCompileEditor compiler
109113 fillInTheGaps <- FillInTheGaps.makeComponent
110114 box <- Box.makeComponent
111115 sidebar <- mkSidebar
@@ -132,18 +136,14 @@ mkMdxProviderComponent fetchImpl = do
132136 }
133137 componentWithChildren "MDXProviderComponent" \{ children, siteInfo } -> React.do
134138 classes <- useStyles {}
135− visibleThroughKey /\ updateVisible <- useState ""
139+ visibleThrough /\ updateVisible <- useState 1
136140 let
137141 baseline child = element cssBaseline { kids: child }
138142
139143 kids = reactChildrenToArray children
140144
141145 visibleKids =
142− spy "visibleKids"
143− $ fromMaybe kids do
144− i <- kids # A.findIndex (\x -> (unsafeCoerce x).key == visibleThroughKey)
145− pure $ A.take (i + 1) kids
146−
146+ TODO
147147 siteInfoJSX =
148148 R.div
149149 { children:
@@ -163,13 +163,12 @@ mkMdxProviderComponent fetchImpl = do
163163 , h3:
164164 \props ->
165165 element h { level: H4, text: props.children, className: Nothing }
166+ , hr: (const $ R.hr {})
166167 , p:
167168 \props ->
168169 R.div
169170 { children: [ element p { text: props.children } ]
170171 }
171− -- , thematicBreak:
172− -- \props -> jsx secret { register: updateSections (Map.insert ) }
173172 , inlineCode:
174173 \props -> do
175174 R.span { className: classes.code, children: props.children }
@@ -200,23 +199,35 @@ mkMdxProviderComponent fetchImpl = do
200199 )
201200
202201 language = fromMaybe "" (classNameQ >>= String.stripPrefix (String.Pattern "language-"))
203− case isCode, language of
204− true, "puregaps" ->
205− element fillInTheGaps
206− { initialSegments: parseSegments (codeQ ?|| "")
207− , update: \segs -> pure unit
208− }
209− true, _ ->
202+
203+ segmentsQ = parseSegments (codeQ ?|| "")
204+ case isCode, language, segmentsQ of
205+ true, "purescript", Just initialSegments ->
206+ jsx box {}
207+ [ element fillInTheGaps
208+ { initialSegments
209+ , update:
210+ \segs ->
211+ when (complete segs)
212+ $ updateVisible
213+ (\_ -> spy "setting key to" (unsafeCoerce props).key)
214+ }
215+ ]
216+ true, _, _ ->
210217 element editor
211218 { initialCode: fromMaybe "" codeQ
212219 , height
213220 , language
214221 }
215− false, _ -> element (unsafeCreateDOMComponent "pre") props
222+ false, _, _ -> element (unsafeCreateDOMComponent "pre") props
216223 }
217224 useEffect (A.length kids) do
218225 let
219− firstGaps = kids # A.find (\x -> (unsafeCoerce x).props.mdxType == "pre" && ((unsafeCoerce x).props.children.props.className == "language-puregaps")) <#> (\x -> (unsafeCoerce x).key)
226+ firstGaps = kids # A.find (\x -> (unsafeCoerce x).props.mdxType == "pre" &&
227+ ((unsafeCoerce x).props.children.props.className == "language-purescript") &&
228+ ((unsafeCoerce x).props.children.props.mdxType == "code") &&
229+ ((unsafeCoerce x).props.children.props.children # parseSegments # isJust)
230+ ) <#> (\x -> spy "first boy" $ (unsafeCoerce x).key)
220231
221232 lastKey = kids # A.last # unsafeCoerce # _.key
222233 updateVisible (const (firstGaps ?|| lastKey))