espial/purs/src/Component/RawHtml.purs
Jon Schoning 2e3e7097e6 init
2019-01-30 20:54:47 -06:00

63 lines
1.5 KiB
Plaintext

module Component.RawHtml where
import Prelude
import Data.Foldable (for_)
import Data.Maybe (Maybe(..))
import Effect (Effect)
import Effect.Aff (Aff)
import Globals (RawHTML(..))
import Halogen as H
import Halogen.HTML as HH
import Halogen.HTML.Events as HE
import Halogen.HTML.Properties as HP
import Web.HTML (HTMLElement)
foreign import unsafeSetInnerHTML :: HTMLElement -> RawHTML -> Effect Unit
data Query i a
= SetInnerHTML a
| Receive (Input i) a
type Input i = i
type Output = Void
type State i =
{ elRef :: H.RefLabel
, inputval :: Input i
}
component :: H.Component HH.HTML (Query String) (Input String) Output Aff
component = mkComponent RawHTML
mkComponent :: forall i. (Input i -> RawHTML) -> H.Component HH.HTML (Query i) (Input i) Output Aff
mkComponent toRawHTML = H.lifecycleComponent
{ initialState: \inputval -> { elRef: H.RefLabel "inputval", inputval }
, render
, eval
, receiver: HE.input Receive
, initializer: Just $ H.action SetInnerHTML
, finalizer: Nothing
}
where
render :: (State i) -> H.ComponentHTML (Query i)
render state =
HH.div
[ HP.ref state.elRef ]
[]
eval :: (Query i) ~> H.ComponentDSL (State i) (Query i) Output Aff
eval = case _ of
SetInnerHTML a -> do
{ elRef } <- H.get
mel <- H.getHTMLElementRef elRef
for_ mel \el -> do
{ inputval } <- H.get
H.liftEffect (unsafeSetInnerHTML el (toRawHTML inputval))
pure a
Receive inputval a -> do
H.modify_ _ { inputval = inputval }
eval $ SetInnerHTML a