Spaces:
Sleeping
Sleeping
import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react'; | |
import { useMutation } from '@tanstack/react-query'; | |
import { login } from '@/api/auth/authApi'; | |
import { LoginRequest } from '@/api/auth/types'; | |
interface AuthContextType { | |
isAuthenticated: boolean; | |
login: (data: LoginRequest) => Promise<void>; | |
logout: () => void; | |
isLoading: boolean; | |
error: Error | null; | |
} | |
const AuthContext = createContext<AuthContextType | undefined>(undefined); | |
export const AuthProvider: React.FC<{ children: ReactNode }> = ({ children }) => { | |
const [isAuthenticated, setIsAuthenticated] = useState<boolean>(() => { | |
// Инициализируем состояние сразу из localStorage | |
return !!localStorage.getItem('authToken'); | |
}); | |
const loginMutation = useMutation({ | |
mutationFn: (data: LoginRequest) => login(data), | |
onSuccess: (data) => { | |
localStorage.setItem('authToken', data.access_token); | |
setIsAuthenticated(true); | |
}, | |
onError: (error) => { | |
console.error('Login Error:', error); | |
}, | |
}); | |
const loginHandler = async (data: LoginRequest) => { | |
await loginMutation.mutateAsync(data); | |
}; | |
const logout = () => { | |
localStorage.removeItem('authToken'); | |
setIsAuthenticated(false); | |
}; | |
return ( | |
<AuthContext.Provider | |
value={{ | |
isAuthenticated, | |
login: loginHandler, | |
logout, | |
isLoading: loginMutation.isPending, | |
error: loginMutation.error, | |
}} | |
> | |
{children} | |
</AuthContext.Provider> | |
); | |
}; | |
export const useAuth = () => { | |
const context = useContext(AuthContext); | |
if (!context) { | |
throw new Error('useAuth must be used within an AuthProvider'); | |
} | |
return context; | |
}; |