{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE RankNTypes #-} module Glazier.React.Command ( basicRenderCmd ) where import Control.Lens import Control.Monad.State.Strict import qualified GHCJS.Types as J import qualified JavaScript.Extras as JE -- | Just change the state to something different so the React pureComponent will call render() -- renderCmd :: Monad m => (sm -> [JE.Property] -> J.JSVal -> cmd) -> G.GadgetT act sm m cmd -- The resulting command should be interpreted using 'componentSetState' basicRenderCmd :: MonadState sm m => Lens' sm Int -- -> Getter sm Int -> Getter sm J.JSVal -> (sm -> [JE.Property] -> J.JSVal -> cmd) -> m cmd basicRenderCmd frameNum componentRef fcmd = do frameNum %= (\i -> (i `mod` JE.maxSafeInteger) + 1) i <- JE.toJS <$> use frameNum r <- use componentRef sm <- get pure $ fcmd sm [("frameNum", i)] r