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-27 22:44:59 -04:00
|
|
|
|
2024-08-19 18:40:22 -04:00
|
|
|
create_effect(move |_| {
|
2024-08-27 22:44:59 -04:00
|
|
|
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-27 22:44:59 -04:00
|
|
|
|
2024-08-19 18:40:22 -04:00
|
|
|
create_effect(move |_| {
|
2024-08-27 22:44:59 -04:00
|
|
|
set_websocket_send.set_untracked(to_string(&GameJoinRequest { id: join_id() }).unwrap());
|
2024-08-19 18:40:22 -04:00
|
|
|
});
|
2024-08-27 22:44:59 -04:00
|
|
|
|
2024-08-19 18:40:22 -04:00
|
|
|
create_effect(move |_| {
|
2024-08-27 22:44:59 -04:00
|
|
|
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! {
|
2024-08-27 22:44:59 -04:00
|
|
|
<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>
|
|
|
|
}
|
|
|
|
}
|