@@ -2,10 +2,21 @@ module DynamicHtml.AddingState where
22
33import Prelude
44
5- import Effect ( Effect )
5+ -- Imports for lesson
66import Halogen.HTML as HH
7- import Scaffolding.DynamicRenderer.StateOnly (runStateOnlyDynamicRenderer )
8- import Scaffolding.StaticRenderer (StaticHTML )
7+
8+ -- Imports for scaffolding
9+ import Control.Monad.Error.Class (throwError )
10+ import Data.Const (Const )
11+ import Data.Maybe (maybe )
12+ import Effect (Effect )
13+ import Effect.Aff (Aff , launchAff_ )
14+ import Effect.Exception (error )
15+ import Halogen as H
16+ import Halogen.Aff (awaitLoad , selectElement )
17+ import Halogen.VDom.Driver (runUI )
18+ import Web.DOM.ParentNode (QuerySelector (..))
19+ import Web.HTML (HTMLElement )
920
1021main :: Effect Unit
1122main =
@@ -18,3 +29,50 @@ main =
1829simpleIntState :: Int -> StaticHTML
1930simpleIntState state =
2031 HH .div_ [ HH .text $ " The state was: " <> show state ]
32+
33+ -- Scaffolded code below --
34+
35+ -- | HTML written in Purescript via Halogen's HTML DSL
36+ -- | that is always rendered the same and does not include any event handling.
37+ type StaticHTML = H.ComponentHTML Unit () Aff
38+
39+ -- | A function that uses the `state` type's value to render HTML
40+ -- | with no event-handling.
41+ type StateOnlyDynamicRenderer state = (state -> StaticHTML )
42+
43+ -- | Uses the `state` type's value to render dynamic HTML
44+ -- | using 3 different state values.
45+ runStateOnlyDynamicRenderer :: forall state .
46+ state
47+ -> state
48+ -> state
49+ -> StateOnlyDynamicRenderer state
50+ -> Effect Unit
51+ runStateOnlyDynamicRenderer firstState secondState thirdState rendererFunction =
52+ launchAff_ do
53+ awaitLoad
54+
55+ div1 <- selectElement' " could not find 'div#first'" $ QuerySelector " #first"
56+ div2 <- selectElement' " could not find 'div#second'" $ QuerySelector " #second"
57+ div3 <- selectElement' " could not find 'div#third'" $ QuerySelector " #third"
58+
59+ void $ runUI (stateOnlyStaticComponent firstState rendererFunction) unit div1
60+ void $ runUI (stateOnlyStaticComponent secondState rendererFunction) unit div2
61+ void $ runUI (stateOnlyStaticComponent thirdState rendererFunction) unit div3
62+
63+ -- | Wraps Halogen types cleanly, so that one gets very clear compiler errors
64+ stateOnlyStaticComponent :: forall state .
65+ state
66+ -> StateOnlyDynamicRenderer state
67+ -> H.Component HH.HTML (Const Unit ) Unit Void Aff
68+ stateOnlyStaticComponent state dynamicRenderer =
69+ H .mkComponent
70+ { initialState: const state
71+ , render: dynamicRenderer
72+ , eval: H .mkEval H .defaultEval
73+ }
74+
75+ selectElement' :: String -> QuerySelector -> Aff HTMLElement
76+ selectElement' errorMessage query = do
77+ maybeElem <- selectElement query
78+ maybe (throwError (error errorMessage)) pure maybeElem
0 commit comments