module Halogen.IO.Util where
import HPrelude
import Halogen.VDom.DOM.Monad
import Web.DOM.Internal.Types
import Web.DOM.ParentNode
import Web.HTML.Event.EventTypes qualified as ET
import Web.HTML.HTMLDocument qualified as HTMLDocument
import Web.HTML.HTMLDocument.ReadyState
awaitLoad :: (MonadDOM m, MonadIO m) => m ()
awaitLoad :: forall (m :: * -> *). (MonadDOM m, MonadIO m) => m ()
awaitLoad = do
rs <- HTMLDocument -> m ReadyState
forall (m :: * -> *). MonadDOM m => HTMLDocument -> m ReadyState
readyState (HTMLDocument -> m ReadyState) -> m HTMLDocument -> m ReadyState
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Window -> m HTMLDocument
forall (m :: * -> *). MonadDOM m => Window -> m HTMLDocument
document (Window -> m HTMLDocument) -> m Window -> m HTMLDocument
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m Window
forall (m :: * -> *). MonadDOM m => m Window
window
mvar <- liftIO newEmptyMVar
case rs of
ReadyState
Loading -> do
et <- Window -> EventTarget
forall a. a -> EventTarget
toEventTarget (Window -> EventTarget) -> m Window -> m EventTarget
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m Window
forall (m :: * -> *). MonadDOM m => m Window
window
listener <- mkEventListener (const $ liftIO $ putMVar mvar ())
addEventListener ET.domcontentloaded listener et
liftIO $ takeMVar mvar
removeEventListener ET.domcontentloaded listener et
ReadyState
_ -> m ()
forall (f :: * -> *). Applicative f => f ()
pass
awaitBody :: (MonadDOM m, MonadIO m) => m HTMLElement
awaitBody :: forall (m :: * -> *). (MonadDOM m, MonadIO m) => m HTMLElement
awaitBody = do
m ()
forall (m :: * -> *). (MonadDOM m, MonadIO m) => m ()
awaitLoad
body <- QuerySelector -> m (Maybe HTMLElement)
forall (m :: * -> *).
MonadDOM m =>
QuerySelector -> m (Maybe HTMLElement)
selectElement (Text -> QuerySelector
QuerySelector Text
"body")
maybe (panic "Could not find body") pure body
selectElement :: (MonadDOM m) => QuerySelector -> m (Maybe HTMLElement)
selectElement :: forall (m :: * -> *).
MonadDOM m =>
QuerySelector -> m (Maybe HTMLElement)
selectElement QuerySelector
query = do
mel <- (QuerySelector -> ParentNode -> m (Maybe Element)
forall (m :: * -> *).
MonadDOM m =>
QuerySelector -> ParentNode -> m (Maybe Element)
querySelector QuerySelector
query (ParentNode -> m (Maybe Element))
-> (HTMLDocument -> ParentNode)
-> HTMLDocument
-> m (Maybe Element)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. HTMLDocument -> ParentNode
HTMLDocument.toParentNode (HTMLDocument -> m (Maybe Element))
-> (Window -> m HTMLDocument) -> Window -> m (Maybe Element)
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< Window -> m HTMLDocument
forall (m :: * -> *). MonadDOM m => Window -> m HTMLDocument
document) (Window -> m (Maybe Element)) -> m Window -> m (Maybe Element)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< m Window
forall (m :: * -> *). MonadDOM m => m Window
window
pure $ fromElement =<< mel