fix(ui): use thread_local for toast signal to fix context issue
All checks were successful
Build MIPS Binary / build (push) Successful in 5m12s

This commit is contained in:
spinline
2026-02-11 21:43:06 +03:00
parent a24e4101e8
commit 9d160a7ef5

View File

@@ -138,8 +138,18 @@ pub fn SonnerList(
} }
} }
// Thread local storage for global access without Context
thread_local! {
static TOASTS: std::cell::RefCell<Option<RwSignal<Vec<ToastData>>>> = std::cell::RefCell::new(None);
}
pub fn provide_toaster() { pub fn provide_toaster() {
let toasts = RwSignal::new(Vec::<ToastData>::new()); let toasts = RwSignal::new(Vec::<ToastData>::new());
// Set global thread_local
TOASTS.with(|t| *t.borrow_mut() = Some(toasts));
// Also provide context for components
provide_context(ToasterStore { toasts }); provide_context(ToasterStore { toasts });
} }
@@ -191,7 +201,9 @@ pub fn Toaster(#[prop(default = SonnerPosition::default())] position: SonnerPosi
// Global Helper Functions // Global Helper Functions
pub fn toast(title: impl Into<String>, variant: ToastType) { pub fn toast(title: impl Into<String>, variant: ToastType) {
if let Some(store) = use_context::<ToasterStore>() { let signal_opt = TOASTS.with(|t| *t.borrow());
if let Some(toasts) = signal_opt {
let id = js_sys::Math::random().to_bits(); let id = js_sys::Math::random().to_bits();
let new_toast = ToastData { let new_toast = ToastData {
id, id,
@@ -201,18 +213,16 @@ pub fn toast(title: impl Into<String>, variant: ToastType) {
duration: 4000, duration: 4000,
}; };
store.toasts.update(|t| t.push(new_toast.clone())); toasts.update(|t| t.push(new_toast.clone()));
// Auto remove after duration // Auto remove after duration
let duration = new_toast.duration; let duration = new_toast.duration;
leptos::task::spawn_local(async move { leptos::task::spawn_local(async move {
gloo_timers::future::TimeoutFuture::new(duration as u32).await; gloo_timers::future::TimeoutFuture::new(duration as u32).await;
if let Some(store) = use_context::<ToasterStore>() { toasts.update(|vec| vec.retain(|t| t.id != id));
store.toasts.update(|vec| vec.retain(|t| t.id != id));
}
}); });
} else { } else {
gloo_console::warn!("ToasterStore not found. Make sure <Toaster /> is mounted."); gloo_console::warn!("ToasterStore not found (global static). Make sure provide_toaster() is called.");
} }
} }