halogen-websocket-ipc-playzone/src/App/Container.purs

126 lines
3.8 KiB
Plaintext

module App.Container where
import Prelude
import Data.Maybe (Maybe(..))
import App.ComponentA as CA
import App.ComponentB as CB
import App.ComponentC as CC
import App.AuthenticationForm as AF
import App.OriginalInterface as OI
import Halogen as H
import Halogen.HTML as HH
import Halogen.HTML.Events as HE
import Halogen.HTML.Properties as HP
import Type.Proxy (Proxy(..))
import Effect.Aff.Class (class MonadAff)
data Action = ReadStates | Authenticated AF.Output
type State =
{ a :: Maybe Boolean
, b :: Maybe Int
, c :: Maybe String
, token :: Maybe String
}
type ChildSlots =
( a :: CA.Slot Unit
, b :: CB.Slot Unit
, c :: CC.Slot Unit
, af :: AF.Slot Unit
, oi :: OI.Slot Unit
)
_a = Proxy :: Proxy "a"
_b = Proxy :: Proxy "b"
_c = Proxy :: Proxy "c"
_af = Proxy :: Proxy "af"
_oi = Proxy :: Proxy "oi"
component :: forall q i o m. MonadAff m => H.Component q i o m
component =
H.mkComponent
{ initialState
, render
, eval: H.mkEval $ H.defaultEval { handleAction = handleAction }
}
initialState :: forall i. i -> State
initialState _ = { a: Nothing, b: Nothing, c: Nothing, token: Nothing }
render :: forall m. MonadAff m => State -> H.ComponentHTML Action ChildSlots m
render state = HH.div_ $
[ render_auth_form
, div_token
, render_original_interface
--, useless_stuff
]
where
div_token :: forall monad. MonadAff monad => H.ComponentHTML Action ChildSlots monad
div_token =
HH.div_ [
HH.p_ [ HH.text ("Token is: " <> show state.token) ]
]
render_auth_form :: forall monad. MonadAff monad => H.ComponentHTML Action ChildSlots monad
render_auth_form = case state.token of
Nothing -> HH.div
[ HP.class_ (H.ClassName "box") ]
[ HH.h1_ [ HH.text "Authentication form" ]
, HH.slot _af unit AF.component "ws://127.0.0.1:8081" Authenticated
]
Just current_token -> HH.div
[ HP.class_ (H.ClassName "box") ]
[ HH.p_ [ HH.text ("Token is: " <> current_token) ] ]
render_original_interface =
HH.div
[ HP.class_ (H.ClassName "box") ]
[ HH.h1_ [ HH.text "Original interface" ]
, HH.slot_ _oi unit OI.component "ws://127.0.0.1:8080"
]
-- useless_stuff :: forall monad. MonadAff monad => H.ComponentHTML Action ChildSlots monad
-- useless_stuff =
-- HH.div_ [
-- HH.div
-- [ HP.class_ (H.ClassName "box") ]
-- [ HH.h1_ [ HH.text "Component A" ]
-- , HH.slot_ _a unit CA.component unit
-- ]
-- , HH.div
-- [ HP.class_ (H.ClassName "box") ]
-- [ HH.h1_ [ HH.text "Component B" ]
-- , HH.slot_ _b unit CB.component unit
-- ]
-- , HH.div
-- [ HP.class_ (H.ClassName "box") ]
-- [ HH.h1_ [ HH.text "Component C" ]
-- , HH.slot_ _c unit CC.component unit
-- ]
-- , HH.p_
-- [ HH.text "Last observed states:" ]
-- , HH.ul_
-- [ HH.li_ [ HH.text ("Component A: " <> show state.a) ]
-- , HH.li_ [ HH.text ("Component B: " <> show state.b) ]
-- , HH.li_ [ HH.text ("Component C: " <> show state.c) ]
-- ]
-- , HH.button
-- [ HE.onClick \_ -> ReadStates ]
-- [ HH.text "Check states now" ]
-- ]
handleAction :: forall o monad. MonadAff monad => Action -> H.HalogenM State Action ChildSlots o monad Unit
handleAction = case _ of
Authenticated authaction -> case authaction of
AF.AuthToken newtoken -> do
-- TODO: do something more.
H.modify_ _ { token = Just newtoken }
ReadStates -> do
{ token } <- H.get
a <- H.request _a unit CA.IsOn
b <- H.request _b unit CB.GetCount
c <- H.request _c unit CC.GetValue
H.put { a, b, c, token }