import { createContext, useCallback, useEffect, useMemo, useState, type ReactNode, } from 'react'; import type { AuthResponse, User } from '../types'; import { api } from '../utils/api'; interface AuthContextValue { user: User | null; token: string | null; loading: boolean; login: (googleToken: string) => Promise; logout: () => void; } export const AuthContext = createContext({ user: null, token: null, loading: true, login: async () => {}, logout: () => {}, }); export function AuthProvider({ children }: { children: ReactNode }) { const [user, setUser] = useState(null); const [token, setToken] = useState( () => localStorage.getItem('token'), ); const [loading, setLoading] = useState(true); const logout = useCallback(() => { localStorage.removeItem('token'); setToken(null); setUser(null); }, []); const login = useCallback(async (googleToken: string) => { const res = await api.post('/auth/google', { idToken: googleToken, }); localStorage.setItem('token', res.token); setToken(res.token); setUser(res.user); }, []); useEffect(() => { if (!token) { setLoading(false); return; } api .get('/auth/me') .then(setUser) .catch(() => { logout(); }) .finally(() => setLoading(false)); }, [token, logout]); const value = useMemo( () => ({ user, token, loading, login, logout }), [user, token, loading, login, logout], ); return {children}; }