Skip to content

Commit 90e61f0

Browse files
committed
Initial hooks implementation
1 parent e059deb commit 90e61f0

File tree

5 files changed

+458
-1
lines changed

5 files changed

+458
-1
lines changed

bower.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
"purescript-exceptions": "^4.0.0",
2424
"purescript-maybe": "^4.0.0",
2525
"purescript-nullable": "^4.0.0",
26-
"purescript-typelevel-prelude": "^3.0.0"
26+
"purescript-typelevel-prelude": "^3.0.0",
27+
"purescript-tuples": "^5.1.0"
2728
},
2829
"devDependencies": {
2930
"purescript-console": "^4.1.0",

src/React.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,3 +169,13 @@ function createContext(defaultValue) {
169169
};
170170
}
171171
exports.createContext = createContext;
172+
173+
exports.createElementHooks = function createElementHooks(props) {
174+
return function(fn) {
175+
var fn_ = function(props) {
176+
return fn(props)();
177+
};
178+
179+
return React.createElement(fn_, props);
180+
};
181+
};

src/React.purs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ module React
6363
, ContextProvider
6464
, ContextConsumer
6565
, createContext
66+
, module React
6667
) where
6768

6869
import Prelude
@@ -75,6 +76,53 @@ import Prim.Row as Row
7576
import Type.Row (type (+))
7677
import Unsafe.Coerce (unsafeCoerce)
7778

79+
import React.Hooks
80+
( useState
81+
, useStateLazy
82+
, setState
83+
, modifyState
84+
, SetState
85+
86+
, useEffect
87+
, effectInput
88+
, EffectInput
89+
90+
, useContext
91+
, Context
92+
93+
, useReducer
94+
, useReducerLazy
95+
, dispatch
96+
, Dispatch
97+
, Action_
98+
, Action
99+
100+
, useCallback
101+
, callbackInput
102+
, CallbackInput
103+
104+
, useMemo
105+
, memoInput
106+
, MemoInput
107+
108+
, useRef
109+
, getRef
110+
, setRef
111+
, Ref
112+
113+
, useImperativeMethods
114+
, imperativeMethodsInput
115+
, ImperativeMethodsInput
116+
117+
, useMutationEffect
118+
, mutationEffectInput
119+
, MutationEffectInput
120+
121+
, useLayoutEffect
122+
, layoutEffectInput
123+
, LayoutEffectInput
124+
) as React
125+
78126
-- | Name of a tag.
79127
type TagName = String
80128

@@ -463,3 +511,10 @@ type ContextConsumer a = ReactClass { children :: a -> ReactElement }
463511

464512
-- | Create a new context provider/consumer pair given a default value.
465513
foreign import createContext :: forall a. a -> Context a
514+
515+
-- | Create an element from a function using Hooks.
516+
foreign import createElementHooks
517+
:: forall props
518+
. { | props }
519+
-> ({ | props } -> Effect ReactElement)
520+
-> ReactElement

src/React/Hooks.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
'use strict';
2+
3+
var React = require('react');
4+
5+
exports.useState_ = function useState_(Tuple, initialState) {
6+
var result = React.useState(initialState);
7+
8+
var state = result[0];
9+
10+
var setState = result[1];
11+
12+
var tuple = Tuple(state)(setState);
13+
14+
return tuple;
15+
};
16+
17+
exports.useEffect_ = function useEffect_(effect, inputs) {
18+
var result = inputs ? React.useEffect(effect, inputs) : React.useEffect(effect);
19+
20+
return result;
21+
};
22+
23+
exports.useContext_ = function useContext_(context) {
24+
var result = React.useContext(context);
25+
26+
return result;
27+
}
28+
29+
exports.useReducer_ = function useReducer_(Tuple, reducer, initialState) {
30+
var result = React.useReducer(reducer, initialState);
31+
32+
var state = result[0];
33+
34+
var dispatch = result[1];
35+
36+
var tuple = Tuple(state)(dispatch);
37+
38+
return tuple;
39+
};
40+
41+
exports.useReducerLazy_ = function useReducerLazy_(Tuple, reducer, initialState, initialAction) {
42+
var result = React.useReducer(reducer, initialState, initialAction);
43+
44+
var state = result[0];
45+
46+
var dispatch = result[1];
47+
48+
var tuple = Tuple(state)(dispatch);
49+
50+
return tuple;
51+
};
52+
53+
exports.useCallback_ = function useCallback_(callback, inputs) {
54+
var result = inputs ? React.useCallback(callback, inputs) : React.useCallback(callback);
55+
56+
return result;
57+
};
58+
59+
exports.useMemo_ = function useMemo_(memo, inputs) {
60+
var result = inputs ? React.useMemo(memo, inputs) : React.useMemo(memo);
61+
62+
return result;
63+
};
64+
65+
exports.useRef_ = function useRef_(initialValue) {
66+
var result = React.useRef(initialValue);
67+
68+
return result;
69+
}
70+
71+
exports.setRef_ = function setRef_(ref, value) {
72+
ref.current = value;
73+
}
74+
75+
exports.useImperativeMethods_ = function useImperativeMethods_(ref, imperativeMethods, inputs) {
76+
var result = inputs ? React.useImperativeMethods(ref, imperativeMethods, inputs) : React.useImperativeMethods(ref, imperativeMethods);
77+
78+
return result;
79+
};
80+
81+
exports.useMutationEffect_ = function useMutationEffect_(mutationEffect, inputs) {
82+
var result = inputs ? React.useMutationEffect(mutationEffect, inputs) : React.useMutationEffect(mutationEffect);
83+
84+
return result;
85+
};
86+
87+
exports.useLayoutEffect_ = function useLayoutEffect_(layoutEffect, inputs) {
88+
var result = inputs ? React.useLayoutEffect(layoutEffect, inputs) : React.useLayoutEffect(layoutEffect);
89+
90+
return result;
91+
};

0 commit comments

Comments
 (0)