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