import React, { createContext, useContext, useState, useCallback, useEffect, } from 'react'; import { notifications } from '@mantine/notifications'; import { login as apiLogin, logout as apiLogout, refreshToken as apiRefreshToken, getCurrentUser, } from '@/api/auth'; import type { User } from '@/types/models'; interface AuthContextType { user: User | null; loading: boolean; initialized: boolean; login: (email: string, password: string) => Promise; logout: () => Promise; refreshToken: () => Promise; refreshUser: () => Promise; } const AuthContext = createContext(null); interface AuthProviderProps { children: React.ReactNode; } export const AuthProvider: React.FC = ({ children }) => { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); const [initialized, setInitialized] = useState(false); // Load user data on mount useEffect(() => { const initializeAuth = async (): Promise => { try { const userData = await getCurrentUser(); setUser(userData); } catch (error) { console.error('Failed to initialize auth:', error); } finally { setLoading(false); setInitialized(true); } }; void initializeAuth(); }, []); const login = useCallback( async (email: string, password: string): Promise => { try { const userData = await apiLogin(email, password); setUser(userData); notifications.show({ title: 'Success', message: 'Logged in successfully', color: 'green', }); return true; } catch (error) { console.error('Login failed:', error); notifications.show({ title: 'Error', message: error instanceof Error ? error.message : 'Login failed', color: 'red', }); return false; } }, [] ); const logout = useCallback(async (): Promise => { try { await apiLogout(); } catch (error) { console.error('Logout failed:', error); } finally { setUser(null); } }, []); const refreshToken = useCallback(async (): Promise => { try { const success = await apiRefreshToken(); if (!success) { await logout(); } return success; } catch (error) { console.error('Token refresh failed:', error); await logout(); return false; } }, [logout]); const refreshUser = useCallback(async (): Promise => { try { const userData = await getCurrentUser(); setUser(userData); } catch (error) { console.error('Failed to refresh user data:', error); } }, []); const value: AuthContextType = { user, loading, initialized, login, logout, refreshToken, refreshUser, }; return {children}; }; export const useAuth = (): AuthContextType => { const context = useContext(AuthContext); if (!context) { throw new Error('useAuth must be used within an AuthProvider'); } return context; };