diff --git a/.tool-versions b/.tool-versions index f4b2af6..b33399a 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ -gleam 1.2.1 +gleam 1.3.0 erlang 27.0 diff --git a/src/aurinko/web/components/main.gleam b/src/aurinko/web/components/main.gleam index e0440ed..fe823ea 100644 --- a/src/aurinko/web/components/main.gleam +++ b/src/aurinko/web/components/main.gleam @@ -1,60 +1,68 @@ +import aurinko/updater/pubsub +import aurinko/updater/registry +import gleam/erlang/process import gleam/int +import gleam/io +import glubsub import lustre import lustre/attribute +import lustre/effect import lustre/element.{type Element} import lustre/element/html import lustre/event +import lustre/server_component import lustre/ui +pub type Params { + Params( + updater_pubsub: pubsub.UpdaterPubSub, + updater_registry: registry.UpdaterRegistry, + ) +} + // MAIN ------------------------------------------------------------------------ -pub fn app(_updater_pubsub, _updater_registry) { - lustre.simple(init, update, view) +pub fn app() { + lustre.application(init, update, view) } // MODEL ----------------------------------------------------------------------- -type Model = - Int +pub opaque type Model { + Model( + updater_pubsub: pubsub.UpdaterPubSub, + updater_registry: registry.UpdaterRegistry, + ) +} -fn init(initial_count: Int) -> Model { - case initial_count < 0 { - True -> 0 - False -> initial_count - } +fn init(params: Params) { + let self = process.new_subject() + let assert Ok(_) = glubsub.subscribe(params.updater_pubsub, self) + + let selector = + process.new_selector() + |> process.selecting(self, fn(m) { lustre.dispatch(UpdaterPubSub(m)) }) + let selector_effect = server_component.set_selector(selector) + + #(Model(params.updater_pubsub, params.updater_registry), selector_effect) } // UPDATE ---------------------------------------------------------------------- pub opaque type Msg { - Incr - Decr + UpdaterPubSub(pubsub.OutMessage) } -fn update(model: Model, msg: Msg) -> Model { - case msg { - Incr -> model + 1 - Decr -> model - 1 - } +fn update(model: Model, msg: Msg) { + io.debug("MSG UPDATE") + io.debug(msg) + #(model, effect.none()) } // VIEW ------------------------------------------------------------------------ -fn view(model: Model) -> Element(Msg) { - let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")] - let count = int.to_string(model) - - ui.centre( - [attribute.style(styles)], - ui.stack([], [ - ui.button([event.on_click(Incr)], [element.text("+")]), - html.slot([]), - html.p([attribute.style([#("text-align", "center")])], [ - element.text(count), - ]), - ui.button([event.on_click(Decr)], [element.text("-")]), - ]), - ) +fn view(model: Model) { + ui.stack([], []) } // fn send_initial_dataset( // conn: mist.WebsocketConnection, diff --git a/src/aurinko/web/index.gleam b/src/aurinko/web/index.gleam index 9dcc10f..980a7f9 100644 --- a/src/aurinko/web/index.gleam +++ b/src/aurinko/web/index.gleam @@ -10,6 +10,12 @@ pub fn view() { attribute.rel("stylesheet"), attribute.href("./static/lustre-ui.css"), ]), + html.link([ + attribute.rel("icon"), + attribute.href( + "data:image/svg+xml,🌅", + ), + ]), html.title([], "Aurinko"), ]), html.body([], [ diff --git a/src/aurinko/web/ws.gleam b/src/aurinko/web/ws.gleam index 8ace651..298fcbd 100644 --- a/src/aurinko/web/ws.gleam +++ b/src/aurinko/web/ws.gleam @@ -22,8 +22,9 @@ pub fn on_init( updater_registry: registry.UpdaterRegistry, ) { let self = process.new_subject() - let app = main.app(updater_pubsub, updater_registry) - let assert Ok(main_subject) = lustre.start_actor(app, 0) + let app = main.app() + let assert Ok(main_subject) = + lustre.start_actor(app, main.Params(updater_pubsub, updater_registry)) process.send( main_subject,