roc/examples/virtual-dom-wip/platform/client-side.roc
2024-06-25 00:03:56 -07:00

44 lines
1.5 KiB
Text

platform "client-side"
requires {} { app : App state initData }
exposes []
packages {}
imports [
Html.Internal.Shared.{ App },
Html.Internal.Client.{ PlatformState, initClientApp, dispatchEvent },
]
provides [main]
# Fields sorted by alignment, then alphabetically
FromHost state initData : {
eventHandlerId : U64,
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) where initData implements Decoding & Encoding
main : FromHost _ _ -> Task (ToHost _ _) *
main = \fromHost ->
if fromHost.isInitEvent then
initClientApp fromHost.initJson app
|> Task.map \platformState -> {
platformState: Box.box platformState,
eventPreventDefault: Bool.false,
eventStopPropagation: Bool.false,
}
else
dispatchEvent (Box.unbox fromHost.eventPlatformState) fromHost.eventJsonList fromHost.eventHandlerId
|> Task.map \jsEventResult -> {
platformState: Box.box jsEventResult.platformState,
eventPreventDefault: jsEventResult.preventDefault,
eventStopPropagation: jsEventResult.stopPropagation,
}