Skip to content

Commit ce7eb17

Browse files
authored
react-basic v4 (#3)
1 parent 741a2c3 commit ce7eb17

File tree

6 files changed

+57
-57
lines changed

6 files changed

+57
-57
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import Prelude
1616
import Data.Array ((!!), drop, mapWithIndex, take)
1717
import Data.Foldable (for_)
1818
import Data.Maybe (Maybe(Nothing), fromMaybe, maybe)
19-
import React.Basic (ReactComponent, createElement, fragment, react)
19+
import React.Basic.Compat (ReactComponent, createElement, fragment, react)
2020
import React.Basic.DOM as R
2121
import React.Basic.DOM.Events (targetChecked)
2222
import React.Basic.Events as Events
@@ -54,7 +54,7 @@ component = react { displayName: "BasicExample", initialState, receiveProps, ren
5454
}
5555
5656
where
57-
renderTodo index todo =
57+
renderTodo index todo =
5858
createElement dnd.dragSource
5959
{ beginDrag: \_ -> pure
6060
{ itemId: todo.id

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
},
99
"dependencies": {
1010
"purescript-prelude": "^4.1.0",
11-
"purescript-react-basic": "^2.0.0",
11+
"purescript-react-basic": "^4.0.1",
1212
"purescript-nullable": "^4.0.0",
1313
"purescript-promises": "^3.0.0"
1414
},

examples/basic/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,6 @@ var ReactDOM = require("react-dom");
55
var Counter = require("./output/bundle.js");
66

77
ReactDOM.render(
8-
React.createElement(Counter.component, { label: 'Increment' }),
8+
Counter.todoExample,
99
document.getElementById("container")
1010
);

examples/basic/src/Basic.purs

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,32 @@ import Prelude
55
import Data.Array ((!!), drop, mapWithIndex, take)
66
import Data.Foldable (for_)
77
import Data.Maybe (Maybe(Nothing), fromMaybe, maybe)
8-
import React.Basic as React
8+
import React.Basic (Component, JSX, StateUpdate(..), createComponent, fragment, make)
99
import React.Basic.DOM as R
1010
import React.Basic.DOM.Events (targetChecked)
1111
import React.Basic.Events as Events
12-
import React.Basic.ReactDND (DragDrop, DragDropContextProps, DragDropItemType(..), createDragDrop, createDragDropContext)
12+
import React.Basic.ReactDND (DragDrop, DragDropItemType(..), createDragDrop, createDragDropContext)
1313
import React.Basic.ReactDND.Backends.HTML5Backend (html5Backend)
1414

15-
dndContext :: React.Component DragDropContextProps
15+
dndContext :: JSX -> JSX
1616
dndContext = createDragDropContext html5Backend
1717

1818
dnd :: DragDrop { itemId :: String, index :: Int }
1919
dnd = createDragDrop (DragDropItemType "TODO_ITEM")
2020

21-
component :: React.Component {}
22-
component = React.component { displayName: "BasicExample", initialState, receiveProps, render }
21+
data Action
22+
= Move { from :: Int, to :: Int }
23+
| SetDone String Boolean
24+
25+
component :: Component
26+
component = createComponent "TodoExample"
27+
28+
todoExample :: JSX
29+
todoExample = unit # make component
30+
{ initialState = initialState
31+
, update = update
32+
, render = render
33+
}
2334
where
2435
initialState =
2536
{ todos:
@@ -29,22 +40,29 @@ component = React.component { displayName: "BasicExample", initialState, receive
2940
]
3041
}
3142

32-
receiveProps _ =
33-
pure unit
43+
update self = case _ of
44+
Move { from, to } ->
45+
Update self.state { todos = moveItem from to self.state.todos }
3446

35-
render { state, setState } =
36-
React.element dndContext
37-
{ child:
38-
React.fragment
39-
[ R.h1_ [ R.text "Todos" ]
40-
, R.p_ [ R.text "Drag to reorder the list:" ]
41-
, R.section_ (mapWithIndex renderTodo state.todos)
42-
]
43-
}
47+
SetDone id done ->
48+
Update self.state
49+
{ todos = self.state.todos <#> \t ->
50+
if t.id == id
51+
then t { done = done }
52+
else t
53+
}
54+
55+
render { state, send } =
56+
dndContext $
57+
fragment
58+
[ R.h1_ [ R.text "Todos" ]
59+
, R.p_ [ R.text "Drag to reorder the list:" ]
60+
, R.section_ (mapWithIndex renderTodo state.todos)
61+
]
4462

4563
where
4664
renderTodo index todo =
47-
React.element dnd.dragSource
65+
dnd.dragSource
4866
{ beginDrag: \_ -> pure
4967
{ itemId: todo.id
5068
, index
@@ -54,12 +72,10 @@ component = React.component { displayName: "BasicExample", initialState, receive
5472
, isDragging: \{ item: draggingItem } ->
5573
pure $ maybe false (\i -> i.itemId == todo.id) draggingItem
5674
, render: \{ connectDragSource, isDragging } ->
57-
React.element dnd.dropTarget
75+
dnd.dropTarget
5876
{ drop: \{ item: dragItem } -> do
5977
for_ (_.index <$> dragItem) \dragItemIndex ->
60-
setState \s -> s
61-
{ todos = moveItem dragItemIndex index s.todos
62-
}
78+
send $ Move { from: dragItemIndex, to: index }
6379
pure Nothing
6480
, hover: const (pure unit)
6581
, canDrop: const (pure true)
@@ -84,12 +100,7 @@ component = React.component { displayName: "BasicExample", initialState, receive
84100
{ "type": "checkbox"
85101
, checked: todo.done
86102
, onChange: Events.handler targetChecked \checked -> do
87-
setState \s -> s
88-
{ todos = s.todos <#> \t ->
89-
if t.id == todo.id
90-
then t { done = fromMaybe false checked }
91-
else t
92-
}
103+
send $ SetDone todo.id $ fromMaybe false checked
93104
}
94105
, R.text todo.text
95106
]

src/React/Basic/ReactDND.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ RenderPropComponent.prototype.render = function() {
1919
return this.props.render(this.props);
2020
};
2121

22-
exports.createDragDropContext = function(backend) {
22+
exports.createDragDropContext_ = function(backend) {
2323
return DND.DragDropContext(backend)(SingleChildComponent);
2424
};
2525

src/React/Basic/ReactDND.purs

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ module React.Basic.ReactDND
66
, DragSourceCollectArgs
77
, DropTargetCollectArgs
88
, DragLayerCollectArgs
9-
, DragDropContextProps
109
, DragSourceProps
1110
, DropTargetProps
1211
, DragLayerProps
@@ -22,7 +21,7 @@ import Data.Maybe (Maybe)
2221
import Data.Nullable (Nullable, toMaybe, toNullable)
2322
import Effect (Effect)
2423
import Effect.Uncurried (mkEffectFn1)
25-
import React.Basic (Component, JSX, element, stateless)
24+
import React.Basic (JSX, ReactComponent, element)
2625

2726
data Backend
2827

@@ -65,10 +64,6 @@ type DragLayerCollectArgs item =
6564
| SharedCollectArgs item
6665
}
6766

68-
type DragDropContextProps =
69-
{ child :: JSX
70-
}
71-
7267
type DragSourceProps item =
7368
{ beginDrag :: DragSourceCollectArgs item -> Effect item
7469
, endDrag :: DragSourceCollectArgs item -> Effect Unit
@@ -89,9 +84,9 @@ type DragLayerProps item =
8984
}
9085

9186
type DragDrop item =
92-
{ dragSource :: Component (DragSourceProps item)
93-
, dropTarget :: Component (DropTargetProps item)
94-
, dragLayer :: Component (DragLayerProps item)
87+
{ dragSource :: DragSourceProps item -> JSX
88+
, dropTarget :: DropTargetProps item -> JSX
89+
, dragLayer :: DragLayerProps item -> JSX
9590
}
9691

9792
createDragDrop
@@ -106,53 +101,47 @@ createDragDrop itemType =
106101
where
107102
dragSource =
108103
let jsDragSource = runFn2 unsafeCreateDragSource toMaybe itemType
109-
in stateless
110-
{ displayName: "DragSource"
111-
, render: \props -> element jsDragSource
104+
in \props -> element jsDragSource
112105
{ beginDrag: mkEffectFn1 props.beginDrag
113106
, endDrag: mkEffectFn1 props.endDrag
114107
, canDrag: mkEffectFn1 props.canDrag
115108
, isDragging: mkEffectFn1 props.isDragging
116109
, render: mkFn1 props.render
117110
}
118-
}
119111

120112
dropTarget =
121113
let jsDropTarget = runFn2 unsafeCreateDropTarget toMaybe itemType
122-
in stateless
123-
{ displayName: "DropTarget"
124-
, render: \props -> element jsDropTarget
114+
in \props -> element jsDropTarget
125115
{ drop: mkEffectFn1 (map toNullable <<< props.drop)
126116
, hover: mkEffectFn1 props.hover
127117
, canDrop: mkEffectFn1 props.canDrop
128118
, render: mkFn1 props.render
129119
}
130-
}
131120

132121
dragLayer =
133122
let jsDragLayer = unsafeCreateDragLayer toMaybe
134-
in stateless
135-
{ displayName: "DragLayer"
136-
, render: element jsDragLayer
137-
}
123+
in element jsDragLayer
124+
125+
createDragDropContext :: Backend -> JSX -> JSX
126+
createDragDropContext backend = (\c child -> element c { child }) (createDragDropContext_ backend)
138127

139-
foreign import createDragDropContext :: Backend -> Component DragDropContextProps
128+
foreign import createDragDropContext_ :: Backend -> ReactComponent { child :: JSX }
140129

141130
foreign import unsafeCreateDragSource
142131
:: forall a
143132
. Fn2
144133
(Nullable ~> Maybe)
145134
DragDropItemType
146-
(Component { | a })
135+
(ReactComponent { | a })
147136

148137
foreign import unsafeCreateDropTarget
149138
:: forall a
150139
. Fn2
151140
(Nullable ~> Maybe)
152141
DragDropItemType
153-
(Component { | a })
142+
(ReactComponent { | a })
154143

155144
foreign import unsafeCreateDragLayer
156145
:: forall a
157146
. (Nullable ~> Maybe)
158-
-> Component { | a }
147+
-> ReactComponent { | a }

0 commit comments

Comments
 (0)