@@ -3,34 +3,47 @@ module ControlledInput where
33import Prelude
44
55import Data.Maybe (Maybe (..), fromMaybe , maybe )
6+ import React.Basic (JSX , Update , Component , StateUpdate (..), make , createComponent )
67import React.Basic as React
78import React.Basic.DOM as R
89import React.Basic.DOM.Events (preventDefault , targetValue , timeStamp )
910import React.Basic.Events as Events
1011
11- component :: React.Component { }
12- component = React .component { displayName: " ControlledInput" , initialState, receiveProps, render }
13- where
14- initialState =
15- { value: " hello world"
16- , timeStamp: Nothing
17- }
18-
19- receiveProps _ =
20- pure unit
21-
22- render { state, setState } =
23- React .fragment
24- [ R .input
25- { onChange:
26- Events .handler
27- (preventDefault >>> Events .merge { targetValue, timeStamp })
28- \{ timeStamp, targetValue } ->
29- setState _ { value = fromMaybe " " targetValue
30- , timeStamp = Just timeStamp
31- }
32- , value: state.value
33- }
34- , R .p_ [ R .text (" Current value = " <> show state.value) ]
35- , R .p_ [ R .text (" Changed at = " <> maybe " never" show state.timeStamp) ]
36- ]
12+ type Props = { }
13+
14+ type State =
15+ { value :: String
16+ , timestamp :: Maybe Number
17+ }
18+
19+ initialState :: State
20+ initialState =
21+ { value: " hello world"
22+ , timestamp: Nothing
23+ }
24+
25+ data Action
26+ = ValueChanged String Number
27+
28+ update :: Update Props State Action
29+ update self = case _ of
30+ ValueChanged value timestamp ->
31+ Update self.state { value = value, timestamp = Just timestamp }
32+
33+ render :: Props -> JSX
34+ render = make component initialState update \{ props, state, send } ->
35+ React .fragment
36+ [ R .input
37+ { onChange:
38+ Events .handler
39+ (preventDefault >>> Events .merge { targetValue, timeStamp })
40+ \{ timeStamp, targetValue } ->
41+ send $ ValueChanged (fromMaybe " " targetValue) timeStamp
42+ , value: state.value
43+ }
44+ , R .p_ [ R .text (" Current value = " <> show state.value) ]
45+ , R .p_ [ R .text (" Changed at = " <> maybe " never" show state.timestamp) ]
46+ ]
47+
48+ component :: Component Props State Action
49+ component = createComponent " ControlledInput"
0 commit comments