diff --git a/docs/React.md b/docs/React.md index cc41134..7d9d333 100644 --- a/docs/React.md +++ b/docs/React.md @@ -155,7 +155,7 @@ A rendering function. #### `UISpec` ``` purescript -type UISpec props state eff = { render :: Render props state eff, displayName :: String, getInitialState :: UIRef -> Eff (props :: ReactProps props, state :: ReactState Disallowed state, refs :: ReactRefs Disallowed | eff) state, componentWillMount :: UIRef -> Eff (props :: ReactProps props, state :: ReactState ReadWrite state, refs :: ReactRefs Disallowed | eff) Unit, componentDidMount :: UIRef -> Eff (props :: ReactProps props, state :: ReactState ReadWrite state, refs :: ReactRefs ReadOnly | eff) Unit, componentWillReceiveProps :: UIRef -> Eff (props :: ReactProps props, state :: ReactState ReadWrite state, refs :: ReactRefs ReadOnly | eff) Unit, shouldComponentUpdate :: UIRef -> Eff (props :: ReactProps props, state :: ReactState ReadWrite state, refs :: ReactRefs ReadOnly | eff) Boolean, componentWillUpdate :: UIRef -> Eff (props :: ReactProps props, state :: ReactState ReadWrite state, refs :: ReactRefs ReadOnly | eff) Unit, componentDidUpdate :: UIRef -> Eff (props :: ReactProps props, state :: ReactState ReadOnly state, refs :: ReactRefs ReadOnly | eff) Unit, componentWillUnmount :: UIRef -> Eff (props :: ReactProps props, state :: ReactState ReadOnly state, refs :: ReactRefs ReadOnly | eff) Unit } +type UISpec props state eff = { render :: Render props state eff, displayName :: String, getInitialState :: UIRef -> Eff (props :: ReactProps props, state :: ReactState Disallowed state, refs :: ReactRefs Disallowed | eff) state, componentWillMount :: UIRef -> Eff (props :: ReactProps props, state :: ReactState ReadWrite state, refs :: ReactRefs Disallowed | eff) Unit, componentDidMount :: UIRef -> Eff (props :: ReactProps props, state :: ReactState ReadWrite state, refs :: ReactRefs ReadOnly | eff) Unit, componentWillReceiveProps :: UIRef -> props -> Eff (props :: ReactProps props, state :: ReactState ReadWrite state, refs :: ReactRefs ReadOnly | eff) Unit, shouldComponentUpdate :: UIRef -> props -> state -> Eff (props :: ReactProps props, state :: ReactState ReadWrite state, refs :: ReactRefs ReadOnly | eff) Boolean, componentWillUpdate :: UIRef -> props -> state -> Eff (props :: ReactProps props, state :: ReactState ReadWrite state, refs :: ReactRefs ReadOnly | eff) Unit, componentDidUpdate :: UIRef -> props -> state -> Eff (props :: ReactProps props, state :: ReactState ReadOnly state, refs :: ReactRefs ReadOnly | eff) Unit, componentWillUnmount :: UIRef -> Eff (props :: ReactProps props, state :: ReactState ReadOnly state, refs :: ReactRefs ReadOnly | eff) Unit } ``` A specification of a component. diff --git a/src/React.js b/src/React.js index d5b17e5..2222024 100644 --- a/src/React.js +++ b/src/React.js @@ -41,6 +41,34 @@ exports.mkUI = function(ss) { if (s === "displayName") { result[s] = ss[s]; } + else if (s === "componentWillReceiveProps") { + result[s] = (function(impl) { + return function(nextProps) { + return impl(this)(nextProps)(); + } + })(ss[s]); + } + else if (s === "shouldComponentUpdate") { + result[s] = (function(impl) { + return function(nextProps, nextState) { + return impl(this)(nextProps)(nextState.state)(); + } + })(ss[s]); + } + else if (s === "componentWillUpdate") { + result[s] = (function(impl) { + return function(nextProps, nextState) { + return impl(this)(nextProps)(nextState.state)(); + } + })(ss[s]); + } + else if (s === "componentDidUpdate") { + result[s] = (function(impl) { + return function(prevProps, prevState) { + return impl(this)(prevProps)(prevState.state)(); + } + })(ss[s]); + } else { result[s] = (function(impl) { return function() { diff --git a/src/React.purs b/src/React.purs index 6f4bd5c..967201e 100644 --- a/src/React.purs +++ b/src/React.purs @@ -167,6 +167,7 @@ type UISpec props state eff = ) Unit , componentWillReceiveProps :: UIRef -> + props -> Eff ( props :: ReactProps props , state :: ReactState ReadWrite state , refs :: ReactRefs ReadOnly @@ -174,6 +175,8 @@ type UISpec props state eff = ) Unit , shouldComponentUpdate :: UIRef -> + props -> + state -> Eff ( props :: ReactProps props , state :: ReactState ReadWrite state , refs :: ReactRefs ReadOnly @@ -181,6 +184,8 @@ type UISpec props state eff = ) Boolean , componentWillUpdate :: UIRef -> + props -> + state -> Eff ( props :: ReactProps props , state :: ReactState ReadWrite state , refs :: ReactRefs ReadOnly @@ -188,6 +193,8 @@ type UISpec props state eff = ) Unit , componentDidUpdate :: UIRef -> + props -> + state -> Eff ( props :: ReactProps props , state :: ReactState ReadOnly state , refs :: ReactRefs ReadOnly @@ -210,10 +217,10 @@ spec st render = , getInitialState: \_ -> pure st , componentWillMount: \_ -> return unit , componentDidMount: \_ -> return unit - , componentWillReceiveProps: \_ -> return unit - , shouldComponentUpdate: \_ -> return true - , componentWillUpdate: \_ -> return unit - , componentDidUpdate: \_ -> return unit + , componentWillReceiveProps: \_ _ -> return unit + , shouldComponentUpdate: \_ _ _ -> return true + , componentWillUpdate: \_ _ _ -> return unit + , componentDidUpdate: \_ _ _ -> return unit , componentWillUnmount: \_ -> return unit }