11module ComponentsHalogenHooks.Main where
22
3- import Prelude hiding ( top )
3+ import Prelude
44
55import Data.Maybe (Maybe (..), maybe )
6- import Data.Symbol (SProxy (..))
76import Data.Tuple.Nested ((/\))
87import Effect (Effect )
98import Halogen as H
@@ -13,26 +12,30 @@ import Halogen.HTML.Events as HE
1312import Halogen.HTML.Properties as HP
1413import Halogen.Hooks as Hooks
1514import Halogen.VDom.Driver (runUI )
15+ import Web.UIEvent.MouseEvent (MouseEvent )
1616
1717main :: Effect Unit
1818main =
1919 HA .runHalogenAff do
2020 body <- HA .awaitBody
2121 void $ runUI containerComponent unit body
2222
23- _button :: SProxy " button"
24- _button = SProxy
25-
2623containerComponent
2724 :: forall unusedQuery unusedInput unusedOutput anyMonad
2825 . H.Component HH.HTML unusedQuery unusedInput unusedOutput anyMonad
2926containerComponent = Hooks .component \rec _ -> Hooks .do
27+ enabled /\ enabledIdx <- Hooks .useState false
3028 toggleCount /\ toggleCountIdx <- Hooks .useState 0
3129 buttonState /\ buttonStateIdx <- Hooks .useState (Nothing :: Maybe Boolean )
30+ let
31+ handleClick _ =
32+ Just do
33+ Hooks .modify_ toggleCountIdx (_ + 1 )
34+ Hooks .modify_ enabledIdx not
35+ label = if enabled then " On" else " Off"
3236 Hooks .pure $
3337 HH .div_
34- [ HH .slot _button unit buttonComponent unit \_ -> Just do
35- Hooks .modify_ toggleCountIdx (_ + 1 )
38+ [ renderButton {enabled, handleClick}
3639 , HH .p_
3740 [ HH .text (" Button has been toggled " <> show toggleCount <> " time(s)" ) ]
3841 , HH .p_
@@ -42,31 +45,23 @@ containerComponent = Hooks.component \rec _ -> Hooks.do
4245 <> " . "
4346 , HH .button
4447 [ HE .onClick \_ -> Just do
45- mbBtnState <- Hooks .query rec.slotToken _button unit $ H .request IsOn
46- Hooks .put buttonStateIdx mbBtnState
48+ Hooks .put buttonStateIdx $ Just enabled
4749 ]
4850 [ HH .text " Check now" ]
4951 ]
5052 ]
5153
52- data ButtonMessage = Toggled Boolean
53- data ButtonQuery a = IsOn (Boolean -> a )
54-
55- buttonComponent
56- :: forall unusedInput anyMonad
57- . H.Component HH.HTML ButtonQuery unusedInput ButtonMessage anyMonad
58- buttonComponent = Hooks .component \rec _ -> Hooks .do
59- enabled /\ enabledIdx <- Hooks .useState false
60- Hooks .useQuery rec.queryToken case _ of
61- IsOn reply -> do
62- isEnabled <- Hooks .get enabledIdx
63- pure $ Just $ reply isEnabled
64- let label = if enabled then " On" else " Off"
65- Hooks .pure $
54+ renderButton :: forall w i .
55+ { enabled :: Boolean
56+ , handleClick :: MouseEvent -> Maybe i
57+ }
58+ -> HH.HTML w i
59+ renderButton {enabled, handleClick} =
60+ let
61+ label = if enabled then " On" else " Off"
62+ in
6663 HH .button
6764 [ HP .title label
68- , HE .onClick \_ -> Just do
69- newState <- Hooks .modify enabledIdx not
70- Hooks .raise rec.outputToken $ Toggled newState
65+ , HE .onClick handleClick
7166 ]
7267 [ HH .text label ]
0 commit comments