@@ -38,6 +38,8 @@ module Reflex.Dom.Builder.Hydration
38 , HydrationRunnerT (..)
38 , HydrationRunnerT (..)
39 , runHydrationRunnerT
39 , runHydrationRunnerT
40 , DOM(..), runDOMForest
40 , DOM(..), runDOMForest
41 , runHydrationDomBuilderT
43 , runHydrationDomBuilderT
42 , askParent
44 , askParent
43 , askEvents
45 , askEvents
@@ -399,6 +401,10 @@ getPreviousNode = HydrationRunnerT get
399setPreviousNode :: Monad m => Maybe DOM.Node -> HydrationRunnerT t m ()
401setPreviousNode :: Monad m => Maybe DOM.Node -> HydrationRunnerT t m ()
400setPreviousNode = HydrationRunnerT . put
402setPreviousNode = HydrationRunnerT . put
404+{-# INLINABLE getPrerenderDepth #-}
405+getPrerenderDepth :: MonadIO m => HydrationDomBuilderT t m Word
406+getPrerenderDepth = liftIO . readIORef =<< HydrationDomBuilderT (asks _hydrationDomBuilderEnv_prerenderDepth)
402{-# INLINABLE getParent #-}
408{-# INLINABLE getParent #-}
403getParent :: MonadIO m => HydrationDomBuilderT t m DOM.Node
409getParent :: MonadIO m => HydrationDomBuilderT t m DOM.Node
404getParent = liftIO . readIORef =<< HydrationDomBuilderT (asks _hydrationDomBuilderEnv_parent)
410getParent = liftIO . readIORef =<< HydrationDomBuilderT (asks _hydrationDomBuilderEnv_parent)
@@ -437,8 +443,8 @@ makeNodeInternal mkNode = do
437-- @check@. The previous node reference is also updated.
443-- @check@. The previous node reference is also updated.
438hydrateNode
444hydrateNode
439 :: (MonadJSM m, IsNode node, Typeable node)
445 :: (MonadJSM m, IsNode node, Typeable node)
440− => (node -> HydrationRunnerT t m Bool) -> HydrationRunnerT t m node -> (DOM.JSVal -> node) -> HydrationRunnerT t m node
446+ => (node -> HydrationRunnerT t m Bool) -> (DOM.JSVal -> node) -> HydrationRunnerT t m node
441−hydrateNode check mkNode constructor = do
447+hydrateNode check constructor = do
442 parent <- askParent
448 parent <- askParent
443 liftIO $ putStr $ show (typeRep constructor) <> ": "
449 liftIO $ putStr $ show (typeRep constructor) <> ": "
444 lastHydrationNode <- getPreviousNode
450 lastHydrationNode <- getPreviousNode
@@ -587,7 +593,6 @@ makeElement elementTag cfg child = do
587 writeChan events [EventTriggerRef ref :=> TriggerInvocation v (return ())])
593 writeChan events [EventTriggerRef ref :=> TriggerInvocation v (return ())])
588 getHydrationMode >>= \case
594 getHydrationMode >>= \case
589 HydrationMode_Immediate -> do
595 HydrationMode_Immediate -> do
590− -- TODO: prerender needs completely replacing
591 e <- makeNodeInternal buildElement
596 e <- makeNodeInternal buildElement
592 p <- liftIO $ newIORef $ toNode e
597 p <- liftIO $ newIORef $ toNode e
593 -- Run the child builder with updated parent and previous sibling references
598 -- Run the child builder with updated parent and previous sibling references
@@ -603,8 +608,15 @@ makeElement elementTag cfg child = do
603 let env' = env { _hydrationDomBuilderEnv_parent = parent}
608 let env' = env { _hydrationDomBuilderEnv_parent = parent}
604 (result, childDom) <- HydrationDomBuilderT $ lift $ lift $ runStateT (runReaderT (unHydrationDomBuilderT child) env') []
609 (result, childDom) <- HydrationDomBuilderT $ lift $ lift $ runStateT (runReaderT (unHydrationDomBuilderT child) env') []
605 wrapResult <- liftIO newEmptyMVar
610 wrapResult <- liftIO newEmptyMVar
611+ prerenderDepth <- getPrerenderDepth
606 let activateElement = do
612 let activateElement = do
613+ e <- case prerenderDepth of
607− e <- hydrateNode hasSSRAttribute buildElement DOM.Element
614+ 0 -> hydrateNode hasSSRAttribute DOM.Element
617+ maybe (askParent >>= \p -> Node.appendChild_ p e) (insertAfter e) =<< getPreviousNode
618+ setPreviousNode $ Just $ toNode e
608 -- Update the parent node used by the children
620 -- Update the parent node used by the children
609 liftIO $ writeIORef parent $ toNode e
621 liftIO $ writeIORef parent $ toNode e
610 -- Setup events, store the result so we can wait on it later
622 -- Setup events, store the result so we can wait on it later
@@ -644,12 +656,16 @@ textNodeInternal !t mSetContents = getHydrationMode >>= \case
645 HydrationMode_Hydrating -> do
657 HydrationMode_Hydrating -> do
646 doc <- askDocument
658 doc <- askDocument
659+ prerenderDepth <- getPrerenderDepth
647 let activateText = do
660 let activateText = do
648 liftIO $ putStrLn $ "Action: Text: " <> show (DOM.toJSString t)
661 liftIO $ putStrLn $ "Action: Text: " <> show (DOM.toJSString t)
662+ n <- case prerenderDepth of
649− n <- hydrateNode (const $ pure True) (createTextNode doc t) DOM.Text
663+ 0 -> hydrateNode (const $ pure True) DOM.Text
650− --case mSetContents of
664+ _ -> do
651− -- Nothing -> liftIO $ putStrLn "No update events for text"
665+ tn <- createTextNode doc t
652− -- Just e -> requestDomAction_ $ setNodeValue n . Just <$> e
666+ maybe (askParent >>= \p -> Node.appendChild_ p tn) (insertAfter tn) =<< getPreviousNode
667+ setPreviousNode $ Just $ toNode tn
653 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
669 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
654 hydrateDOM $ DOM_Node activateText
670 hydrateDOM $ DOM_Node activateText
655 pure $ error "textNodeInternal: DOM.Text"
671 pure $ error "textNodeInternal: DOM.Text"
@@ -663,9 +679,16 @@ commentNodeInternal !t mSetContents = getHydrationMode >>= \case
664 HydrationMode_Hydrating -> do
680 HydrationMode_Hydrating -> do
665 doc <- askDocument
681 doc <- askDocument
682+ prerenderDepth <- getPrerenderDepth
666 let activateComment = do
683 let activateComment = do
667 liftIO $ putStrLn $ "Action: Comment: " <> show (DOM.toJSString t)
684 liftIO $ putStrLn $ "Action: Comment: " <> show (DOM.toJSString t)
685+ n <- case prerenderDepth of
668− n <- hydrateNode (const $ pure True) (createComment doc t) DOM.Comment
686+ 0 -> hydrateNode (const $ pure True) DOM.Comment
688+ tn <- createComment doc t
689+ maybe (askParent >>= \p -> Node.appendChild_ p tn) (insertAfter tn) =<< getPreviousNode
690+ setPreviousNode $ Just $ toNode tn
669 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
692 mapM_ (requestDomAction_ . fmap (setNodeValue n . Just)) mSetContents
670 hydrateDOM $ DOM_Node activateComment
693 hydrateDOM $ DOM_Node activateComment
671 pure $ error "commentNodeInternal: DOM.Comment"
694 pure $ error "commentNodeInternal: DOM.Comment"