use std::rc::Rc; use leptos::*; use leptos_use::{core::ConnectionReadyState, use_websocket, UseWebsocketReturn}; use lib::models::*; use serde_json::to_string; #[derive(Clone)] pub struct WebSocketContext { pub ready_state: Signal, pub message: Signal>, send: Rc, } impl WebSocketContext { pub fn new( ready_state: Signal, message: Signal>, send: Rc, ) -> Self { Self { ready_state, message, send, } } #[inline(always)] pub fn send(&self, message: &str) { (self.send)(message) } } #[component] pub fn Websocket() -> impl IntoView { let UseWebsocketReturn { ready_state, message, send, open, close, .. } = use_websocket("ws://0.0.0.0:3030/websocket"); provide_context(WebSocketContext::new( ready_state, message, Rc::new(send.clone()), )); // Signals let (online_users, set_online_users) = create_signal(0); let (active_games, set_active_games) = create_signal(0); // Websocket stuff let status = move || ready_state.get().to_string(); let connected = move || ready_state.get() == ConnectionReadyState::Open; let open_connection = move |_| { open(); }; let fake_new_game_request = NewGameRequest { name: String::from("Ligma"), host: Player { name: String::from("Adam"), role: PlayerRole::Host, white: vec![], black: vec![], }, packs: vec![0], }; let close_connection = move |_| { close(); set_online_users(0); set_active_games(0); }; // Game stuff let new_game_test = move |_| { send(&to_string(&fake_new_game_request).unwrap()); }; // handle incoming messages // make this a proper message handler create_effect(move |_| { message.with(move |message_raw| { // Send all messages as strings into chat box if let Some(message) = message_raw { if let Ok(_game) = serde_json::from_str::(message) { logging::log!("Game object received."); } else if let Ok(state_summary) = serde_json::from_str::(message) { logging::log!( "Users: {}\nGames: {}", state_summary.online_users, state_summary.active_games ); set_online_users(state_summary.online_users); set_active_games(state_summary.active_games); } else { logging::log!("Send {} to Chat component", message); // update_chat_history(&set_chat_history, format!("{}\n", message)); } } }) }); view! {

Server Info:

"Connection Status: " {status}

"Users Online: " {online_users}

"Active Games: " {active_games}

} }