import React, { createContext, useContext, useEffect, useState } from 'react'; import { apiClient } from '../api/client'; import { tokenStorage } from '../api/secureStorage'; import { ENDPOINTS } from '../constants/api'; import { AuthResponse, User } from '../types'; interface AuthContextType { user: User | null; isLoading: boolean; login: (username: string, password: string) => Promise; register: (username: 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); useEffect(() => { loadUser(); }, []); async function loadUser() { try { const stored = await tokenStorage.getUser(); if (stored) { const userData = JSON.parse(stored) as User; setUser(userData); } } catch { await tokenStorage.deleteUser(); } finally { setIsLoading(false); } } async function login(username: string, password: string) { const response = await apiClient.post(ENDPOINTS.AUTH_LOGIN, { username, password, }); apiClient.setAccessToken(response.access_token); await tokenStorage.setRefreshToken(response.refresh_token); await tokenStorage.setUser(JSON.stringify(response.user)); setUser(response.user); } async function register(username: string, password: string) { const response = await apiClient.post(ENDPOINTS.AUTH_REGISTER, { username, password, }); apiClient.setAccessToken(response.access_token); await tokenStorage.setRefreshToken(response.refresh_token); await tokenStorage.setUser(JSON.stringify(response.user)); setUser(response.user); } async function logout() { try { const refreshToken = await tokenStorage.getRefreshToken(); if (refreshToken) { await apiClient.post(ENDPOINTS.AUTH_LOGOUT, { refresh_token: refreshToken }); } } catch {} apiClient.setAccessToken(null); await tokenStorage.deleteRefreshToken(); await tokenStorage.deleteUser(); setUser(null); } return ( {children} ); } export function useAuth() { const context = useContext(AuthContext); if (!context) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }