2024-07-28 02:36:04 -04:00
|
|
|
use crate::components::websocket::WebSocketContext;
|
|
|
|
use leptos::*;
|
2024-08-28 00:06:59 -04:00
|
|
|
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-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-28 00:06:59 -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 23:21:38 -04:00
|
|
|
set_websocket_send(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 23:21:38 -04:00
|
|
|
set_websocket_send(
|
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>
|
2024-08-28 00:06:59 -04:00
|
|
|
<Show when=move || { connected() } fallback=|| view! { <p>"Disconnected."</p> }>
|
|
|
|
<Show
|
|
|
|
when=move || { game_browser_context().len() > 0 }
|
|
|
|
fallback=|| {
|
|
|
|
view! { "No games to show right now.. Maybe you should create one!" }
|
|
|
|
}
|
|
|
|
>
|
|
|
|
<p>"Yes, the delete button works. Please don't abuse it."</p>
|
|
|
|
<div>
|
|
|
|
<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>
|
2024-08-29 21:44:39 -04:00
|
|
|
|
|
|
|
// This rebuilds the entire browser each time it runs but using <For /> won't update the children if the id doesn't change
|
|
|
|
{game_browser_context()
|
|
|
|
.iter()
|
|
|
|
.cloned()
|
|
|
|
.map(|game| {
|
2024-08-28 00:06:59 -04:00
|
|
|
view! {
|
|
|
|
<tr>
|
2024-08-29 21:44:39 -04:00
|
|
|
<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}</td>
|
|
|
|
<td class="text-center border-b">{game.packs.len()}</td>
|
2024-08-28 00:06:59 -04:00
|
|
|
<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-29 21:44:39 -04:00
|
|
|
})
|
|
|
|
.collect_view()}
|
2024-08-28 00:06:59 -04:00
|
|
|
</table>
|
|
|
|
</div>
|
|
|
|
</Show>
|
2024-08-26 23:54:47 -04:00
|
|
|
</Show>
|
2024-07-28 02:36:04 -04:00
|
|
|
</div>
|
|
|
|
}
|
|
|
|
}
|