cards/client/src/components/browser.rs

104 lines
4.4 KiB
Rust
Raw Normal View History

2024-07-28 02:36:04 -04:00
use crate::components::websocket::WebSocketContext;
2024-08-02 02:35:31 -04:00
use leptos::html::Input;
2024-07-28 02:36:04 -04:00
use leptos::*;
use leptos_use::core::ConnectionReadyState;
2024-08-04 18:14:10 -04:00
use lib::*;
2024-08-01 20:32:49 -04:00
use serde_json::to_string;
2024-08-04 04:01:31 -04:00
use std::collections::BTreeSet;
2024-07-28 02:36:04 -04:00
#[component]
pub fn Browser() -> impl IntoView {
2024-08-19 18:40:22 -04:00
// Websocket stuff
2024-07-28 02:36:04 -04:00
let websocket = expect_context::<WebSocketContext>();
2024-08-01 20:32:49 -04:00
let connected = move || websocket.ready_state.get() == ConnectionReadyState::Open;
2024-08-19 18:40:22 -04:00
let tx = websocket.clone();
let (websocket_send, set_websocket_send) = create_signal("".to_string());
2024-08-19 18:40:22 -04:00
create_effect(move |_| {
if websocket_send() != "".to_string() {
tx.send(&websocket_send());
}
2024-08-19 18:40:22 -04:00
});
2024-07-28 02:36:04 -04:00
2024-08-19 18:40:22 -04:00
// Browser stuff
2024-08-13 18:16:31 -04:00
let game_browser_context = expect_context::<ReadSignal<Vec<GameBrowserMeta>>>();
2024-08-19 18:40:22 -04:00
let (join_id, set_join_id) = create_signal("".to_string());
let (delete_id, set_delete_id) = create_signal("".to_string());
2024-08-19 18:40:22 -04:00
create_effect(move |_| {
set_websocket_send.set_untracked(to_string(&GameJoinRequest { id: join_id() }).unwrap());
2024-08-19 18:40:22 -04:00
});
2024-08-19 18:40:22 -04:00
create_effect(move |_| {
set_websocket_send.set_untracked(
2024-08-19 18:40:22 -04:00
to_string(&GameDeleteRequest {
delete_game_id: delete_id(),
})
.unwrap(),
);
});
2024-07-28 02:36:04 -04:00
view! {
<div class="my-2">
<h2 class="text-2xl">Game Browser</h2>
<p>"Yes, the delete button works. Please don't abuse it."</p>
<Show
when=move || { game_browser_context().len() > 0 }
fallback=|| view! { "No games to show right now.. Maybe you should create one!" }
>
2024-08-27 01:21:30 -04:00
<div>
2024-08-26 23:54:47 -04:00
<table class="min-w-full border border-collapse table-auto">
<thead>
<tr>
<th class="border-b">Name</th>
<th class="border-b">Host</th>
<th class="border-b">Players</th>
<th class="border-b">Card Packs</th>
<th class="border-b"></th>
</tr>
</thead>
<For
each=move || game_browser_context()
key=|game| game.uuid.clone()
children=move |game| {
view! {
<tr>
<td class="text-center border-b">{&game.name}</td>
<td class="text-center border-b">{&game.host}</td>
<td class="text-center border-b">
{&game.players.to_string()}
</td>
<td class="text-center border-b">
{&game.packs.len().to_string()}
</td>
<td class="text-center border-b">
<button
type="button"
value=&game.uuid
on:click=move |e| {
set_join_id(event_target_value(&e));
}
>
Join
</button>
<button
type="button"
value=&game.uuid
on:click=move |e| {
set_delete_id(event_target_value(&e));
}
>
Delete
</button>
</td>
</tr>
}
2024-08-13 18:16:31 -04:00
}
2024-08-26 23:54:47 -04:00
/>
</table>
2024-08-04 03:13:34 -04:00
</div>
2024-08-26 23:54:47 -04:00
</Show>
2024-07-28 02:36:04 -04:00
</div>
}
}