module React.Element where

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

import React.Misc
import React.Types

createElement :: Tag -> Map Text JSVal -> [Element] -> Element
createElement :: Tag -> Map Text JSVal -> [Element] -> Element
createElement Tag
etag Map Text JSVal
props [Element]
children = ReaderT React JSM JSVal -> Element
Element (ReaderT React JSM JSVal -> Element)
-> ReaderT React JSM JSVal -> Element
forall a b. (a -> b) -> a -> b
$ do
  React
react <- ReaderT React JSM React
forall r (m :: * -> *). MonadReader r m => m r
ask
  [JSVal]
createdChildren <- (Element -> ReaderT React JSM JSVal)
-> [Element] -> ReaderT React JSM [JSVal]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM Element -> ReaderT React JSM JSVal
unElement [Element]
children
  JSM JSVal -> ReaderT React JSM JSVal
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (JSM JSVal -> ReaderT React JSM JSVal)
-> JSM JSVal -> ReaderT React JSM JSVal
forall a b. (a -> b) -> a -> b
$ React
react React -> Text -> [JSM JSVal] -> JSM JSVal
forall this name args.
(MakeObject this, ToJSString name, MakeArgs args) =>
this -> name -> args -> JSM JSVal
# Text -> Text
t Text
"createElement" ([JSM JSVal] -> JSM JSVal) -> [JSM JSVal] -> JSM JSVal
forall a b. (a -> b) -> a -> b
$ [JSVal -> JSM JSVal
forall (f :: * -> *) a. Applicative f => a -> f a
pure (JSVal -> JSM JSVal) -> JSVal -> JSM JSVal
forall a b. (a -> b) -> a -> b
$ Tag -> JSVal
unTag Tag
etag, Map Text JSVal -> JSM JSVal
forall a. ToJSVal a => a -> JSM JSVal
toJSVal Map Text JSVal
props] [JSM JSVal] -> [JSM JSVal] -> [JSM JSVal]
forall a. Semigroup a => a -> a -> a
<> (JSVal -> JSM JSVal) -> [JSVal] -> [JSM JSVal]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap JSVal -> JSM JSVal
forall (f :: * -> *) a. Applicative f => a -> f a
pure [JSVal]
createdChildren

createFragment :: [Element] -> Element
createFragment :: [Element] -> Element
createFragment = Map Text JSVal -> [Element] -> Element
createFragmentWithProps Map Text JSVal
forall a. Monoid a => a
mempty

createFragmentWithProps :: Map Text JSVal -> [Element] -> Element
createFragmentWithProps :: Map Text JSVal -> [Element] -> Element
createFragmentWithProps Map Text JSVal
props [Element]
children = ReaderT React JSM JSVal -> Element
Element (ReaderT React JSM JSVal -> Element)
-> ReaderT React JSM JSVal -> Element
forall a b. (a -> b) -> a -> b
$ do
  React
react <- ReaderT React JSM React
forall r (m :: * -> *). MonadReader r m => m r
ask
  Tag
fragmentTag <- JSM Tag -> ReaderT React JSM Tag
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
(MonadTrans t, Monad m) =>
m a -> t m a
lift (JSM Tag -> ReaderT React JSM Tag)
-> JSM Tag -> ReaderT React JSM Tag
forall a b. (a -> b) -> a -> b
$ (JSVal -> Tag) -> JSM JSVal -> JSM Tag
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap JSVal -> Tag
Tag (JSM JSVal -> JSM Tag) -> JSM JSVal -> JSM Tag
forall a b. (a -> b) -> a -> b
$ React
react React -> Text -> JSM JSVal
forall this name.
(MakeObject this, ToJSString name) =>
this -> name -> JSM JSVal
! Text -> Text
t Text
"Fragment"
  Element -> ReaderT React JSM JSVal
unElement (Element -> ReaderT React JSM JSVal)
-> Element -> ReaderT React JSM JSVal
forall a b. (a -> b) -> a -> b
$ Tag -> Map Text JSVal -> [Element] -> Element
createElement Tag
fragmentTag Map Text JSVal
props [Element]
children