module Component.Button ( ButtonIn(..) , buttonInDefault , ButtonOut(..) , button ) where import qualified Data.Map as M import Data.Text (Text) import qualified Data.Text as T import Reflex.Dom (Dynamic, Event, MonadWidget) import qualified Reflex.Dom as R import qualified Icon data ButtonIn t m = ButtonIn { _buttonIn_class :: Dynamic t Text , _buttonIn_content :: m () , _buttonIn_waiting :: Event t Bool } buttonInDefault :: forall t m. MonadWidget t m => ButtonIn t m buttonInDefault = ButtonIn { _buttonIn_class = R.constDyn "" , _buttonIn_content = R.blank , _buttonIn_waiting = R.never } data ButtonOut t = ButtonOut { _buttonOut_clic :: Event t () } button :: forall t m. MonadWidget t m => ButtonIn t m -> m (ButtonOut t) button buttonIn = do dynWaiting <- R.holdDyn False $ _buttonIn_waiting buttonIn let attr = do buttonClass <- _buttonIn_class buttonIn waiting <- dynWaiting return $ if waiting then M.fromList [("type", "button"), ("class", T.intercalate " " [ buttonClass, "waiting" ])] else M.fromList [("type", "button"), ("class", buttonClass)] (e, _) <- R.elDynAttr' "button" attr $ do Icon.loading R.divClass "content" $ _buttonIn_content buttonIn return $ ButtonOut { _buttonOut_clic = R.domEvent R.Click e } -- mergeAttr :: Map Text Text -> Map Text Text -> Map Text Text -- mergeAttr = M.unionWithKey $ \k a b -> -- if k == "class" -- then T.intercalate " " [ a, b ] -- else b