| "use client"; |
|
|
| import { |
| createContext, |
| useContext, |
| useEffect, |
| useState, |
| type ReactNode, |
| } from "react"; |
| import type { AuthChangeEvent, Session, User } from "@supabase/supabase-js"; |
| import { getSupabaseBrowser } from "@/lib/supabase/browser"; |
|
|
| type AuthState = { |
| user: User | null; |
| session: Session | null; |
| loading: boolean; |
| signOut: () => Promise<void>; |
| }; |
|
|
| const AuthContext = createContext<AuthState>({ |
| user: null, |
| session: null, |
| loading: true, |
| signOut: async () => {}, |
| }); |
|
|
| export function useAuth() { |
| return useContext(AuthContext); |
| } |
|
|
| export function AuthProvider({ children }: { children: ReactNode }) { |
| const [user, setUser] = useState<User | null>(null); |
| const [session, setSession] = useState<Session | null>(null); |
| const [loading, setLoading] = useState(true); |
|
|
| useEffect(() => { |
| const supabase = getSupabaseBrowser(); |
|
|
| supabase.auth.getSession().then(({ data: { session: s } }: { data: { session: Session | null } }) => { |
| setSession(s); |
| setUser(s?.user ?? null); |
| setLoading(false); |
| }); |
|
|
| const { |
| data: { subscription }, |
| } = supabase.auth.onAuthStateChange((_event: AuthChangeEvent, s: Session | null) => { |
| setSession(s); |
| setUser(s?.user ?? null); |
| setLoading(false); |
| }); |
|
|
| return () => subscription.unsubscribe(); |
| }, []); |
|
|
| async function signOut() { |
| const supabase = getSupabaseBrowser(); |
| await supabase.auth.signOut(); |
| setUser(null); |
| setSession(null); |
| } |
|
|
| return ( |
| <AuthContext.Provider value={{ user, session, loading, signOut }}> |
| {children} |
| </AuthContext.Provider> |
| ); |
| } |
|
|