From 28d1ee0d528e5795f8361cfa0853c50ca3c2937c Mon Sep 17 00:00:00 2001 From: xfy Date: Fri, 5 Jun 2026 10:42:20 +0800 Subject: [PATCH] fix: reset UserContext on login/logout to prevent admin page stuck on re-login Root cause: UserContext.checked was never reset on logout, causing AdminLayout's use_effect to skip get_current_user() on subsequent mounts, leaving the page in (checked=true, user=None) limbo. - Reset ctx.user and ctx.checked on logout in admin_layout.rs - Reset ctx.checked on login success in login.rs so AdminLayout re-validates session on mount --- src/components/admin_layout.rs | 3 ++- src/pages/login.rs | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/components/admin_layout.rs b/src/components/admin_layout.rs index a227d9f..5b77bb0 100644 --- a/src/components/admin_layout.rs +++ b/src/components/admin_layout.rs @@ -17,7 +17,6 @@ pub fn AdminLayout() -> Element { let route = use_route::(); let show_skeleton = use_delayed_loading(move || !(ctx.checked)()); - // 只在首次挂载时加载用户数据 use_effect(move || { if !(ctx.checked)() { (ctx.checked).set(true); @@ -69,6 +68,8 @@ pub fn AdminLayout() -> Element { onclick: move |_| { spawn(async move { let _ = logout().await; + ctx.user.set(None); + ctx.checked.set(false); let _ = navigator.push(Route::Login {}); }); }, diff --git a/src/pages/login.rs b/src/pages/login.rs index a4b8e3c..4bb3201 100644 --- a/src/pages/login.rs +++ b/src/pages/login.rs @@ -3,6 +3,7 @@ use dioxus::router::components::Link; use crate::api::auth::{login, AuthResponse}; use crate::components::forms::{AlertBox, FormInput, FormLabel, BUTTON_PRIMARY_CLASS}; +use crate::context::UserContext; use crate::router::Route; #[component] @@ -10,6 +11,7 @@ pub fn Login() -> Element { let mut username = use_signal(|| "".to_string()); let mut password = use_signal(|| "".to_string()); let mut error = use_signal(|| None::); + let mut ctx: UserContext = use_context(); let on_submit = Callback::new(move |_| { error.set(None); @@ -24,6 +26,7 @@ pub fn Login() -> Element { token: Some(_token), .. }) => { + ctx.checked.set(false); let _ = dioxus::router::navigator().push(Route::Admin {}); } Ok(AuthResponse {