This commit is contained in:
2025-07-15 16:13:52 +02:00
parent 4a24db0639
commit 8551a004a8
4 changed files with 82 additions and 38 deletions
+30 -4
View File
@@ -3,6 +3,8 @@ use std::str::FromStr;
use wasm_bindgen::JsCast;
use web_sys::{window, HtmlDocument};
use crate::{backend, components::server::Server};
pub fn set_cookie(name: &str, value: &str) {
let Some(document) = window().and_then(|w| w.document()) else {
return;
@@ -38,10 +40,7 @@ pub fn get_cookie(name: &str) -> Option<String> {
None
}
pub fn use_cookie<T: FromStr + Default + std::fmt::Display + 'static>(
name: &str,
default: fn() -> T,
) -> Signal<T> {
pub fn use_cookie<T: FromStr + 'static>(name: &str, default: fn() -> T) -> Signal<T> {
let name = name.to_string();
let signal = use_signal(default);
@@ -66,3 +65,30 @@ pub fn redirect(target: &str) {
.set_href(target)
.unwrap();
}
pub struct Session(Signal<String>);
pub fn use_session() -> Session {
Session(use_cookie("session_id", || String::new()))
}
impl Session {
pub fn use_servers(&self) -> (Signal<Vec<Server>>, Signal<String>) {
let query = use_signal(|| String::new());
let servers = use_signal(|| Vec::new());
let id = self.0.clone();
use_effect(move || {
let query_value = query.read().clone();
let mut servers = servers.clone();
spawn(async move {
if let Ok(v) = backend::get_servers(id.read().clone(), query_value).await {
servers.set(v);
}
});
});
(servers, query)
}
}