import { createContext, useContext, useEffect, useState, type ReactNode } from "react"; import type { Session, User } from "@supabase/supabase-js"; import { supabase } from "@/integrations/supabase/client"; type Ctx = { session: Session | null; user: User | null; loading: boolean; isOwner: boolean; signOut: () => Promise; }; const AuthCtx = createContext({ session: null, user: null, loading: true, isOwner: false, signOut: async () => {}, }); export function AuthProvider({ children }: { children: ReactNode }) { const [session, setSession] = useState(null); const [loading, setLoading] = useState(true); const [isOwner, setIsOwner] = useState(false); useEffect(() => { const { data: sub } = supabase.auth.onAuthStateChange((_e, s) => { setSession(s); setLoading(false); if (s?.user) { // defer to avoid deadlock setTimeout(async () => { const { data } = await supabase .from("user_roles") .select("role") .eq("user_id", s.user.id); setIsOwner(!!data?.some((r) => r.role === "admin" || r.role === "owner")); }, 0); } else { setIsOwner(false); } }); supabase.auth.getSession().then(({ data }) => { setSession(data.session); setLoading(false); }); return () => sub.subscription.unsubscribe(); }, []); return ( { await supabase.auth.signOut(); }, }} > {children} ); } export const useAuth = () => useContext(AuthCtx);