{-# LANGUAGE CPP #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Glazier.React.Component.Internal
( ShimComponent(..)
, shimComponent
, rerenderShim
, ComponentRef(..)
) where
import Control.DeepSeq
import Data.String
import qualified GHC.Generics as G
import qualified GHCJS.Marshal.Pure as J
import qualified GHCJS.Types as J
import qualified JavaScript.Extras as JE
newtype ShimComponent = ShimComponent JE.JSRep
deriving (G.Generic, Show, J.IsJSVal, J.PToJSVal, JE.ToJS, IsString, NFData)
shimComponent :: ShimComponent
shimComponent = ShimComponent js_shimComponent
rerenderShim :: ComponentRef -> IO ()
rerenderShim = js_rerenderShim
newtype ComponentRef = ComponentRef JE.JSRep
deriving (G.Generic, Show, J.IsJSVal, J.PToJSVal, JE.ToJS, IsString, NFData)
instance JE.FromJS ComponentRef where
fromJS a | js_isReactComponent a = Just $ ComponentRef $ JE.JSRep a
fromJS _ = Nothing
#ifdef __GHCJS__
foreign import javascript unsafe
"$r = hgr$shimComponent();"
js_shimComponent :: JE.JSRep
foreign import javascript unsafe
"!(!($1 && !(!($1['isReactComponent']))))"
js_isReactComponent :: J.JSVal -> Bool
foreign import javascript unsafe
"if ($1 && $1['rerender']) { $1['rerender']() };"
js_rerenderShim :: ComponentRef -> IO ()
#else
js_shimComponent :: JE.JSRep
js_shimComponent = JE.JSRep J.nullRef
js_isReactComponent :: J.JSVal -> Bool
js_isReactComponent _ = False
js_rerenderShim :: ComponentRef -> IO ()
js_rerenderShim _ = pure ()
#endif