62 lines
1.5 KiB
Text
62 lines
1.5 KiB
Text
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
|