More massive workstuff for completion :P
This commit is contained in:
parent
7a8acf27a7
commit
3385118b14
20 changed files with 325 additions and 354 deletions
|
|
@ -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(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue