'use client'; import React, { createContext, useContext, useState, useEffect, useCallback } from 'react'; import { useRouter } from 'next/navigation'; import { api, type LoginResponse } from '@/lib/api'; interface User { id: string; email: string; role: string; firstName: string; lastName: string; avatar: string | null; } interface AuthContextType { user: User | null; isLoading: boolean; isAuthenticated: boolean; login: (email: string, password: string) => Promise; logout: () => Promise; } const AuthContext = createContext(undefined); export function AuthProvider({ children }: { children: React.ReactNode }) { const [user, setUser] = useState(null); const [isLoading, setIsLoading] = useState(true); const router = useRouter(); const checkAuth = useCallback(() => { try { const token = localStorage.getItem('accessToken'); const storedUser = localStorage.getItem('user'); if (token && storedUser) { const parsedUser = JSON.parse(storedUser); if (parsedUser.role === 'ADMIN') { setUser(parsedUser); } else { // Not admin, clear storage localStorage.removeItem('accessToken'); localStorage.removeItem('refreshToken'); localStorage.removeItem('user'); } } } catch { // Invalid stored data localStorage.removeItem('accessToken'); localStorage.removeItem('refreshToken'); localStorage.removeItem('user'); } finally { setIsLoading(false); } }, []); useEffect(() => { checkAuth(); }, [checkAuth]); const login = async (email: string, password: string) => { const response: LoginResponse = await api.login(email, password); setUser(response.user); router.push('/dashboard'); }; const logout = async () => { try { await api.logout(); } finally { setUser(null); router.push('/login'); } }; return ( {children} ); } export function useAuth() { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }