Skip to content

Commit e8bf0dc

Browse files
author
Michael Trotter
committed
more reason-react-like api experiment
1 parent 3345f8e commit e8bf0dc

6 files changed

Lines changed: 289 additions & 162 deletions

File tree

examples/component/src/Container.purs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,18 @@ module Container where
22

33
import Prelude
44

5-
import React.Basic (JSX, StatelessComponent, createComponent, makeStateless)
5+
import React.Basic (JSX, StatelessComponent, createStatelessComponent, makeStateless)
66
import React.Basic.DOM as R
77
import ToggleButton as ToggleButton
88

99
render :: JSX
10-
render = {} # makeStateless component \_ ->
10+
render = unit # makeStateless component \_ ->
1111
R.div
1212
{ children:
1313
[ ToggleButton.render { label: "A" }
1414
, ToggleButton.render { label: "B" }
1515
]
1616
}
1717

18-
component :: StatelessComponent {}
19-
component = createComponent "Container"
18+
component :: StatelessComponent
19+
component = createStatelessComponent "Container"

examples/component/src/ToggleButton.purs

Lines changed: 21 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module ToggleButton where
22

33
import Prelude
44

5-
import React.Basic (JSX, Update, Component, StateUpdate(..), make, createComponent)
5+
import React.Basic (Component, JSX, StateUpdate(..), createComponent, make)
66
import React.Basic.DOM as R
77
import React.Basic.Events as Events
88

@@ -13,30 +13,26 @@ type Props =
1313
data Action
1414
= Toggle
1515

16-
type State =
17-
{ on :: Boolean
18-
}
19-
20-
initialState :: State
21-
initialState =
22-
{ on: false
16+
render :: Props -> JSX
17+
render = make component
18+
{ initialState =
19+
{ on: false
20+
}
21+
22+
, update = \self -> case _ of
23+
Toggle -> Update self.state { on = not self.state.on }
24+
25+
, render = \self ->
26+
R.button
27+
{ onClick: Events.handler_ do self.send Toggle
28+
, children:
29+
[ R.text self.props.label
30+
, R.text if self.state.on
31+
then " On"
32+
else " Off"
33+
]
34+
}
2335
}
2436

25-
update :: Update Props State Action
26-
update self = case _ of
27-
Toggle -> Update self.state { on = not self.state.on }
28-
29-
render :: Props -> JSX
30-
render = make component initialState update \self ->
31-
R.button
32-
{ onClick: Events.handler_ do self.send Toggle
33-
, children:
34-
[ R.text self.props.label
35-
, R.text if self.state.on
36-
then " On"
37-
else " Off"
38-
]
39-
}
40-
41-
component :: Component Props State Action
37+
component :: Component
4238
component = createComponent "ToggleButton"

examples/controlled-input/src/ControlledInput.purs

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,46 @@ module ControlledInput where
33
import Prelude
44

55
import Data.Maybe (Maybe(..), fromMaybe, maybe)
6-
import React.Basic (JSX, Update, Component, StateUpdate(..), make, createComponent)
6+
import React.Basic (Component, JSX, StateUpdate(..), createComponent, make)
77
import React.Basic as React
88
import React.Basic.DOM as R
99
import React.Basic.DOM.Events (preventDefault, targetValue, timeStamp)
1010
import React.Basic.Events as Events
1111

1212
type Props = {}
1313

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-
2514
data Action
2615
= ValueChanged String Number
2716

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-
3317
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
18+
render = make component
19+
{ initialState =
20+
{ value: "hello world"
21+
, timestamp: Nothing
22+
}
23+
24+
, update = \self -> case _ of
25+
ValueChanged value timestamp ->
26+
Update self.state
27+
{ value = value
28+
, timestamp = Just timestamp
29+
}
30+
31+
, render = \self ->
32+
React.fragment
33+
[ R.input
34+
{ onChange:
35+
Events.handler
36+
(preventDefault >>> Events.merge { targetValue, timeStamp })
37+
\{ timeStamp, targetValue } ->
38+
self.send $
39+
ValueChanged (fromMaybe "" targetValue) timeStamp
40+
, value: self.state.value
41+
}
42+
, R.p_ [ R.text ("Current value = " <> show self.state.value) ]
43+
, R.p_ [ R.text ("Changed at = " <> maybe "never" show self.state.timestamp) ]
44+
]
45+
}
46+
47+
component :: Component
4948
component = createComponent "ControlledInput"

examples/counter/src/Counter.purs

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ module Counter where
22

33
import Prelude
44

5-
import React.Basic (JSX, Update, Component, StateUpdate(..), make, createComponent)
5+
import React.Basic (Component, JSX, StateUpdate(..), createComponent, make)
66
import React.Basic.DOM as R
77
import React.Basic.Events as Events
88

@@ -13,25 +13,20 @@ type Props =
1313
data Action
1414
= Increment
1515

16-
type State =
17-
{ counter :: Int
18-
}
19-
20-
initialState :: State
21-
initialState =
22-
{ counter: 0
23-
}
24-
25-
update :: Update Props State Action
26-
update self = case _ of
27-
Increment -> Update self.state { counter = self.state.counter + 1 }
28-
2916
render :: Props -> JSX
30-
render = make component initialState update \self ->
31-
R.button
32-
{ onClick: Events.handler_ do self.send Increment
33-
, children: [ R.text (self.props.label <> ": " <> show self.state.counter) ]
34-
}
17+
render = make component
18+
{ initialState = { counter: 0 }
19+
20+
, update = \self -> case _ of
21+
Increment ->
22+
Update self.state { counter = self.state.counter + 1 }
23+
24+
, render = \self ->
25+
R.button
26+
{ onClick: Events.handler_ do self.send Increment
27+
, children: [ R.text (self.props.label <> ": " <> show self.state.counter) ]
28+
}
29+
}
3530

36-
component :: Component Props State Action
31+
component :: Component
3732
component = createComponent "Counter"

0 commit comments

Comments
 (0)