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
This commit is contained in:
xfy 2026-06-05 10:42:20 +08:00
parent 58cfcc31bf
commit 28d1ee0d52
2 changed files with 5 additions and 1 deletions

View File

@ -17,7 +17,6 @@ pub fn AdminLayout() -> Element {
let route = use_route::<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 {});
});
},

View File

@ -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::<String>);
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 {