'use client' import { createContext, useContext, useEffect, useState, ReactNode } from 'react' import { User, Session } from '@supabase/supabase-js' import { supabase } from '@/lib/supabase/client' type AuthContextType = { user: User | null session: Session | null loading: boolean signIn: (email: string) => Promise<{ error: any }> signInWithPassword: (email: string, password: string) => Promise<{ error: any }> signOut: () => Promise } const AuthContext = createContext(undefined) /** * AuthProvider component that manages authentication state and provides it to children. */ export function AuthProvider({ children }: { children: ReactNode }) { const [user, setUser] = useState(null) const [session, setSession] = useState(null) const [loading, setLoading] = useState(true) useEffect(() => { const getSession = async () => { const { data: { session }, error } = await supabase.auth.getSession() if (error) { console.error('Error getting session:', error) } setSession(session) setUser(session?.user ?? null) setLoading(false) } getSession() const { data: { subscription } } = supabase.auth.onAuthStateChange( async (event, session) => { console.log('Auth state change:', event, session?.user?.email) setSession(session) setUser(session?.user ?? null) setLoading(false) } ) return () => subscription.unsubscribe() }, []) const signIn = async (email: string) => { const { error } = await supabase.auth.signInWithOtp({ email, options: { emailRedirectTo: `${window.location.origin}/booking`, }, }) return { error } } const signInWithPassword = async (email: string, password: string) => { const { error } = await supabase.auth.signInWithPassword({ email, password, }) return { error } } const signOut = async () => { const { error } = await supabase.auth.signOut() if (error) { console.error('Error signing out:', error) } } const value = { user, session, loading, signIn, signInWithPassword, signOut, } return {children} } /** * useAuth hook that returns the current authentication context. */ export function useAuth() { const context = useContext(AuthContext) if (context === undefined) { throw new Error('useAuth must be used within an AuthProvider') } return context }