/* eslint-disable react-refresh/only-export-components */ import { createContext, useContext, useState, useEffect } from 'react'; import type { ReactNode } from 'react'; import * as api from '../lib/api'; import type { User } from '@/types'; interface AuthContextType { user: User | null; token: string | null; isLoading: boolean; login: (username: string, password: string) => Promise; register: (username: string, email: string, password: string) => Promise; logout: () => void; isAuthenticated: boolean; hasRole: (role: string) => boolean; } const AuthContext = createContext(undefined); interface AuthProviderProps { children: ReactNode; } export function AuthProvider({ children }: AuthProviderProps) { const [user, setUser] = useState(null); const [token, setToken] = useState(null); const [isLoading, setIsLoading] = useState(true); useEffect(() => { const initializeAuth = () => { const storedToken = localStorage.getItem('token'); const storedUser = localStorage.getItem('user'); if (storedToken && storedUser) { try { setToken(storedToken); setUser(JSON.parse(storedUser)); } catch (error) { console.error('Failed to parse stored user:', error); localStorage.removeItem('token'); localStorage.removeItem('user'); } } setIsLoading(false); }; initializeAuth(); }, []); const login = async (username: string, password: string) => { setIsLoading(true); const response = await api.login({ username, password }); localStorage.setItem('token', response.access_token); localStorage.setItem('user', JSON.stringify(response.user)); setToken(response.access_token); setUser(response.user); setIsLoading(false); }; const register = async (username: string, email: string, password: string) => { setIsLoading(true); const response = await api.register({ username, email, password }); localStorage.setItem('token', response.access_token); localStorage.setItem('user', JSON.stringify(response.user)); setToken(response.access_token); setUser(response.user); setIsLoading(false); }; const logout = () => { localStorage.removeItem('token'); localStorage.removeItem('user'); setToken(null); setUser(null); api.logout(); }; const isAuthenticated = !!user && !!token; const hasRole = (role: string) => { if (!user) return false; return user.role === role; }; const value = { user, token, isLoading, login, register, logout, isAuthenticated, hasRole, }; return {children}; } export function useAuth() { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }