From 18fbdd5926b58d845f1b6383b88ff8ea637b5adf Mon Sep 17 00:00:00 2001 From: Marcin Szamotulski Date: Wed, 12 Jul 2017 21:06:43 +0200 Subject: [PATCH 1/4] add forceUpdate function --- src/React.js | 6 ++++++ src/React.purs | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/React.js b/src/React.js index b4fee1e..0bba915 100644 --- a/src/React.js +++ b/src/React.js @@ -122,6 +122,12 @@ function createClass(spec) { } exports.createClass = createClass; +function forceUpdateImpl(this_) { + this_.forceUpdate(); + return {}; +}; +exports.forceUpdateImpl = forceUpdateImpl + function handle(f) { return function(e){ return f(e)(); diff --git a/src/React.purs b/src/React.purs index d3c9d63..ba6f240 100644 --- a/src/React.purs +++ b/src/React.purs @@ -50,6 +50,8 @@ module React , writeStateWithCallback , transformState + , forceUpdate + , handle , preventDefault , stopPropagation @@ -335,6 +337,14 @@ createClassStateless' k = createClassStateless \props -> k props (childrenToArray (unsafeCoerce props).children) +foreign import forceUpdateImpl :: forall eff props state. + EffFn1 eff (ReactThis props state) Unit + +-- | Force render of a react component. +forceUpdate :: forall eff props state. + ReactThis props state -> Eff eff Unit +forceUpdate this = runEffFn1 forceUpdateImpl this + -- | Create an event handler. foreign import handle :: forall eff ev props state result. (ev -> EventHandlerContext eff props state result) -> EventHandler ev From daf333b7c03766e4e518aca05abd3543d73de2c1 Mon Sep 17 00:00:00 2001 From: Marcin Szamotulski Date: Wed, 12 Jul 2017 23:06:11 +0200 Subject: [PATCH 2/4] forceUpdateCb --- src/React.js | 8 ++++++++ src/React.purs | 14 ++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/src/React.js b/src/React.js index 0bba915..24b2742 100644 --- a/src/React.js +++ b/src/React.js @@ -128,6 +128,14 @@ function forceUpdateImpl(this_) { }; exports.forceUpdateImpl = forceUpdateImpl +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 ba6f240..98c4d39 100644 --- a/src/React.purs +++ b/src/React.purs @@ -51,6 +51,7 @@ module React , transformState , forceUpdate + , forceUpdateCb , handle , preventDefault @@ -67,7 +68,9 @@ module React ) where import Prelude + import Control.Monad.Eff (kind Effect, Eff) +import Control.Monad.Eff.Uncurried (EffFn1, EffFn2, runEffFn1, runEffFn2) import Unsafe.Coerce (unsafeCoerce) -- | Name of a tag. @@ -345,6 +348,17 @@ forceUpdate :: forall eff props state. ReactThis props state -> Eff eff Unit forceUpdate this = runEffFn1 forceUpdateImpl this +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 From 660f9368873164427a6ecadf418673819c833872 Mon Sep 17 00:00:00 2001 From: Marcin Szamotulski Date: Thu, 13 Jul 2017 10:04:51 +0200 Subject: [PATCH 3/4] forceUpdate: implement using forceUpdateCb --- src/React.purs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/React.purs b/src/React.purs index 98c4d39..7bbd777 100644 --- a/src/React.purs +++ b/src/React.purs @@ -70,7 +70,7 @@ module React import Prelude import Control.Monad.Eff (kind Effect, Eff) -import Control.Monad.Eff.Uncurried (EffFn1, EffFn2, runEffFn1, runEffFn2) +import Control.Monad.Eff.Uncurried (EffFn2, runEffFn2) import Unsafe.Coerce (unsafeCoerce) -- | Name of a tag. @@ -340,13 +340,10 @@ createClassStateless' k = createClassStateless \props -> k props (childrenToArray (unsafeCoerce props).children) -foreign import forceUpdateImpl :: forall eff props state. - EffFn1 eff (ReactThis props state) Unit - -- | Force render of a react component. forceUpdate :: forall eff props state. ReactThis props state -> Eff eff Unit -forceUpdate this = runEffFn1 forceUpdateImpl this +forceUpdate this = forceUpdateCb this (pure unit) foreign import forceUpdateCbImpl :: forall eff e props state. EffFn2 eff From 0eb99b7df2ce7ca1ea64eadfd0d9ab89ca29bcaf Mon Sep 17 00:00:00 2001 From: Marcin Szamotulski Date: Thu, 13 Jul 2017 21:05:13 +0200 Subject: [PATCH 4/4] remove forceUpdateImpl from ffi --- src/React.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/React.js b/src/React.js index 24b2742..8ce9422 100644 --- a/src/React.js +++ b/src/React.js @@ -122,12 +122,6 @@ function createClass(spec) { } exports.createClass = createClass; -function forceUpdateImpl(this_) { - this_.forceUpdate(); - return {}; -}; -exports.forceUpdateImpl = forceUpdateImpl - function forceUpdateCbImpl(this_, cb) { this_.forceUpdate(function() { return cb();