clean up stuff on disconnect

This commit is contained in:
Adam 2024-08-26 23:54:47 -04:00
parent 35afcf7dd4
commit 89344c6042
2 changed files with 185 additions and 171 deletions

View file

@ -60,185 +60,187 @@ pub fn Browser() -> impl IntoView {
view! { view! {
<div class="p-1"> <div class="p-1">
<h2 class="text-2xl">Game Browser</h2> <Show when=move || connected() fallback=|| view! { <p>Disconnected.</p> }>
<table class="min-w-full border border-collapse table-auto"> <h2 class="text-2xl">Game Browser</h2>
<thead> <div class="p-1">
<tr> <table class="min-w-full border border-collapse table-auto">
<th class="border-b">Name</th> <thead>
<th class="border-b">Host</th> <tr>
<th class="border-b">Players</th> <th class="border-b">Name</th>
<th class="border-b">Card Packs</th> <th class="border-b">Host</th>
<th class="border-b"></th> <th class="border-b">Players</th>
</tr> <th class="border-b">Card Packs</th>
</thead> <th class="border-b"></th>
{move || { </tr>
game_browser_context() </thead>
.iter() <For
.map(|game| { each=move || game_browser_context()
view! { key=|game| game.uuid.clone()
<tr> children=move |game| {
<td class="text-center border-b">{&game.name}</td> view! {
<td class="text-center border-b">{&game.host}</td> <tr>
<td class="text-center border-b"> <td class="text-center border-b">{&game.name}</td>
{&game.players.to_string()} <td class="text-center border-b">{&game.host}</td>
</td> <td class="text-center border-b">
<td class="text-center border-b"> {&game.players.to_string()}
{&game.packs.len().to_string()} </td>
</td> <td class="text-center border-b">
<td class="text-center border-b"> {&game.packs.len().to_string()}
<button </td>
type="button" <td class="text-center border-b">
value=&game.uuid <button
on:click=move |e| { type="button"
set_join_id(event_target_value(&e)); value=&game.uuid
} on:click=move |e| {
> set_join_id(event_target_value(&e));
Join }
</button> >
<button Join
type="button" </button>
value=&game.uuid <button
on:click=move |e| { type="button"
set_delete_id(event_target_value(&e)); value=&game.uuid
} on:click=move |e| {
> set_delete_id(event_target_value(&e));
Delete }
</button> >
</td> Delete
</tr> </button>
</td>
</tr>
}
} }
}) />
.collect_view() </table>
}}
</table>
</div>
<hr />
<div class="flex p-1">
<form onsubmit="return false" on:submit=new_game>
<h2 class="text-2xl">Create Game</h2>
<input
class="w-80 h-11 font-mono rounded-sm bg-neutral-900 text-neutral-200"
placeholder="Name"
disabled=move || !connected()
node_ref=new_game_name_ref
/>
<h2 class="text-2xl">Packs</h2>
<div class="p-2">
<button type="button" class="bg-neutral-600">
<input type="checkbox" id="all" />
<label for="all">All</label>
</button>
<button type="button" class="bg-neutral-600">
<input type="checkbox" id="official" checked />
<label for="official">Official</label>
</button>
<button type="button" class="bg-neutral-600" on:click=show_packs_button>
<label>Custom</label>
</button>
TODO: finish this
</div> </div>
<Show when=move || show_packs()> <hr />
<span class="flex">
<div>
<h2 class="text-xl">Official</h2>
{move || {
card_packs()
.official_meta
.into_iter()
.map(|n| {
view! {
<input
type="checkbox"
value=n.pack
id=n.pack
checked
on:change=move |e| {
if event_target_checked(&e) {
logging::log!("insert");
set_selected_packs
.update(|packs| {
packs.insert(n.pack);
})
} else {
logging::log!("remove");
set_selected_packs
.update(|packs| {
packs.remove(&n.pack);
})
}
}
/>
<label for=n.pack>{n.name}</label>
<br />
// hax
{set_selected_packs
.update(|packs| {
packs.insert(n.pack);
})}
}
})
.collect_view()
}}
<div class="flex p-1">
<form onsubmit="return false" on:submit=new_game>
<h2 class="text-2xl">Create Game</h2>
<input
class="w-80 h-11 font-mono rounded-sm bg-neutral-900 text-neutral-200"
placeholder="Name"
disabled=move || !connected()
node_ref=new_game_name_ref
/>
<h2 class="text-2xl">Packs</h2>
<div class="p-2">
<button type="button" class="bg-neutral-600">
<input type="checkbox" id="all" />
<label for="all">All</label>
</button>
<button type="button" class="bg-neutral-600">
<input type="checkbox" id="official" checked />
<label for="official">Official</label>
</button>
<button type="button" class="bg-neutral-600" on:click=show_packs_button>
<label>Custom</label>
</button>
TODO: finish this
</div> </div>
<div> <Show when=move || show_packs()>
<h2 class="text-xl">Unofficial</h2> <span class="flex">
{move || { <div>
card_packs() <h2 class="text-xl">Official</h2>
.unofficial_meta {move || {
.into_iter() card_packs()
.map(|n| { .official_meta
view! { .into_iter()
<input .map(|n| {
checked view! {
type="checkbox" <input
value=n.pack type="checkbox"
id=n.pack value=n.pack
on:change=move |e| { id=n.pack
if event_target_checked(&e) { checked
logging::log!("insert"); on:change=move |e| {
set_selected_packs if event_target_checked(&e) {
.update(|packs| { logging::log!("insert");
packs.insert(n.pack); set_selected_packs
}) .update(|packs| {
} else { packs.insert(n.pack);
logging::log!("remove"); })
set_selected_packs } else {
.update(|packs| { logging::log!("remove");
packs.remove(&n.pack); set_selected_packs
}) .update(|packs| {
} packs.remove(&n.pack);
})
}
}
/>
<label for=n.pack>{n.name}</label>
<br />
// hax
{set_selected_packs
.update(|packs| {
packs.insert(n.pack);
})}
} }
/> })
.collect_view()
}}
<label for=n.pack>{n.name}</label> </div>
<br /> <div>
<h2 class="text-xl">Unofficial</h2>
{move || {
card_packs()
.unofficial_meta
.into_iter()
.map(|n| {
view! {
<input
checked
type="checkbox"
value=n.pack
id=n.pack
on:change=move |e| {
if event_target_checked(&e) {
logging::log!("insert");
set_selected_packs
.update(|packs| {
packs.insert(n.pack);
})
} else {
logging::log!("remove");
set_selected_packs
.update(|packs| {
packs.remove(&n.pack);
})
}
}
/>
// hax <label for=n.pack>{n.name}</label>
{set_selected_packs <br />
.update(|packs| {
packs.insert(n.pack);
})}
}
})
.collect_view()
}}
</div> // hax
</span> {set_selected_packs
</Show> .update(|packs| {
packs.insert(n.pack);
})}
}
})
.collect_view()
}}
<input </div>
class="py-2 px-4 pl-4 font-bold text-white rounded border-b-4 bg-neutral-600 border-neutral-800 hover:bg-neutral-700 hover:border-neutral-500" </span>
type="submit" </Show>
disabled=move || !connected()
value="New Game" <input
/> class="py-2 px-4 pl-4 font-bold text-white rounded border-b-4 bg-neutral-600 border-neutral-800 hover:bg-neutral-700 hover:border-neutral-500"
</form> type="submit"
disabled=move || !connected()
value="New Game"
/>
</form>
</div>
</Show>
</div> </div>
} }
} }

View file

@ -54,9 +54,10 @@ pub fn Websocket() -> impl IntoView {
Rc::new(close.clone()), Rc::new(close.clone()),
)); ));
// TODO: This context stuff can probably be done better let connected = move || ready_state.get() == ConnectionReadyState::Open;
// Contexts for message handler // Contexts for message handler
// TODO: This context stuff can probably be done better
let (state_summary, set_state_summary) = let (state_summary, set_state_summary) =
create_signal::<Option<ServerStateSummary>>(Option::None); create_signal::<Option<ServerStateSummary>>(Option::None);
let (active_games, set_active_games) = create_signal::<Vec<GameBrowserMeta>>(vec![]); let (active_games, set_active_games) = create_signal::<Vec<GameBrowserMeta>>(vec![]);
@ -70,6 +71,17 @@ pub fn Websocket() -> impl IntoView {
unofficial_meta: vec![], unofficial_meta: vec![],
}); });
create_effect(move |_| {
if !connected() {
set_active_games.set_untracked(vec![]);
set_user_update.set_untracked(None);
set_chat_update.set_untracked(None);
set_judge_round.set_untracked(None);
set_chat_message.set_untracked(None);
set_current_game.set_untracked(None);
}
});
provide_context::<ReadSignal<CardPacksMeta>>(card_packs_meta); provide_context::<ReadSignal<CardPacksMeta>>(card_packs_meta);
provide_context::<ReadSignal<Option<UserUpdate>>>(user_update); provide_context::<ReadSignal<Option<UserUpdate>>>(user_update);
provide_context::<ReadSignal<Option<ChatUpdate>>>(chat_update); provide_context::<ReadSignal<Option<ChatUpdate>>>(chat_update);