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