import { createContext, useContext, useState, useEffect, type ReactNode } from 'react'; import type { User } from '../types'; import { api } from '../api/client'; interface UserContextType { user: User | null; isLoading: boolean; error: string | null; login: (firstName: string, lastName: string) => Promise; loginWithId: (userId: string) => Promise; logout: () => void; } const UserContext = createContext(null); const USER_STORAGE_KEY = 'project_memory_user'; export function UserProvider({ children }: { children: ReactNode }) { const [user, setUser] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); // Check for stored user on mount useEffect(() => { const stored = localStorage.getItem(USER_STORAGE_KEY); if (stored) { try { const userData = JSON.parse(stored) as User; // Verify user still exists in backend api.getUser(userData.id) .then(user => { setUser(user); setIsLoading(false); }) .catch(() => { // User no longer exists, clear storage localStorage.removeItem(USER_STORAGE_KEY); setIsLoading(false); }); } catch { localStorage.removeItem(USER_STORAGE_KEY); setIsLoading(false); } } else { setIsLoading(false); } }, []); const login = async (firstName: string, lastName: string) => { setIsLoading(true); setError(null); try { const newUser = await api.createUser({ firstName, lastName }); setUser(newUser); localStorage.setItem(USER_STORAGE_KEY, JSON.stringify(newUser)); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to create user'); throw err; } finally { setIsLoading(false); } }; const loginWithId = async (userId: string) => { setIsLoading(true); setError(null); try { const existingUser = await api.getUser(userId); setUser(existingUser); localStorage.setItem(USER_STORAGE_KEY, JSON.stringify(existingUser)); } catch (err) { setError(err instanceof Error ? err.message : 'User not found'); throw err; } finally { setIsLoading(false); } }; const logout = () => { setUser(null); localStorage.removeItem(USER_STORAGE_KEY); }; return ( {children} ); } export function useUser() { const context = useContext(UserContext); if (!context) { throw new Error('useUser must be used within a UserProvider'); } return context; }