mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-14 07:45:04 +00:00
45 lines
1.6 KiB
Text
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,
|
|
}
|