import React, { createContext, useState, useContext, useEffect, ReactNode } from 'react'; import { User } from '../types'; import { authAPI, userAPI } from '../services/api'; interface AuthContextType { user: User | null; loading: boolean; login: (email: string, password: string) => Promise; register: (data: any) => Promise; logout: () => void; updateUser: (user: User) => void; } const AuthContext = createContext(undefined); export const useAuth = () => { const context = useContext(AuthContext); if (!context) { throw new Error('useAuth must be used within an AuthProvider'); } return context; }; interface AuthProviderProps { children: ReactNode; } export const AuthProvider: React.FC = ({ children }) => { const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { const token = localStorage.getItem('token'); if (token) { userAPI.getProfile() .then(response => { setUser(response.data); }) .catch(() => { localStorage.removeItem('token'); }) .finally(() => { setLoading(false); }); } else { setLoading(false); } }, []); const login = async (email: string, password: string) => { const response = await authAPI.login({ email, password }); localStorage.setItem('token', response.data.token); setUser(response.data.user); }; const register = async (data: any) => { const response = await authAPI.register(data); localStorage.setItem('token', response.data.token); setUser(response.data.user); }; const logout = () => { localStorage.removeItem('token'); setUser(null); }; const updateUser = (user: User) => { setUser(user); }; return ( {children} ); };