Skip to content

Commit 2c040de

Browse files
committed
Updates for React 0.13
Refactored the API to match React 0.13. Resolves #34
1 parent e1037c9 commit 2c040de

File tree

4 files changed

+75
-54
lines changed

4 files changed

+75
-54
lines changed

bower.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
"tests"
1717
],
1818
"dependencies": {
19-
"purescript-console": "^0.1.0",
20-
"purescript-dom": "^0.1.1",
21-
"react": "~0.12.2"
19+
"purescript-console": "~0.1.1",
20+
"purescript-dom": "~0.2.6"
21+
},
22+
"devDependencies": {
23+
"react": "~0.13.3"
2224
}
2325
}

src/React.js

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -98,26 +98,24 @@ exports.handle = function(f) {
9898
};
9999
};
100100

101-
exports.renderToString = React.renderComponentToString;
102-
103-
exports.renderToBody = function(component) {
104-
return function() {
105-
return React.renderComponent(component, document.body);
106-
}
101+
exports.createElement = function(clazz) {
102+
return function(props) {
103+
return function(children){
104+
return React.createElement.apply(React, [clazz, props].concat(children));
105+
};
106+
};
107107
};
108108

109-
exports.renderToElementById = function(id) {
110-
return function(component) {
111-
return function() {
112-
return React.renderComponent(component, document.getElementById(id));
113-
}
114-
}
109+
exports.createFactory = function(clazz) {
110+
return React.createFactory(clazz);
115111
};
116112

117-
exports.createElement = function(factory) {
118-
return function(props) {
119-
return function(children){
120-
return React.createElement.apply(React, [factory, props].concat(children));
121-
};
113+
exports.render = function(element) {
114+
return function(container) {
115+
return function() {
116+
return React.render(element, container);
117+
}
122118
};
123119
};
120+
121+
exports.renderToString = React.renderToString;

src/React.purs

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ module React
2222
, Render()
2323

2424
, UISpec()
25-
, UIFactory()
25+
, UIClass()
2626

2727
, Event()
2828
, MouseEvent()
@@ -44,18 +44,19 @@ module React
4444

4545
, handle
4646

47-
, renderToString
48-
, renderToBody
49-
, renderToElementById
5047
, createElement
48+
, createFactory
49+
50+
, render
51+
, renderToString
5152
) where
5253

53-
import Prelude
54+
import Prelude (Unit(), ($), bind, pure, return, unit)
5455

55-
import DOM
56+
import DOM (DOM())
57+
import DOM.Node.Types (Element())
5658

57-
import Control.Monad.Eff
58-
import Control.Monad.Eff.Console
59+
import Control.Monad.Eff (Eff())
5960

6061
-- | A virtual DOM node, or component.
6162
foreign import data UI :: *
@@ -212,13 +213,10 @@ type UISpec props state eff =
212213
) Unit
213214
}
214215

215-
-- | Factory function for components.
216-
type UIFactory props = props -> UI
217-
218216
-- | Create a component specification.
219217
spec :: forall props state eff. state -> Render props state eff -> UISpec props state eff
220-
spec st render =
221-
{ render: render
218+
spec st renderFn =
219+
{ render: renderFn
222220
, displayName: ""
223221
, getInitialState: \_ -> pure st
224222
, componentWillMount: \_ -> return unit
@@ -230,6 +228,9 @@ spec st render =
230228
, componentWillUnmount: \_ -> return unit
231229
}
232230

231+
-- | Factory function for components.
232+
foreign import data UIClass :: * -> *
233+
233234
-- | Read the component props.
234235
foreign import getProps :: forall props eff.
235236
UIRef ->
@@ -265,24 +266,24 @@ transformState ctx f = do
265266
state <- readState ctx
266267
writeState ctx $ f state
267268

268-
-- | Create a component from a component spec.
269+
-- | Create a React class from a specification.
269270
foreign import mkUI :: forall props state eff.
270271
UISpec props state eff ->
271-
UIFactory props
272+
UIClass props
272273

273274
-- | Create an event handler.
274275
foreign import handle :: forall eff ev props state result.
275276
(ev -> EventHandlerContext eff props state result) ->
276277
EventHandler ev
277278

278-
-- | Render a component as a string.
279-
foreign import renderToString :: UI -> String
279+
-- | Render a React element in a document element.
280+
foreign import render :: forall eff. UI -> Element -> Eff (dom :: DOM | eff) UI
280281

281-
-- | Render a component to the document body.
282-
foreign import renderToBody :: forall eff. UI -> Eff (dom :: DOM | eff) UI
282+
-- | Render a React element as a string.
283+
foreign import renderToString :: UI -> String
283284

284-
-- | Render a component to the element with the specified ID.
285-
foreign import renderToElementById :: forall eff. String -> UI -> Eff (dom :: DOM | eff) UI
285+
-- | Create an element from a React class.
286+
foreign import createElement :: forall props. UIClass props -> props -> Array UI -> UI
286287

287-
-- | Create an element from a component factory.
288-
foreign import createElement :: forall props. UIFactory props -> props -> Array UI -> UI
288+
-- | Create a factory from a React class.
289+
foreign import createFactory :: forall props. UIClass props -> props -> UI

test/Main.purs

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,18 @@ import Prelude
55
import Control.Monad.Eff
66
import Control.Monad.Eff.Console
77

8+
import Data.Maybe (Maybe(..))
9+
import Data.Maybe.Unsafe (fromJust)
10+
import Data.Nullable (toMaybe)
11+
12+
import DOM (DOM())
13+
import DOM.HTML (window)
14+
import DOM.HTML.Document (body)
15+
import DOM.HTML.Types (htmlElementToElement)
16+
import DOM.HTML.Window (document)
17+
18+
import DOM.Node.Types (Element())
19+
820
import React
921

1022
import qualified React.DOM as D
@@ -34,6 +46,7 @@ counter = mkUI counterSpec
3446
val <- readState ctx
3547
print val
3648
}
49+
3750
render ctx = do
3851
val <- readState ctx
3952
return $ D.button [ P.className "Counter"
@@ -45,14 +58,21 @@ counter = mkUI counterSpec
4558
, D.text " Click me to increment!"
4659
]
4760

48-
main = do
49-
let component = D.div' [
50-
hello { name: "World" },
51-
counter unit,
52-
createElement container unit [
53-
D.p [] [ D.text "This is line one" ],
54-
D.p [] [ D.text "This is line two" ]
55-
]
56-
]
57-
58-
renderToBody component
61+
main = body' >>= render ui
62+
where
63+
ui :: UI
64+
ui = D.div' [ createFactory hello { name: "World" }
65+
, createFactory counter unit
66+
, createElement container unit
67+
[ D.p [] [ D.text "This is line one" ]
68+
, D.p [] [ D.text "This is line two" ]
69+
]
70+
]
71+
72+
body' :: forall eff. Eff (dom :: DOM | eff) Element
73+
body' = do
74+
win <- window
75+
doc <- document win
76+
elm <- fromJust <$> toMaybe <$> body doc
77+
return $ htmlElementToElement elm
78+

0 commit comments

Comments
 (0)