initilize state signals directly
Build Mumble Web 2 / macos_build (push) Successful in 54s
Build Mumble Web 2 / linux_build (push) Successful in 1m18s
Build Mumble Web 2 / windows_build (push) Successful in 2m45s
Build Mumble Web 2 / android_build (push) Successful in 4m31s

This commit is contained in:
2026-02-28 17:21:12 -07:00
parent 3147c9ab9e
commit fa39737301
2 changed files with 32 additions and 26 deletions
+19 -13
View File
@@ -219,8 +219,8 @@ impl ServerState {
} }
pub struct State { pub struct State {
pub status: GlobalSignal<ConnectionState>, pub status: Signal<ConnectionState>,
pub server: GlobalSignal<ServerState>, pub server: Signal<ServerState>,
} }
impl fmt::Debug for State { impl fmt::Debug for State {
@@ -727,8 +727,11 @@ pub fn LoginView(overrides: Resource<ProxyOverrides>) -> Element {
} }
}); });
let previous_username = user_config.config_get::<String>("username"); let mut username = use_signal(|| {
let mut username = use_signal(|| previous_username.unwrap_or(String::new())); user_config
.config_get::<String>("username")
.unwrap_or(String::new())
});
let do_connect = move |_| { let do_connect = move |_| {
let _ = user_config.config_set::<String>("username", &username.read()); let _ = user_config.config_set::<String>("username", &username.read());
@@ -876,16 +879,22 @@ pub fn LoginView(overrides: Resource<ProxyOverrides>) -> Element {
// ) // )
} }
#[component]
pub fn app() -> Element { pub fn app() -> Element {
static STYLE: Asset = asset!("/assets/main.scss"); static STYLE: Asset = asset!("/assets/main.scss");
provide_context(ConfigSystem::new().unwrap()); use_effect(|| {
provide_context(SharedState::new(State { Platform::request_permissions();
status: Signal::global(|| Disconnected), });
server: Signal::global(Default::default),
})); 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::<SharedState>();
let network_state = state.clone(); let network_state = state.clone();
use_coroutine(move |rx: UnboundedReceiver<Command>| { use_coroutine(move |rx: UnboundedReceiver<Command>| {
super::network_entrypoint(rx, network_state.clone()) super::network_entrypoint(rx, network_state.clone())
@@ -897,9 +906,6 @@ pub fn app() -> Element {
} }
}); });
Platform::request_permissions();
let state = use_context::<SharedState>();
rsx!( 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=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" } 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" }
+13 -13
View File
@@ -50,16 +50,16 @@ pub async fn network_entrypoint(mut event_rx: UnboundedReceiver<Command>, state:
panic!("did not receive connect command") panic!("did not receive connect command")
}; };
*state.server.write() = Default::default(); *state.server.write_unchecked() = Default::default();
*state.status.write() = ConnectionState::Connecting; *state.status.write_unchecked() = ConnectionState::Connecting;
if let Err(error) = if let Err(error) =
Platform::network_connect(address, username, &mut event_rx, &config, state.clone()) Platform::network_connect(address, username, &mut event_rx, &config, state.clone())
.await .await
{ {
error!("could not connect {:?}", error); error!("could not connect {:?}", error);
*state.status.write() = ConnectionState::Failed(error.to_string()); *state.status.write_unchecked() = ConnectionState::Failed(error.to_string());
} else { } 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 { let Some(me) = server.session else {
bail!("not signed in with a session id") 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 { let Some(me) = server.session else {
bail!("not signed in with a session id") bail!("not signed in with a session id")
}; };
@@ -345,15 +345,15 @@ fn accept_packet(
} }
} }
ControlPacket::ChannelState(u) => { ControlPacket::ChannelState(u) => {
let mut server = state.server.write(); let mut server = state.server.write_unchecked();
server.channels_state.update_from_channel_state(&u); server.channels_state.update_from_channel_state(&u);
} }
ControlPacket::ChannelRemove(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); server.channels_state.update_from_channel_remove(&u);
} }
ControlPacket::UserState(u) => { ControlPacket::UserState(u) => {
let mut server = state.server.write(); let mut server = state.server.write_unchecked();
let server = &mut *server; let server = &mut *server;
let id = u.get_session(); let id = u.get_session();
@@ -397,7 +397,7 @@ fn accept_packet(
} }
} }
ControlPacket::UserRemove(u) => { ControlPacket::UserRemove(u) => {
let mut server = state.server.write(); let mut server = state.server.write_unchecked();
let id = u.get_session(); let id = u.get_session();
if let Some(state) = server.users.remove(&id) { if let Some(state) = server.users.remove(&id) {
if let Some(parent) = server.channels_state.channels.get_mut(&state.channel) { if let Some(parent) = server.channels_state.channels.get_mut(&state.channel) {
@@ -406,7 +406,7 @@ fn accept_packet(
} }
} }
ControlPacket::TextMessage(u) => { ControlPacket::TextMessage(u) => {
let mut server = state.server.write(); let mut server = state.server.write_unchecked();
if u.has_message() { if u.has_message() {
let text = u.get_message().to_string(); let text = u.get_message().to_string();
server.chat.push(Chat { server.chat.push(Chat {
@@ -421,8 +421,8 @@ fn accept_packet(
} }
} }
ControlPacket::ServerSync(u) => { ControlPacket::ServerSync(u) => {
*state.status.write() = ConnectionState::Connected; *state.status.write_unchecked() = ConnectionState::Connected;
let mut server = state.server.write(); let mut server = state.server.write_unchecked();
if u.has_welcome_text() { if u.has_welcome_text() {
let text = u.get_welcome_text().to_string(); let text = u.get_welcome_text().to_string();
server.chat.push(Chat { server.chat.push(Chat {