module Util.Dom ( divIfDyn , divIfEvent , divVisibleIf , divClassVisibleIf , getBody ) where import qualified Data.Map as M import Data.Text (Text) import qualified GHCJS.DOM as Dom import qualified GHCJS.DOM.Document as Document import qualified GHCJS.DOM.HTMLCollection as HTMLCollection import GHCJS.DOM.Types (Element) import Reflex.Dom (Dynamic, Event, MonadWidget) import qualified Reflex.Dom as R divIfDyn :: forall t m a. MonadWidget t m => Dynamic t Bool -> m a -> m a -> m (Dynamic t a) divIfDyn cond = divIfEvent (R.updated cond) divIfEvent :: forall t m a. MonadWidget t m => Event t Bool -> m a -> m a -> m (Dynamic t a) divIfEvent cond empty content = R.widgetHold empty (flip fmap cond (\show -> if show then content else empty)) divVisibleIf :: forall t m a. MonadWidget t m => Dynamic t Bool -> m a -> m a divVisibleIf cond content = divClassVisibleIf cond "" content divClassVisibleIf :: forall t m a. MonadWidget t m => Dynamic t Bool -> Text -> m a -> m a divClassVisibleIf cond className content = R.elDynAttr "div" (fmap (\c -> (M.singleton "class" className) `M.union` if c then M.empty else M.singleton "style" "display:none") cond) content getBody :: forall t m. MonadWidget t m => m Element getBody = do document <- Dom.currentDocumentUnchecked nodelist <- Document.getElementsByTagName document ("body" :: String) Just body <- nodelist `HTMLCollection.item` 0 return body