diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx index 98f6d77..ce99c1e 100644 --- a/src/components/Sidebar.tsx +++ b/src/components/Sidebar.tsx @@ -61,7 +61,11 @@ export function Sidebar({ user, collapsed, onToggle }: t.SidebarProps) { const handleLogout = async () => { setIsLoggingOut(true); try { - await adminLogoutFn(); + const result = await adminLogoutFn(); + if (!result.error && result.redirect) { + window.location.href = result.redirect; + return; + } await router.invalidate(); router.navigate({ to: '/login', search: { redirect: '/' } }); } catch (error) { diff --git a/src/server/auth.ts b/src/server/auth.ts index 240d400..950d32b 100644 --- a/src/server/auth.ts +++ b/src/server/auth.ts @@ -287,17 +287,24 @@ export const requireAuthFn = createServerFn({ method: 'GET' }) }; }); +const logoutResponseSchema = z.object({ redirect: z.string().optional() }); + export const adminLogoutFn = createServerFn({ method: 'POST' }).handler(async () => { try { const session = await useAppSession(); const token = session.data.token; + let redirect: string | undefined; if (token) { try { - await fetch(`${getServerApiUrl()}/api/auth/logout`, { + const response = await fetch(`${getServerApiUrl()}/api/auth/logout`, { method: 'POST', headers: { Authorization: `Bearer ${token}` }, }); + const parsed = logoutResponseSchema.safeParse(await response.json().catch(() => ({}))); + if (parsed.success) { + redirect = parsed.data.redirect; + } } catch { // Ignore remote logout errors } @@ -305,7 +312,7 @@ export const adminLogoutFn = createServerFn({ method: 'POST' }).handler(async () await clearSession(session); - return { error: false }; + return { error: false, redirect }; } catch (error) { console.error('Admin logout error:', error); return { error: true, message: 'Logout failed' };