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 :: (props -> Hook Element) -> ReaderT React JSM (Component props ())
component props -> Hook Element
hook = do
  React
react <- ReaderT React JSM React
forall r (m :: * -> *). MonadReader r m => m r
ask
  Function'
f <- JSM Function' -> ReaderT React JSM Function'
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (JSM Function' -> ReaderT React JSM Function')
-> JSM Function' -> ReaderT React JSM Function'
forall a b. (a -> b) -> a -> b
$ JSCallAsFunction' -> JSM Function'
function' (JSCallAsFunction' -> JSM Function')
-> JSCallAsFunction' -> JSM Function'
forall a b. (a -> b) -> a -> b
$ \JSVal
_ JSVal
_ [JSVal]
args -> (ReaderT React JSM JSVal -> React -> JSM JSVal)
-> React -> ReaderT React JSM JSVal -> JSM JSVal
forall a b c. (a -> b -> c) -> b -> a -> c
flip ReaderT React JSM JSVal -> React -> JSM JSVal
forall r (m :: * -> *) a. ReaderT r m a -> r -> m a
runReaderT React
react (ReaderT React JSM JSVal -> JSM JSVal)
-> ReaderT React JSM JSVal -> JSM JSVal
forall a b. (a -> b) -> a -> b
$ do
    let propsVal :: JSVal
propsVal = case [JSVal]
args of
          [] -> JSVal
jsUndefined
          JSVal
arg0 : [JSVal]
_ -> JSVal
arg0
    props
props <- JSM props -> ReaderT React JSM props
forall (m :: * -> *) a. MonadJSM m => JSM a -> m a
liftJSM (JSM props -> ReaderT React JSM props)
-> JSM props -> ReaderT React JSM props
forall a b. (a -> b) -> a -> b
$ JSVal -> JSM (Maybe props)
forall a. FromJSVal a => JSVal -> JSM (Maybe a)
fromJSVal JSVal
propsVal JSM (Maybe props) -> (Maybe props -> JSM props) -> JSM props
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \case
      Maybe props
Nothing -> String -> JSM props
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"Invalid props"
      Just props
props -> props -> JSM props
forall (f :: * -> *) a. Applicative f => a -> f a
pure props
props
    Element
e <- Hook Element -> ReaderT React JSM Element
forall a. Hook a -> ReaderT React JSM a
unHook (Hook Element -> ReaderT React JSM Element)
-> Hook Element -> ReaderT React JSM Element
forall a b. (a -> b) -> a -> b
$ props -> Hook Element
hook props
props
    Element -> ReaderT React JSM JSVal
unElement Element
e
  Component props () -> ReaderT React JSM (Component props ())
forall (f :: * -> *) a. Applicative f => a -> f a
pure (Component props () -> ReaderT React JSM (Component props ()))
-> Component props () -> ReaderT React JSM (Component props ())
forall a b. (a -> b) -> a -> b
$ Function' -> Component props ()
forall props refVal. Function' -> Component props refVal
Component Function'
f