'use client'; import React, { createContext, useState, useEffect, ReactNode } from 'react'; import { useRouter } from 'next/navigation'; import { apiClient } from '@/lib/api-client'; import { User, LoginFormData, RegisterFormData, LoginResponse, RegisterResponse } from '@/lib/types'; interface AuthContextType { user: User | null; token: string | null; isAuthenticated: boolean; isLoading: boolean; login: (credentials: LoginFormData) => Promise; register: (data: RegisterFormData) => Promise; logout: () => void; } export const AuthContext = createContext(undefined); export function AuthProvider({ children }: { children: ReactNode }) { const [user, setUser] = useState(null); const [token, setToken] = useState(null); const [isLoading, setIsLoading] = useState(true); const router = useRouter(); useEffect(() => { // Check for existing token on mount const storedToken = localStorage.getItem('auth_token'); if (storedToken) { setToken(storedToken); // Optionally fetch user data fetchUser(storedToken); } else { setIsLoading(false); } }, []); const fetchUser = async (authToken: string) => { try { const response = await apiClient.get('/auth/user'); if (response.success && response.data) { setUser(response.data); } } catch (error) { console.error('Failed to fetch user:', error); // Token might be invalid localStorage.removeItem('auth_token'); setToken(null); } finally { setIsLoading(false); } }; const login = async (credentials: LoginFormData) => { try { const response = await apiClient.post('/auth/login', credentials); if (response.success && response.data) { const { token: authToken, user: userData } = response.data; localStorage.setItem('auth_token', authToken); setToken(authToken); setUser(userData); router.push('/dashboard'); } else { throw new Error(response.message || 'Login failed'); } } catch (error) { console.error('Login error:', error); throw error; } }; const register = async (data: RegisterFormData) => { try { const response = await apiClient.post('/auth/register', data); if (response.success && response.data) { const { token: authToken, user: userData } = response.data; localStorage.setItem('auth_token', authToken); setToken(authToken); setUser(userData); router.push('/dashboard'); } else { throw new Error(response.message || 'Registration failed'); } } catch (error) { console.error('Registration error:', error); throw error; } }; const logout = () => { localStorage.removeItem('auth_token'); setToken(null); setUser(null); router.push('/login'); }; const value: AuthContextType = { user, token, isAuthenticated: !!token, isLoading, login, register, logout, }; return {children}; }