From f2bdc665f563df7da8fdaec64f0fef0276a0639e Mon Sep 17 00:00:00 2001 From: restitux Date: Sun, 26 Oct 2025 01:34:11 -0600 Subject: [PATCH] add status requesting to frontend --- gui/src/app.rs | 89 +++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 77 insertions(+), 12 deletions(-) diff --git a/gui/src/app.rs b/gui/src/app.rs index 5a4fadb..4fb5f02 100644 --- a/gui/src/app.rs +++ b/gui/src/app.rs @@ -3,7 +3,7 @@ use base64::{display::Base64Display, prelude::BASE64_URL_SAFE}; use dioxus::prelude::*; use mime_guess::Mime; -use mumble_web2_common::ClientConfig; +use mumble_web2_common::{ClientConfig, ServerStatus}; use ordermap::OrderSet; use sir::{css, global_css}; use std::collections::HashMap; @@ -823,10 +823,37 @@ pub fn ServerView(config: Resource) -> Element { ) } +async fn get_status( + client: &reqwest::Client, + status_url: &str, +) -> color_eyre::Result { + Ok(client + .get(status_url) + .send() + .await? + .json::() + .await?) +} + #[component] pub fn LoginView(config: Resource) -> Element { let net: Coroutine = use_coroutine_handle(); + let last_status = use_signal(|| None::>); + use_resource(move || async move { + let Some(config) = config.read().clone() else { + return; + }; + let Some(status_url) = config.status_url else { + return; + }; + let client = reqwest::Client::new(); + loop { + *last_status.write_unchecked() = Some(get_status(&client, &status_url).await); + imp::sleep(std::time::Duration::from_secs_f32(1.0)).await; + } + }); + let mut address_input = use_signal(|| None::); let mut address = use_memo(move || { if let Some(addr) = address_input() { @@ -930,21 +957,59 @@ pub fn LoginView(config: Resource) -> Element { h1 { "Mumble Web" } - input { - placeholder: "username", - value: "{username.read()}", - autofocus: "true", - oninput: move |evt| username.set(evt.value().clone()), + div { + label { + for: "username-entry", + "Username:" + //style: "color: rgba(255, 255, 255, 0.5); font-variation-settings: 'FILL' 1, 'wght' 700, 'GRAD' 0, 'opsz' 48; vertical-align: middle; font-size: 35px; user-select: none;", + } + input { + id: "username-entry", + placeholder: "username", + value: "{username.read()}", + autofocus: "true", + oninput: move |evt| username.set(evt.value().clone()), + } } - input { - placeholder: "server address", - value: "{address.read()}", - autofocus: "true", - oninput: move |evt| address_input.set(Some(evt.value().clone())), + div { + div { + span {} + span {"—"} + span {} + } + div { + span {"1/100 Online"} + span {"—"} + span {"Version: 1.4.255"} + } + div { + {bottom} + } + } - {bottom} } ) + // rsx!( + // div { + // class: "{login_box}", + // h1 { + // "Mumble Web" + // } + // input { + // placeholder: "username", + // value: "{username.read()}", + // autofocus: "true", + // oninput: move |evt| username.set(evt.value().clone()), + // } + // input { + // placeholder: "server address", + // value: "{address.read()}", + // autofocus: "true", + // oninput: move |evt| address_input.set(Some(evt.value().clone())), + // } + // {bottom} + // } + // ) } pub fn app() -> Element {