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:
parent
58cfcc31bf
commit
28d1ee0d52
@ -17,7 +17,6 @@ pub fn AdminLayout() -> Element {
|
|||||||
let route = use_route::<Route>();
|
let route = use_route::<Route>();
|
||||||
let show_skeleton = use_delayed_loading(move || !(ctx.checked)());
|
let show_skeleton = use_delayed_loading(move || !(ctx.checked)());
|
||||||
|
|
||||||
// 只在首次挂载时加载用户数据
|
|
||||||
use_effect(move || {
|
use_effect(move || {
|
||||||
if !(ctx.checked)() {
|
if !(ctx.checked)() {
|
||||||
(ctx.checked).set(true);
|
(ctx.checked).set(true);
|
||||||
@ -69,6 +68,8 @@ pub fn AdminLayout() -> Element {
|
|||||||
onclick: move |_| {
|
onclick: move |_| {
|
||||||
spawn(async move {
|
spawn(async move {
|
||||||
let _ = logout().await;
|
let _ = logout().await;
|
||||||
|
ctx.user.set(None);
|
||||||
|
ctx.checked.set(false);
|
||||||
let _ = navigator.push(Route::Login {});
|
let _ = navigator.push(Route::Login {});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|||||||
@ -3,6 +3,7 @@ use dioxus::router::components::Link;
|
|||||||
|
|
||||||
use crate::api::auth::{login, AuthResponse};
|
use crate::api::auth::{login, AuthResponse};
|
||||||
use crate::components::forms::{AlertBox, FormInput, FormLabel, BUTTON_PRIMARY_CLASS};
|
use crate::components::forms::{AlertBox, FormInput, FormLabel, BUTTON_PRIMARY_CLASS};
|
||||||
|
use crate::context::UserContext;
|
||||||
use crate::router::Route;
|
use crate::router::Route;
|
||||||
|
|
||||||
#[component]
|
#[component]
|
||||||
@ -10,6 +11,7 @@ pub fn Login() -> Element {
|
|||||||
let mut username = use_signal(|| "".to_string());
|
let mut username = use_signal(|| "".to_string());
|
||||||
let mut password = use_signal(|| "".to_string());
|
let mut password = use_signal(|| "".to_string());
|
||||||
let mut error = use_signal(|| None::<String>);
|
let mut error = use_signal(|| None::<String>);
|
||||||
|
let mut ctx: UserContext = use_context();
|
||||||
|
|
||||||
let on_submit = Callback::new(move |_| {
|
let on_submit = Callback::new(move |_| {
|
||||||
error.set(None);
|
error.set(None);
|
||||||
@ -24,6 +26,7 @@ pub fn Login() -> Element {
|
|||||||
token: Some(_token),
|
token: Some(_token),
|
||||||
..
|
..
|
||||||
}) => {
|
}) => {
|
||||||
|
ctx.checked.set(false);
|
||||||
let _ = dioxus::router::navigator().push(Route::Admin {});
|
let _ = dioxus::router::navigator().push(Route::Admin {});
|
||||||
}
|
}
|
||||||
Ok(AuthResponse {
|
Ok(AuthResponse {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user