1
1
module ComponentsHalogenHooks.Main where
2
2
3
- import Prelude hiding ( top )
3
+ import Prelude
4
4
5
5
import Data.Maybe (Maybe (..), maybe )
6
- import Data.Symbol (SProxy (..))
7
6
import Data.Tuple.Nested ((/\))
8
7
import Effect (Effect )
9
8
import Halogen as H
@@ -13,26 +12,30 @@ import Halogen.HTML.Events as HE
13
12
import Halogen.HTML.Properties as HP
14
13
import Halogen.Hooks as Hooks
15
14
import Halogen.VDom.Driver (runUI )
15
+ import Web.UIEvent.MouseEvent (MouseEvent )
16
16
17
17
main :: Effect Unit
18
18
main =
19
19
HA .runHalogenAff do
20
20
body <- HA .awaitBody
21
21
void $ runUI containerComponent unit body
22
22
23
- _button :: SProxy " button"
24
- _button = SProxy
25
-
26
23
containerComponent
27
24
:: forall unusedQuery unusedInput unusedOutput anyMonad
28
25
. H.Component HH.HTML unusedQuery unusedInput unusedOutput anyMonad
29
26
containerComponent = Hooks .component \rec _ -> Hooks .do
27
+ enabled /\ enabledIdx <- Hooks .useState false
30
28
toggleCount /\ toggleCountIdx <- Hooks .useState 0
31
29
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"
32
36
Hooks .pure $
33
37
HH .div_
34
- [ HH .slot _button unit buttonComponent unit \_ -> Just do
35
- Hooks .modify_ toggleCountIdx (_ + 1 )
38
+ [ renderButton {enabled, handleClick}
36
39
, HH .p_
37
40
[ HH .text (" Button has been toggled " <> show toggleCount <> " time(s)" ) ]
38
41
, HH .p_
@@ -42,31 +45,23 @@ containerComponent = Hooks.component \rec _ -> Hooks.do
42
45
<> " . "
43
46
, HH .button
44
47
[ 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
47
49
]
48
50
[ HH .text " Check now" ]
49
51
]
50
52
]
51
53
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
66
63
HH .button
67
64
[ 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
71
66
]
72
67
[ HH .text label ]
0 commit comments