module Component.Button ( ButtonIn(..) , ButtonOut(..) , button , defaultButtonIn ) where import qualified Data.Map as M import Data.Maybe (catMaybes) 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 , _buttonIn_tabIndex :: Maybe Int , _buttonIn_submit :: Bool } defaultButtonIn :: MonadWidget t m => m () -> ButtonIn t m defaultButtonIn content = ButtonIn { _buttonIn_class = R.constDyn "" , _buttonIn_content = content , _buttonIn_waiting = R.never , _buttonIn_tabIndex = Nothing , _buttonIn_submit = False } -- defaultButtonIn :: MonadWidget t m => ButtonIn t m -- defaultButtonIn = ButtonIn -- { _buttonIn_class = R.constDyn "" -- , _buttonIn_content = R.blank -- , _buttonIn_waiting = R.never -- , _buttonIn_tabIndex = Nothing -- , _buttonIn_submit = False -- } 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 . M.fromList . catMaybes $ [ Just ("type", if _buttonIn_submit buttonIn then "submit" else "button") , (\i -> ("tabindex", T.pack . show $ i)) <$> _buttonIn_tabIndex buttonIn , Just ("class", T.intercalate " " [ buttonClass, if waiting then "waiting" else "" ]) ] (e, _) <- R.elDynAttr' "button" attr $ do Icon.loading R.divClass "content" $ _buttonIn_content buttonIn return $ ButtonOut { _buttonOut_clic = R.domEvent R.Click e }