"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; }; const AuthContext = createContext({ user: null, session: null, loading: true, signOut: async () => {}, }); export function useAuth() { return useContext(AuthContext); } export function AuthProvider({ children }: { children: ReactNode }) { const [user, setUser] = useState(null); const [session, setSession] = useState(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 ( {children} ); }