'use client'; import React, { createContext, useContext, useEffect, useState } from 'react'; import { Session, User } from '@supabase/supabase-js'; import { createClient } from '@/lib/supabase/client'; interface AuthContextType { user: User | null; session: Session | null; isLoading: boolean; signOut: () => Promise; } const AuthContext = createContext(undefined); export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { const [user, setUser] = useState(null); const [session, setSession] = useState(null); const [isLoading, setIsLoading] = useState(true); const supabase = createClient(); useEffect(() => { // Initial session check const initAuth = async () => { try { const { data: { session } } = await supabase.auth.getSession(); setSession(session); setUser(session?.user ?? null); } catch (error) { console.error('[AuthContext] Error getting initial session:', error); } finally { setIsLoading(false); } }; initAuth(); // Listen for auth changes (Magic Link, OAuth, Sign In/Out) const { data: { subscription } } = supabase.auth.onAuthStateChange((event, currentSession) => { console.log(`[AuthContext] event: ${event}`, { userId: currentSession?.user?.id, email: currentSession?.user?.email }); setSession(currentSession); setUser(currentSession?.user ?? null); setIsLoading(false); if (event === 'SIGNED_OUT') { // Hard reload to clear all state/cache on logout window.location.href = '/'; } }); return () => { subscription.unsubscribe(); }; }, [supabase]); const signOut = async () => { await supabase.auth.signOut(); }; return ( {children} ); }; export const useAuth = () => { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; };