roc/examples/virtual-dom-wip/platform/client-side.roc
2022-12-26 15:00:27 +00:00

45 lines
1.6 KiB
Text

platform "client-side"
requires {} { app : App state initData }
exposes []
packages {}
imports [
Html.Internal.Shared.{ App },
Html.Internal.Client.{ PlatformState, initClientApp, dispatchEvent },
Effect.{ Effect },
]
provides [main]
# Fields sorted by alignment, then alphabetically
FromHost state initData : {
eventHandlerId : Nat,
eventJsonList : List (List U8),
eventPlatformState : Box (PlatformState state initData),
initJson : List U8,
isInitEvent : Bool,
}
# Fields sorted by alignment, then alphabetically
ToHost state initData : {
platformState : Box (PlatformState state initData),
eventPreventDefault : Bool,
eventStopPropagation : Bool,
}
# TODO: naming the type variables causes a type 'mismatch'
# main : FromHost state initData -> Effect (ToHost state initData) | initData has Decoding & Encoding
main : FromHost _ _ -> Effect (ToHost _ _)
main = \fromHost ->
if fromHost.isInitEvent then
initClientApp fromHost.initJson app
|> Effect.map \platformState -> {
platformState: Box.box platformState,
eventPreventDefault: Bool.false,
eventStopPropagation: Bool.false,
}
else
dispatchEvent (Box.unbox fromHost.eventPlatformState) fromHost.eventJsonList fromHost.eventHandlerId
|> Effect.map \jsEventResult -> {
platformState: Box.box jsEventResult.platformState,
eventPreventDefault: jsEventResult.preventDefault,
eventStopPropagation: jsEventResult.stopPropagation,
}