{-# LANGUAGE ScopedTypeVariables #-} module Component.Modal ( ModalIn(..) , ModalOut(..) , modal ) where import qualified Data.Map as M import Reflex.Dom (Event, MonadWidget) import qualified Reflex.Dom as R data ModalIn t m = ModalIn { _modalIn_show :: Event t () , _modalIn_content :: m () } data ModalOut = ModalOut {} modal :: forall t m. MonadWidget t m => ModalIn t m -> m ModalOut modal modalIn = do rec showModal <- R.holdDyn False $ R.leftmost [ True <$ _modalIn_show modalIn , False <$ curtainClick ] let attr = flip fmap showModal (\s -> M.fromList $ [ ("style", if s then "display:block" else "display:none") , ("class", "modal") ]) curtainClick <- R.elDynAttr "div" attr $ do (curtain, _) <- R.elAttr' "div" (M.singleton "class" "curtain") $ R.blank R.divClass "content" $ _modalIn_content modalIn return $ R.domEvent R.Click curtain return $ ModalOut {}