import React, { createContext, useContext, useEffect, useState } from 'react'; import { User } from '@supabase/supabase-js'; import { supabase } from '../supabase'; import { Database } from '../database.types'; import { IonSpinner } from '@ionic/react'; type Profile = Database['public']['Tables']['profiles']['Row']; interface AuthContextType { user: User | null; profile: Profile | null; loading: boolean; refreshProfile: () => Promise; } 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); const fetchProfile = async (userId: string) => { try { const { data, error } = await supabase .from('profiles') .select('*') .eq('id', userId) .single(); if (error) { if (error.code === 'PGRST116') { // Profile doesn't exist, create it const { data: userData } = await supabase.auth.getUser(); const { data: newProfile, error: createError } = await supabase .from('profiles') .insert([ { id: userId, full_name: userData.user?.user_metadata?.full_name || '', shop_name: 'My Shop', currency: 'USD', }, ]) .select() .single(); if (!createError) { setProfile(newProfile); } } } else { setProfile(data); } } catch (err) { console.error('Error fetching profile:', err); } }; const refreshProfile = async () => { if (user) { await fetchProfile(user.id); } }; useEffect(() => { // Check active session supabase.auth.getSession().then(({ data: { session } }) => { setUser(session?.user ?? null); if (session?.user) { fetchProfile(session.user.id).then(() => setLoading(false)); } else { setLoading(false); } }); // Listen for auth changes const { data: { subscription }, } = supabase.auth.onAuthStateChange(async (_event, session) => { const currentUser = session?.user ?? null; setUser(currentUser); if (currentUser) { await fetchProfile(currentUser.id); } else { setProfile(null); } setLoading(false); }); return () => { subscription.unsubscribe(); }; }, []); if (loading) { return (
); } return ( {children} ); }; export const useAuth = () => { const context = useContext(AuthContext); if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider'); } return context; };