diff --git a/src/React.js b/src/React.js index b4fee1e..8ce9422 100644 --- a/src/React.js +++ b/src/React.js @@ -122,6 +122,14 @@ function createClass(spec) { } exports.createClass = createClass; +function forceUpdateCbImpl(this_, cb) { + this_.forceUpdate(function() { + return cb(); + }); + return {}; +}; +exports.forceUpdateCbImpl = forceUpdateCbImpl; + function handle(f) { return function(e){ return f(e)(); diff --git a/src/React.purs b/src/React.purs index d3c9d63..7bbd777 100644 --- a/src/React.purs +++ b/src/React.purs @@ -50,6 +50,9 @@ module React , writeStateWithCallback , transformState + , forceUpdate + , forceUpdateCb + , handle , preventDefault , stopPropagation @@ -65,7 +68,9 @@ module React ) where import Prelude + import Control.Monad.Eff (kind Effect, Eff) +import Control.Monad.Eff.Uncurried (EffFn2, runEffFn2) import Unsafe.Coerce (unsafeCoerce) -- | Name of a tag. @@ -335,6 +340,22 @@ createClassStateless' k = createClassStateless \props -> k props (childrenToArray (unsafeCoerce props).children) +-- | Force render of a react component. +forceUpdate :: forall eff props state. + ReactThis props state -> Eff eff Unit +forceUpdate this = forceUpdateCb this (pure unit) + +foreign import forceUpdateCbImpl :: forall eff e props state. + EffFn2 eff + (ReactThis props state) + (Eff e Unit) + Unit + +-- | Force render and then run an Eff computation. +forceUpdateCb :: forall eff props state. + ReactThis props state -> Eff eff Unit -> Eff eff Unit +forceUpdateCb this m = runEffFn2 forceUpdateCbImpl this m + -- | Create an event handler. foreign import handle :: forall eff ev props state result. (ev -> EventHandlerContext eff props state result) -> EventHandler ev