/** * Auth Context * * Provides authentication state and methods to the application */ 'use client'; import React, { createContext, useContext, useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import { authApi, User } from '../api'; interface AuthContextType { user: User | null; loading: boolean; login: (email: string, password: string) => Promise; register: (data: { email: string; password: string; firstName: string; lastName: string; organizationId: string; }) => Promise; logout: () => Promise; isAuthenticated: boolean; } const AuthContext = createContext(undefined); export function AuthProvider({ children }: { children: React.ReactNode }) { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const router = useRouter(); useEffect(() => { // Check if user is already logged in const checkAuth = async () => { try { if (authApi.isAuthenticated()) { const storedUser = authApi.getStoredUser(); if (storedUser) { // Verify token is still valid by fetching current user const currentUser = await authApi.me(); setUser(currentUser); } } } catch (error) { console.error('Auth check failed:', error); // Token invalid, clear storage if (typeof window !== 'undefined') { localStorage.removeItem('accessToken'); localStorage.removeItem('refreshToken'); localStorage.removeItem('user'); } } finally { setLoading(false); } }; checkAuth(); }, []); const login = async (email: string, password: string) => { try { const response = await authApi.login({ email, password }); setUser({ ...response.user, isEmailVerified: false, isActive: true } as User); router.push('/dashboard'); } catch (error) { throw error; } }; const register = async (data: { email: string; password: string; firstName: string; lastName: string; organizationId: string; }) => { try { const response = await authApi.register(data); setUser({ ...response.user, isEmailVerified: false, isActive: true } as User); router.push('/dashboard'); } catch (error) { throw error; } }; const logout = async () => { try { await authApi.logout(); } finally { setUser(null); router.push('/login'); } }; const value = { user, loading, login, register, logout, isAuthenticated: !!user, }; return {children}; } export function useAuth() { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }