import React, { createContext, useContext, useEffect, useState } from 'react'; import { supabase } from '@/db/supabase'; import { User } from '@supabase/supabase-js'; import { Profile } from '@/types/types'; interface AuthContextType { user: User | null; profile: Profile | null; signIn: (email: string, password: string) => Promise<{ error: any }>; signUp: (email: string, password: string) => Promise<{ error: any }>; signOut: () => Promise<{ error: any }>; loading: boolean; } const AuthContext = createContext(undefined); export const AuthProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { const [user, setUser] = useState(null); const [profile, setProfile] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { // Check active sessions and sets the user supabase.auth.getSession().then(({ data: { session } }) => { setUser(session?.user ?? null); if (session?.user) fetchProfile(session.user.id); else setLoading(false); }); // Listen for changes on auth state (sign in, sign out, etc.) const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, session) => { setUser(session?.user ?? null); if (session?.user) fetchProfile(session.user.id); else { setProfile(null); setLoading(false); } }); return () => subscription.unsubscribe(); }, []); const fetchProfile = async (uid: string) => { try { const { data, error } = await supabase .from('profiles') .select('*') .eq('id', uid) .maybeSingle(); if (error) throw error; setProfile(data); } catch (err) { console.error('Error fetching profile:', err); } finally { setLoading(false); } }; const signIn = async (email: string, password: string) => { return await supabase.auth.signInWithPassword({ email, password }); }; const signUp = async (email: string, password: string) => { return await supabase.auth.signUp({ email, password }); }; const signOut = async () => { return 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; };