@@ -193,12 +193,8 @@ addHydrationStepWithSetup setup f = getHydrationMode >>= \case
193 HydrationDomBuilderT $ modify' (>> f s)
193 HydrationDomBuilderT $ modify' (>> f s)
195-- | Add a hydration step
195-- | Add a hydration step
197− :: (MonadIO m, Ref m ~ IORef, MonadRef m, PerformEvent t m, MonadFix m, MonadReflexCreateTrigger t m, MonadJSM m, MonadJSM (Performable m))
198− => HydrationRunnerT t m () -> HydrationDomBuilderT t m ()
196+addHydrationStep :: Monad m => HydrationRunnerT t m () -> HydrationDomBuilderT t m ()
199−addHydrationStep m = getHydrationMode >>= \case
200− HydrationMode_Immediate -> lift . runHydrationRunnerT m Nothing undefined =<< askEvents
201− HydrationMode_Hydrating -> HydrationDomBuilderT $ modify' (>> m)
197+addHydrationStep m = HydrationDomBuilderT $ modify' (>> m)
203-- | A monad for DomBuilder which just gets the results of children and pushes
199-- | A monad for DomBuilder which just gets the results of children and pushes
204-- work into an action that is delayed until after postBuild (to match the
200-- work into an action that is delayed until after postBuild (to match the
@@ -679,49 +675,53 @@ instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT
680 -- Expected initial value from config
676 -- Expected initial value from config
681 let v0 = _inputElementConfig_initialValue cfg
677 let v0 = _inputElementConfig_initialValue cfg
682−
678+ impl :: (DomRenderHook t n, MonadJSM n) => n ()
683− addHydrationStep $ do
679+ impl = do
684− domElement <- liftIO $ readIORef domElementRef
680+ domElement <- liftIO $ readIORef domElementRef
685− let domInputElement = uncheckedCastTo DOM.HTMLInputElement domElement
681+ let domInputElement = uncheckedCastTo DOM.HTMLInputElement domElement
686− getValue = Input.getValue domInputElement
682+ getValue = Input.getValue domInputElement
688− -- The browser might have messed with the value, or the user could have
684+ -- The browser might have messed with the value, or the user could have
689− -- altered it before activation, so we set it if it isn't what we expect
685+ -- altered it before activation, so we set it if it isn't what we expect
690− liftJSM getValue >>= \v0' -> do
686+ liftJSM getValue >>= \v0' -> do
691− when (v0' /= v0) $ liftIO $ triggerChangeByUI v0'
687+ when (v0' /= v0) $ liftIO $ triggerChangeByUI v0'
693− -- Watch for user interaction and trigger event accordingly
689+ -- Watch for user interaction and trigger event accordingly
694− requestDomAction_ $ (liftJSM getValue >>= liftIO . triggerChangeByUI) <$ Reflex.select (_element_events e) (WrapArg Input)
690+ requestDomAction_ $ (liftJSM getValue >>= liftIO . triggerChangeByUI) <$ Reflex.select (_element_events e) (WrapArg Input)
696− for_ (_inputElementConfig_setValue cfg) $ \eSetValue ->
692+ for_ (_inputElementConfig_setValue cfg) $ \eSetValue ->
697− requestDomAction_ $ ffor eSetValue $ \v' -> do
693+ requestDomAction_ $ ffor eSetValue $ \v' -> do
698− Input.setValue domInputElement v'
694+ Input.setValue domInputElement v'
699− v <- getValue -- We get the value after setting it in case the browser has mucked with it somehow
695+ v <- getValue -- We get the value after setting it in case the browser has mucked with it somehow
700− liftIO $ triggerChangeBySetValue v
696+ liftIO $ triggerChangeBySetValue v
702− let focusChange' = leftmost
698+ let focusChange' = leftmost
703− [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
699+ [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
704− , True <$ Reflex.select (_element_events e) (WrapArg Focus)
700+ , True <$ Reflex.select (_element_events e) (WrapArg Focus)
706− liftIO . triggerFocusChange =<< Node.isSameNode (toNode domElement) . fmap toNode =<< Document.getActiveElement doc
702+ liftIO . triggerFocusChange =<< Node.isSameNode (toNode domElement) . fmap toNode =<< Document.getActiveElement doc
707− requestDomAction_ $ liftIO . triggerFocusChange <$> focusChange'
703+ requestDomAction_ $ liftIO . triggerFocusChange <$> focusChange'
709− Input.setChecked domInputElement $ _inputElementConfig_initialChecked cfg
705+ Input.setChecked domInputElement $ _inputElementConfig_initialChecked cfg
710− _ <- liftJSM $ domInputElement `on` Events.click $ do
706+ _ <- liftJSM $ domInputElement `on` Events.click $ do
711− liftIO . triggerCheckedChangedByUI =<< Input.getChecked domInputElement
707+ liftIO . triggerCheckedChangedByUI =<< Input.getChecked domInputElement
713− for_ (_inputElementConfig_setChecked cfg) $ \eNewchecked ->
709+ for_ (_inputElementConfig_setChecked cfg) $ \eNewchecked ->
714− requestDomAction $ ffor eNewchecked $ \newChecked -> do
710+ requestDomAction $ ffor eNewchecked $ \newChecked -> do
715− oldChecked <- Input.getChecked domInputElement
711+ oldChecked <- Input.getChecked domInputElement
716− Input.setChecked domInputElement newChecked
712+ Input.setChecked domInputElement newChecked
717− when (newChecked /= oldChecked) $ liftIO $ triggerCheckedChangedBySetChecked newChecked
713+ when (newChecked /= oldChecked) $ liftIO $ triggerCheckedChangedBySetChecked newChecked
719− _ <- liftJSM $ domInputElement `on` Events.change $ do
715+ _ <- liftJSM $ domInputElement `on` Events.change $ do
720− mfiles <- Input.getFiles domInputElement
716+ mfiles <- Input.getFiles domInputElement
721− let getMyFiles xs = fmap catMaybes . mapM (FileList.item xs) . flip take [0..] . fromIntegral =<< FileList.getLength xs
717+ let getMyFiles xs = fmap catMaybes . mapM (FileList.item xs) . flip take [0..] . fromIntegral =<< FileList.getLength xs
722− liftIO . triggerFileChange =<< maybe (return []) getMyFiles mfiles
718+ liftIO . triggerFileChange =<< maybe (return []) getMyFiles mfiles
724− return ()
720+ return ()
722+ getHydrationMode >>= \case
723+ HydrationMode_Hydrating -> addHydrationStep impl
724+ HydrationMode_Immediate -> impl
726 checked' <- holdDyn (_inputElementConfig_initialChecked cfg) $ leftmost
726 checked' <- holdDyn (_inputElementConfig_initialChecked cfg) $ leftmost
727 [ checkedChangedBySetChecked
727 [ checkedChangedBySetChecked
@@ -763,32 +763,36 @@ instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT
764 -- Expected initial value from config
764 -- Expected initial value from config
765 let v0 = _textAreaElementConfig_initialValue cfg
765 let v0 = _textAreaElementConfig_initialValue cfg
766−
766+ impl :: (DomRenderHook t n, MonadJSM n) => n ()
767− addHydrationStep $ do
767+ impl = do
768− domElement <- liftIO $ readIORef domElementRef
768+ domElement <- liftIO $ readIORef domElementRef
769− let domTextAreaElement = uncheckedCastTo DOM.HTMLTextAreaElement domElement
769+ let domTextAreaElement = uncheckedCastTo DOM.HTMLTextAreaElement domElement
770− getValue = TextArea.getValue domTextAreaElement
770+ getValue = TextArea.getValue domTextAreaElement
772− -- The browser might have messed with the value, or the user could have
772+ -- The browser might have messed with the value, or the user could have
773− -- altered it before activation, so we set it if it isn't what we expect
773+ -- altered it before activation, so we set it if it isn't what we expect
774− liftJSM getValue >>= \v0' -> do
774+ liftJSM getValue >>= \v0' -> do
775− when (v0' /= v0) $ liftIO $ triggerChangeByUI v0'
775+ when (v0' /= v0) $ liftIO $ triggerChangeByUI v0'
777− -- Watch for user interaction and trigger event accordingly
777+ -- Watch for user interaction and trigger event accordingly
778− requestDomAction_ $ (liftJSM getValue >>= liftIO . triggerChangeByUI) <$ Reflex.select (_element_events e) (WrapArg Input)
778+ requestDomAction_ $ (liftJSM getValue >>= liftIO . triggerChangeByUI) <$ Reflex.select (_element_events e) (WrapArg Input)
780− for_ (_textAreaElementConfig_setValue cfg) $ \eSetValue ->
780+ for_ (_textAreaElementConfig_setValue cfg) $ \eSetValue ->
781− requestDomAction_ $ ffor eSetValue $ \v' -> do
781+ requestDomAction_ $ ffor eSetValue $ \v' -> do
782− TextArea.setValue domTextAreaElement v'
782+ TextArea.setValue domTextAreaElement v'
783− v <- getValue -- We get the value after setting it in case the browser has mucked with it somehow
783+ v <- getValue -- We get the value after setting it in case the browser has mucked with it somehow
784− liftIO $ triggerChangeBySetValue v
784+ liftIO $ triggerChangeBySetValue v
786− let focusChange' = leftmost
786+ let focusChange' = leftmost
787− [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
787+ [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
788− , True <$ Reflex.select (_element_events e) (WrapArg Focus)
788+ , True <$ Reflex.select (_element_events e) (WrapArg Focus)
790− liftIO . triggerFocusChange =<< Node.isSameNode (toNode domElement) . fmap toNode =<< Document.getActiveElement doc
790+ liftIO . triggerFocusChange =<< Node.isSameNode (toNode domElement) . fmap toNode =<< Document.getActiveElement doc
791− requestDomAction_ $ liftIO . triggerFocusChange <$> focusChange'
791+ requestDomAction_ $ liftIO . triggerFocusChange <$> focusChange'
793+ getHydrationMode >>= \case
794+ HydrationMode_Hydrating -> addHydrationStep impl
795+ HydrationMode_Immediate -> impl
793 let initialFocus = False -- Assume it isn't focused, but we update the actual focus state at switchover
797 let initialFocus = False -- Assume it isn't focused, but we update the actual focus state at switchover
794 hasFocus <- holdUniqDyn =<< holdDyn initialFocus focusChange
798 hasFocus <- holdUniqDyn =<< holdDyn initialFocus focusChange
@@ -819,32 +823,36 @@ instance (SupportsHydrationDomBuilder t m) => DomBuilder t (HydrationDomBuilderT
820 -- Expected initial value from config
824 -- Expected initial value from config
821 let v0 = _selectElementConfig_initialValue cfg
825 let v0 = _selectElementConfig_initialValue cfg
822−
826+ impl :: (DomRenderHook t n, MonadJSM n) => n ()
823− addHydrationStep $ do
827+ impl = do
824− domElement <- liftIO $ readIORef domElementRef
828+ domElement <- liftIO $ readIORef domElementRef
825− let domSelectElement = uncheckedCastTo DOM.HTMLSelectElement domElement
829+ let domSelectElement = uncheckedCastTo DOM.HTMLSelectElement domElement
826− getValue = Select.getValue domSelectElement
830+ getValue = Select.getValue domSelectElement
828− -- The browser might have messed with the value, or the user could have
832+ -- The browser might have messed with the value, or the user could have
829− -- altered it before activation, so we set it if it isn't what we expect
833+ -- altered it before activation, so we set it if it isn't what we expect
830− liftJSM getValue >>= \v0' -> do
834+ liftJSM getValue >>= \v0' -> do
831− when (v0' /= v0) $ liftIO $ triggerChangeByUI v0'
835+ when (v0' /= v0) $ liftIO $ triggerChangeByUI v0'
833− -- Watch for user interaction and trigger event accordingly
837+ -- Watch for user interaction and trigger event accordingly
834− requestDomAction_ $ (liftJSM getValue >>= liftIO . triggerChangeByUI) <$ Reflex.select (_element_events e) (WrapArg Change)
838+ requestDomAction_ $ (liftJSM getValue >>= liftIO . triggerChangeByUI) <$ Reflex.select (_element_events e) (WrapArg Change)
836− for_ (_selectElementConfig_setValue cfg) $ \eSetValue ->
840+ for_ (_selectElementConfig_setValue cfg) $ \eSetValue ->
837− requestDomAction_ $ ffor eSetValue $ \v' -> do
841+ requestDomAction_ $ ffor eSetValue $ \v' -> do
838− Select.setValue domSelectElement v'
842+ Select.setValue domSelectElement v'
839− v <- getValue -- We get the value after setting it in case the browser has mucked with it somehow
843+ v <- getValue -- We get the value after setting it in case the browser has mucked with it somehow
840− liftIO $ triggerChangeBySetValue v
844+ liftIO $ triggerChangeBySetValue v
842− let focusChange' = leftmost
846+ let focusChange' = leftmost
843− [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
847+ [ False <$ Reflex.select (_element_events e) (WrapArg Blur)
844− , True <$ Reflex.select (_element_events e) (WrapArg Focus)
848+ , True <$ Reflex.select (_element_events e) (WrapArg Focus)
846− liftIO . triggerFocusChange =<< Node.isSameNode (toNode domElement) . fmap toNode =<< Document.getActiveElement doc
850+ liftIO . triggerFocusChange =<< Node.isSameNode (toNode domElement) . fmap toNode =<< Document.getActiveElement doc
847− requestDomAction_ $ liftIO . triggerFocusChange <$> focusChange'
851+ requestDomAction_ $ liftIO . triggerFocusChange <$> focusChange'
853+ getHydrationMode >>= \case
854+ HydrationMode_Hydrating -> addHydrationStep impl
855+ HydrationMode_Immediate -> impl
849 let initialFocus = False -- Assume it isn't focused, but we update the actual focus state at switchover
857 let initialFocus = False -- Assume it isn't focused, but we update the actual focus state at switchover
850 hasFocus <- holdUniqDyn =<< holdDyn initialFocus focusChange
858 hasFocus <- holdUniqDyn =<< holdDyn initialFocus focusChange