@@ -83,13 +83,15 @@ type DomCoreWidget x = PostBuildT DomTimeline (WithJSContextSingleton x (Perform
8383--TODO: Rename
8484{-# INLINABLE attachWidget''' #-}
8585attachWidget'''
86− :: (EventChannel -> PerformEventT DomTimeline DomHost (IORef (Maybe (EventTrigger DomTimeline ()))))
86+ :: IORef Bool
87+ -> (EventChannel -> PerformEventT DomTimeline DomHost (IORef (Maybe (EventTrigger DomTimeline ()))))
8788 -> IO ()
88−attachWidget''' w = runDomHost $ do
89+attachWidget''' hydration w = runDomHost $ do
8990 events <- liftIO newChan
9091 (postBuildTriggerRef, fc@(FireCommand fire)) <- hostPerformEventT $ w events
9192 mPostBuildTrigger <- readRef postBuildTriggerRef
9293 forM_ mPostBuildTrigger $ \postBuildTrigger -> fire [postBuildTrigger :=> Identity ()] $ return ()
94+ liftIO $ writeIORef hydration False
9395 liftIO $ processAsyncEvents events fc
9496
9597--TODO: This is a collection of random stuff; we should make it make some more sense and then upstream to reflex-dom-core
@@ -101,33 +103,30 @@ runWithHeadAndBody
101103 -> JSM ()
102104runWithHeadAndBody app = withJSContextSingletonMono $ \jsSing -> do
103105 globalDoc <- currentDocumentUnchecked
104− headFragment <- createDocumentFragment globalDoc
105− bodyFragment <- createDocumentFragment globalDoc
106+ headElement <- getHeadUnchecked globalDoc
107+ bodyElement <- getBodyUnchecked globalDoc
106108 unreadyChildren <- liftIO $ newIORef 0
107− let commit = do
108− headElement <- getHeadUnchecked globalDoc
109− bodyElement <- getBodyUnchecked globalDoc
110− void $ inAnimationFrame' $ \_ -> do
111− replaceElementContents headElement headFragment
112− replaceElementContents bodyElement bodyFragment
113− liftIO $ attachWidget''' $ \events -> flip runWithJSContextSingleton jsSing $ do
109+ hydration <- liftIO $ newIORef True
110+ liftIO $ attachWidget''' hydration $ \events -> flip runWithJSContextSingleton jsSing $ do
114111 (postBuild, postBuildTriggerRef) <- newEventWithTriggerRef
115− let appendImmediateDom :: DOM.DocumentFragment -> Widget' () c -> FloatingWidget () c
116− appendImmediateDom df w = do
112+ let appendImmediateDom :: DOM.Node -> Widget' () c -> FloatingWidget () c
113+ appendImmediateDom n w = do
114+ hydrationNode <- liftIO $ newIORef Nothing
117115 events' <- TriggerEvent.askEvents
118116 lift $ do
119− doc <- getOwnerDocumentUnchecked df
120117 let builderEnv = ImmediateDomBuilderEnv
121− { _immediateDomBuilderEnv_document = doc
122− , _immediateDomBuilderEnv_parent = toNode df
118+ { _immediateDomBuilderEnv_document = globalDoc
119+ , _immediateDomBuilderEnv_parent = toNode n
123120 , _immediateDomBuilderEnv_unreadyChildren = unreadyChildren
124− , _immediateDomBuilderEnv_commitAction = commit
121+ , _immediateDomBuilderEnv_commitAction = pure ()
122+ , _immediateDomBuilderEnv_hydrating = hydration
123+ , _immediateDomBuilderEnv_hydrationNode = hydrationNode
125124 }
126125 runImmediateDomBuilderT w builderEnv events'
127− flip runPostBuildT postBuild $ flip runTriggerEventT events $ app (appendImmediateDom headFragment) (appendImmediateDom bodyFragment)
128− liftIO (readIORef unreadyChildren) >>= \case
129− 0 -> DOM.liftJSM commit
130− _ -> return ()
126+ flip runPostBuildT postBuild $ flip runTriggerEventT events $ app (appendImmediateDom $ toNode headElement) (appendImmediateDom $ toNode bodyElement)
127+-- liftIO (readIORef unreadyChildren) >>= \case
128+-- 0 -> DOM.liftJSM commit
129+-- _ -> return ()
131130 return postBuildTriggerRef
132131
133132runFrontend :: forall backendRoute route. Encoder Identity Identity (R (Sum backendRoute (ObeliskRoute route))) PageName -> Frontend (R route) -> JSM ()