From fa397373018515f31e2a138632c76c3a6285e0f4 Mon Sep 17 00:00:00 2001 From: Sam Sartor Date: Sat, 28 Feb 2026 17:21:12 -0700 Subject: [PATCH] initilize state signals directly --- gui/src/app.rs | 32 +++++++++++++++++++------------- gui/src/lib.rs | 26 +++++++++++++------------- 2 files changed, 32 insertions(+), 26 deletions(-) diff --git a/gui/src/app.rs b/gui/src/app.rs index fb76ad3..b5f49ab 100644 --- a/gui/src/app.rs +++ b/gui/src/app.rs @@ -219,8 +219,8 @@ impl ServerState { } pub struct State { - pub status: GlobalSignal, - pub server: GlobalSignal, + pub status: Signal, + pub server: Signal, } impl fmt::Debug for State { @@ -727,8 +727,11 @@ pub fn LoginView(overrides: Resource) -> Element { } }); - let previous_username = user_config.config_get::("username"); - let mut username = use_signal(|| previous_username.unwrap_or(String::new())); + let mut username = use_signal(|| { + user_config + .config_get::("username") + .unwrap_or(String::new()) + }); let do_connect = move |_| { let _ = user_config.config_set::("username", &username.read()); @@ -876,16 +879,22 @@ pub fn LoginView(overrides: Resource) -> Element { // ) } +#[component] pub fn app() -> Element { static STYLE: Asset = asset!("/assets/main.scss"); - provide_context(ConfigSystem::new().unwrap()); - provide_context(SharedState::new(State { - status: Signal::global(|| Disconnected), - server: Signal::global(Default::default), - })); + use_effect(|| { + Platform::request_permissions(); + }); + + use_root_context(|| ConfigSystem::new().unwrap()); + let state = use_root_context(|| { + SharedState::new(State { + status: Signal::new(Disconnected), + server: Signal::new(Default::default()), + }) + }); - let state = use_context::(); let network_state = state.clone(); use_coroutine(move |rx: UnboundedReceiver| { super::network_entrypoint(rx, network_state.clone()) @@ -897,9 +906,6 @@ pub fn app() -> Element { } }); - Platform::request_permissions(); - - let state = use_context::(); rsx!( document::Link{ rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=Nunito:ital,wght@0,200..1000;1,200..1000&display=swap" } document::Link{ rel: "stylesheet", href: "https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" } diff --git a/gui/src/lib.rs b/gui/src/lib.rs index fd632d6..0541d62 100644 --- a/gui/src/lib.rs +++ b/gui/src/lib.rs @@ -50,16 +50,16 @@ pub async fn network_entrypoint(mut event_rx: UnboundedReceiver, state: panic!("did not receive connect command") }; - *state.server.write() = Default::default(); - *state.status.write() = ConnectionState::Connecting; + *state.server.write_unchecked() = Default::default(); + *state.status.write_unchecked() = ConnectionState::Connecting; if let Err(error) = Platform::network_connect(address, username, &mut event_rx, &config, state.clone()) .await { error!("could not connect {:?}", error); - *state.status.write() = ConnectionState::Failed(error.to_string()); + *state.status.write_unchecked() = ConnectionState::Failed(error.to_string()); } else { - *state.status.write() = ConnectionState::Disconnected; + *state.status.write_unchecked() = ConnectionState::Disconnected; } } } @@ -216,7 +216,7 @@ fn accept_command( }; { - let mut server = state.server.write(); + let mut server = state.server.write_unchecked(); let Some(me) = server.session else { bail!("not signed in with a session id") }; @@ -257,7 +257,7 @@ fn accept_command( }; { - let mut server = state.server.write(); + let mut server = state.server.write_unchecked(); let Some(me) = server.session else { bail!("not signed in with a session id") }; @@ -345,15 +345,15 @@ fn accept_packet( } } ControlPacket::ChannelState(u) => { - let mut server = state.server.write(); + let mut server = state.server.write_unchecked(); server.channels_state.update_from_channel_state(&u); } ControlPacket::ChannelRemove(u) => { - let mut server = state.server.write(); + let mut server = state.server.write_unchecked(); server.channels_state.update_from_channel_remove(&u); } ControlPacket::UserState(u) => { - let mut server = state.server.write(); + let mut server = state.server.write_unchecked(); let server = &mut *server; let id = u.get_session(); @@ -397,7 +397,7 @@ fn accept_packet( } } ControlPacket::UserRemove(u) => { - let mut server = state.server.write(); + let mut server = state.server.write_unchecked(); let id = u.get_session(); if let Some(state) = server.users.remove(&id) { if let Some(parent) = server.channels_state.channels.get_mut(&state.channel) { @@ -406,7 +406,7 @@ fn accept_packet( } } ControlPacket::TextMessage(u) => { - let mut server = state.server.write(); + let mut server = state.server.write_unchecked(); if u.has_message() { let text = u.get_message().to_string(); server.chat.push(Chat { @@ -421,8 +421,8 @@ fn accept_packet( } } ControlPacket::ServerSync(u) => { - *state.status.write() = ConnectionState::Connected; - let mut server = state.server.write(); + *state.status.write_unchecked() = ConnectionState::Connected; + let mut server = state.server.write_unchecked(); if u.has_welcome_text() { let text = u.get_welcome_text().to_string(); server.chat.push(Chat {