More massive workstuff for completion :P

This commit is contained in:
Lett Osprey 2026-04-10 19:36:28 +02:00
parent 7a8acf27a7
commit 3385118b14
20 changed files with 325 additions and 354 deletions

View file

@ -7,20 +7,17 @@ import lustre/element/html
import lustre/event
import lustre/server_component
import model.{
type Model, type Msg, AwaitPlayers, Empty, EnterPin, JoinLive, JoinSingle,
KeyPin, PickPlayer, SelectGamestyle, SelectedPlayer, SelectedRoom,
type Model, type Msg, type Room, Empty, EnterPin, JoinLive, JoinSingle, KeyPin,
SelectGamestyle, SelectedRoom,
}
import shared.{type Room}
pub fn view(model: Model) -> Element(Msg) {
case model.state {
Empty -> view_room_list(model.rooms)
EnterPin(_, _) -> view_enter_pin()
SelectGamestyle(_, _) -> view_live_or_single()
AwaitPlayers(_, _) -> html.text("FETCHING USERS FOR ROOM")
PickPlayer(_, _, players) -> view_player_list(players)
JoinLive(room:, pin:) -> view_join_live(room, pin)
JoinSingle(room:, pin:, player:) -> view_join_single(room, pin, player)
JoinSingle(room:, pin:) -> view_join_single(room, pin)
}
}
@ -65,38 +62,28 @@ fn view_room_list(items: List(Room)) -> Element(Msg) {
fn view_enter_pin() -> Element(Msg) {
layout("Enter PIN code for room", None, [
html.input([
attribute.type_("password"),
event.on_input(KeyPin),
attribute.autofocus(True),
]),
input_cell("[#ENTER PIN]", True, KeyPin),
])
}
fn view_join_live(room: String, pin: String) -> Element(Msg) {
html.div([attribute.class("terminal-section")], [
html.div([attribute.class("terminal-label mb-4")], [
server_component.element(
[server_component.route("/socket/live/" <> room)],
[],
),
server_component.element(
[server_component.route("/socket/control/" <> room)],
[],
),
]),
element.fragment([
server_component.element(
[server_component.route("/socket/live/" <> room)],
[],
),
server_component.element(
[server_component.route("/socket/control/" <> room)],
[],
),
])
}
fn view_join_single(room: String, pin: String, player: String) -> Element(Msg) {
html.div([attribute.class("terminal-section")], [
html.div([attribute.class("terminal-label mb-4")], [
server_component.element(
[server_component.route("/socket/single/" <> room)],
[],
),
]),
])
fn view_join_single(room: String, pin: String) -> Element(Msg) {
server_component.element(
[server_component.route("/socket/single/" <> room)],
[],
)
}
fn view_live_or_single() -> Element(Msg) {
@ -106,15 +93,27 @@ fn view_live_or_single() -> Element(Msg) {
])
}
fn view_player_list(items: List(String)) -> Element(Msg) {
layout("Select or enter your player", None, case items {
[] -> [html.text("No items in your list yet.")]
_ -> {
list.index_map(items, fn(item, index) {
click_cell(index, item, SelectedPlayer)
})
}
})
fn input_cell(
header: String,
password: Bool,
on_input: fn(String) -> Msg,
) -> Element(Msg) {
html.div([class("participant-login")], [
html.div([class("participant-name")], [
html.text("" <> header),
html.div([], [
html.input([
attribute.type_(case password {
True -> "password"
False -> "text"
}),
event.on_input(on_input),
attribute.autofocus(True),
]),
]),
]),
])
}
fn click_cell(