packages feed

react-0.1.0.0: src/React/Component.hs

module React.Component where

import Control.Monad.Except
import Control.Monad.Reader
import Language.Javascript.JSaddle hiding (Ref)

import React.JSaddle
import React.Types

--TODO: The Hook section shouldn't have any control flow to it; probably it also shouldn't depend on props except in specific ways
component
  :: FromJSVal props
  => (props -> Hook Element)
  -> ReaderT React JSM (Component props ())
component hook = do
  react <- ask
  f <- lift $ function' $ \_ _ args -> flip runReaderT react $ do
    let propsVal = case args of
          [] -> jsUndefined
          arg0 : _ -> arg0
    props <- liftJSM $ fromJSVal propsVal >>= \case
      Nothing -> fail "Invalid props"
      Just props -> pure props
    e <- unHook $ hook props
    unElement e
  pure $ Component f