Spaces:
Running
Running
"use client"; | |
import React, { createContext, useContext, useState, useEffect, ReactNode } from 'react'; | |
import { createClient } from '@/lib/supabase/client'; | |
import { User, Session } from '@supabase/supabase-js'; | |
import { SupabaseClient } from '@supabase/supabase-js'; | |
type AuthContextType = { | |
supabase: SupabaseClient; | |
session: Session | null; | |
user: User | null; | |
isLoading: boolean; | |
signOut: () => Promise<void>; | |
}; | |
const AuthContext = createContext<AuthContextType | undefined>(undefined); | |
export const AuthProvider = ({ children }: { children: ReactNode }) => { | |
const supabase = createClient(); | |
const [session, setSession] = useState<Session | null>(null); | |
const [user, setUser] = useState<User | null>(null); | |
const [isLoading, setIsLoading] = useState(true); | |
useEffect(() => { | |
const getInitialSession = async () => { | |
const { data: { session: currentSession } } = await supabase.auth.getSession(); | |
setSession(currentSession); | |
setUser(currentSession?.user ?? null); | |
setIsLoading(false); | |
}; | |
getInitialSession(); | |
const { data: authListener } = supabase.auth.onAuthStateChange( | |
(_event, newSession) => { | |
setSession(newSession); | |
setUser(newSession?.user ?? null); | |
// No need to set loading state here as initial load is done | |
// and subsequent changes shouldn't show a loading state for the whole app | |
if (isLoading) setIsLoading(false); | |
} | |
); | |
return () => { | |
authListener?.subscription.unsubscribe(); | |
}; | |
}, [supabase, isLoading]); // Added isLoading to dependencies to ensure it runs once after initial load completes | |
const signOut = async () => { | |
await supabase.auth.signOut(); | |
// State updates will be handled by onAuthStateChange | |
}; | |
const value = { | |
supabase, | |
session, | |
user, | |
isLoading, | |
signOut, | |
}; | |
return ( | |
<AuthContext.Provider value={value}> | |
{children} | |
</AuthContext.Provider> | |
); | |
}; | |
export const useAuth = (): AuthContextType => { | |
const context = useContext(AuthContext); | |
if (context === undefined) { | |
throw new Error('useAuth must be used within an AuthProvider'); | |
} | |
return context; | |
}; |