Skip to content

Commit

Permalink
hydration: allow access to actual RawElement
Browse files Browse the repository at this point in the history
  • Loading branch information
ali-abrar committed Aug 23, 2023
1 parent 39195af commit 9981f72
Showing 1 changed file with 25 additions and 18 deletions.
43 changes: 25 additions & 18 deletions reflex-dom-core/src/Reflex/Dom/Builder/Immediate.hs
Original file line number Diff line number Diff line change
Expand Up @@ -766,8 +766,8 @@ elementInternal
-> HydrationDomBuilderT HydrationDomSpace t m (Element er HydrationDomSpace t, a)
elementInternal elementTag cfg child = getHydrationMode >>= \case
HydrationMode_Immediate -> do
(Element es _, result) <- elementImmediate elementTag cfg child
return (Element es (), result)
(Element es raw, result) <- elementImmediate elementTag cfg child
return (Element es raw, result)
HydrationMode_Hydrating -> fst <$> hydrateElement elementTag cfg child

{-# SPECIALIZE elementInternal
Expand Down Expand Up @@ -870,7 +870,8 @@ hydrateElement elementTag cfg child = do
tryReadMVar cleanup >>= \case
Nothing -> killThread threadId
Just c -> c
return ((Element es (), result), e')
e <- liftIO $ readIORef e'
return ((Element es e, result), e')

{-# SPECIALIZE hydrateElement
:: Text
Expand Down Expand Up @@ -940,8 +941,8 @@ inputElementInternal
=> InputElementConfig er t HydrationDomSpace -> HydrationDomBuilderT HydrationDomSpace t m (InputElement er HydrationDomSpace t)
inputElementInternal cfg = getHydrationMode >>= \case
HydrationMode_Immediate -> ffor (inputElementImmediate cfg) $ \result -> result
{ _inputElement_element = Element (_element_events $ _inputElement_element result) ()
, _inputElement_raw = ()
{ _inputElement_element = Element (_element_events $ _inputElement_element result) (_element_raw $ _inputElement_element result)
, _inputElement_raw = _inputElement_raw result
}
HydrationMode_Hydrating -> do
((e, _), domElementRef) <- hydrateElement "input" (cfg ^. inputElementConfig_elementConfig) $ return ()
Expand Down Expand Up @@ -1029,7 +1030,7 @@ inputElementInternal cfg = getHydrationMode >>= \case
, _inputElement_input = valueChangedByUI
, _inputElement_hasFocus = hasFocus
, _inputElement_element = e
, _inputElement_raw = ()
, _inputElement_raw = DOM.uncheckedCastTo DOM.HTMLInputElement $ _element_raw e
, _inputElement_files = files
}

Expand Down Expand Up @@ -1071,8 +1072,8 @@ textAreaElementInternal
=> TextAreaElementConfig er t HydrationDomSpace -> HydrationDomBuilderT HydrationDomSpace t m (TextAreaElement er HydrationDomSpace t)
textAreaElementInternal cfg = getHydrationMode >>= \case
HydrationMode_Immediate -> ffor (textAreaElementImmediate cfg) $ \result -> result
{ _textAreaElement_element = Element (_element_events $ _textAreaElement_element result) ()
, _textAreaElement_raw = ()
{ _textAreaElement_element = Element (_element_events $ _textAreaElement_element result) (_element_raw $ _textAreaElement_element result)
, _textAreaElement_raw = _textAreaElement_raw result
}
HydrationMode_Hydrating -> do
((e, _), domElementRef) <- hydrateElement "textarea" (cfg ^. textAreaElementConfig_elementConfig) $ return ()
Expand Down Expand Up @@ -1121,7 +1122,7 @@ textAreaElementInternal cfg = getHydrationMode >>= \case
, _textAreaElement_input = valueChangedByUI
, _textAreaElement_hasFocus = hasFocus
, _textAreaElement_element = e
, _textAreaElement_raw = ()
, _textAreaElement_raw = DOM.uncheckedCastTo DOM.HTMLTextAreaElement $ _element_raw e
}

{-# INLINE selectElementImmediate #-}
Expand Down Expand Up @@ -1166,8 +1167,8 @@ selectElementInternal
-> HydrationDomBuilderT HydrationDomSpace t m (SelectElement er HydrationDomSpace t, a)
selectElementInternal cfg child = getHydrationMode >>= \case
HydrationMode_Immediate -> ffor (selectElementImmediate cfg child) $ \(e, result) -> (e
{ _selectElement_element = Element (_element_events $ _selectElement_element e) ()
, _selectElement_raw = ()
{ _selectElement_element = Element (_element_events $ _selectElement_element e) $ _element_raw $ _selectElement_element e
, _selectElement_raw = _selectElement_raw e
}, result)
HydrationMode_Hydrating -> do
((e, result), domElementRef) <- hydrateElement "select" (cfg ^. selectElementConfig_elementConfig) child
Expand Down Expand Up @@ -1209,7 +1210,7 @@ selectElementInternal cfg child = getHydrationMode >>= \case
, _selectElement_change = valueChangedByUI
, _selectElement_hasFocus = hasFocus
, _selectElement_element = e
, _selectElement_raw = ()
, _selectElement_raw = DOM.uncheckedCastTo DOM.HTMLSelectElement $ _element_raw e
}

{-# INLINE textNodeImmediate #-}
Expand Down Expand Up @@ -1423,10 +1424,10 @@ instance DomSpace HydrationDomSpace where
type RawDocument HydrationDomSpace = DOM.Document
type RawTextNode HydrationDomSpace = ()
type RawCommentNode HydrationDomSpace = ()
type RawElement HydrationDomSpace = ()
type RawInputElement HydrationDomSpace = ()
type RawTextAreaElement HydrationDomSpace = ()
type RawSelectElement HydrationDomSpace = ()
type RawElement HydrationDomSpace = DOM.Element
type RawInputElement HydrationDomSpace = DOM.HTMLInputElement
type RawTextAreaElement HydrationDomSpace = DOM.HTMLTextAreaElement
type RawSelectElement HydrationDomSpace = DOM.HTMLSelectElement
addEventSpecFlags _ en f es = es
{ _ghcjsEventSpec_filters =
let f' = Just . GhcjsEventFilter . \case
Expand Down Expand Up @@ -1455,8 +1456,14 @@ instance SupportsHydrationDomBuilder t m => DomBuilder t (HydrationDomBuilderT H
textAreaElement = textAreaElementInternal
{-# INLINABLE selectElement #-}
selectElement = selectElementInternal
placeRawElement () = pure ()
wrapRawElement () _cfg = pure $ Element (EventSelector $ const never) ()
placeRawElement _ = pure ()
wrapRawElement e rawCfg = do
events <- askEvents
ctx <- askJSM
eventTriggerRefs <- wrap events e rawCfg
es <- newFanEventWithTrigger $ triggerBody ctx rawCfg events eventTriggerRefs e
pure $ Element es e


instance SupportsHydrationDomBuilder t m => DomBuilder t (HydrationDomBuilderT GhcjsDomSpace t m) where
type DomBuilderSpace (HydrationDomBuilderT GhcjsDomSpace t m) = GhcjsDomSpace
Expand Down

0 comments on commit 9981f72

Please sign in to comment.