Skip to content

Commit 26fa85a

Browse files
committed
ComponentsHalogenHooks in style of React
1 parent 35243fa commit 26fa85a

File tree

1 file changed

+21
-26
lines changed

1 file changed

+21
-26
lines changed
Lines changed: 21 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
module ComponentsHalogenHooks.Main where
22

3-
import Prelude hiding (top)
3+
import Prelude
44

55
import Data.Maybe (Maybe(..), maybe)
6-
import Data.Symbol (SProxy(..))
76
import Data.Tuple.Nested ((/\))
87
import Effect (Effect)
98
import Halogen as H
@@ -13,26 +12,30 @@ import Halogen.HTML.Events as HE
1312
import Halogen.HTML.Properties as HP
1413
import Halogen.Hooks as Hooks
1514
import Halogen.VDom.Driver (runUI)
15+
import Web.UIEvent.MouseEvent (MouseEvent)
1616

1717
main :: Effect Unit
1818
main =
1919
HA.runHalogenAff do
2020
body <- HA.awaitBody
2121
void $ runUI containerComponent unit body
2222

23-
_button :: SProxy "button"
24-
_button = SProxy
25-
2623
containerComponent
2724
:: forall unusedQuery unusedInput unusedOutput anyMonad
2825
. H.Component HH.HTML unusedQuery unusedInput unusedOutput anyMonad
2926
containerComponent = 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

Comments
 (0)