Explorar el Código

fix: мгновенный выход на главную при нажатии кнопки Выйти

router.push('/') до API-запроса — пользователь сразу видит главную.
/api/auth/logout вызывается в фоне без await.
neyrogovnarik hace 1 mes
padre
commit
b874b2175c
Se han modificado 1 ficheros con 7 adiciones y 8 borrados
  1. 7 8
      frontend/src/hooks/useAuth.tsx

+ 7 - 8
frontend/src/hooks/useAuth.tsx

@@ -1,6 +1,7 @@
 'use client'
 
 import { createContext, useContext, useState, useCallback, useEffect, type ReactNode } from 'react'
+import { useRouter } from 'next/navigation'
 import type { User } from '@/types'
 import { api, setAccessToken, refreshAccessToken, hasSessionCookie, setSessionCookie, clearSessionCookie } from '@/lib/api'
 
@@ -18,7 +19,7 @@ interface AuthState {
   isLoading: boolean
   login: (email: string, password: string) => Promise<void>
   register: (email: string, password: string, role: string, name?: string) => Promise<void>
-  logout: () => Promise<void>
+  logout: () => void
   refreshSession: () => Promise<void>
 }
 
@@ -30,6 +31,7 @@ const AuthContext = createContext<AuthState | null>(null)
  * Предоставляет дочерним компонентам методы login, register, logout, refreshSession.
  */
 export function AuthProvider({ children }: { children: ReactNode }) {
+  const router = useRouter()
   const [user, setUser] = useState<User | null>(null)
   const [isLoading, setIsLoading] = useState(true)
 
@@ -68,16 +70,13 @@ export function AuthProvider({ children }: { children: ReactNode }) {
     setSessionCookie()
   }, [])
 
-  const logout = useCallback(async () => {
-    try {
-      await api.post('/auth/logout', {})
-    } catch (e) {
-      console.warn('logout failed', e)
-    }
+  const logout = useCallback(() => {
     setAccessToken(null)
     setUser(null)
     clearSessionCookie()
-  }, [])
+    router.push('/')
+    api.post('/auth/logout', {}).catch((e) => console.warn('logout failed', e))
+  }, [router])
 
   return (
     <AuthContext.Provider value={{ user, isLoading, login, register, logout, refreshSession }}>