import { createContext, useContext, useEffect, useState, ReactNode } from "react"; import { Session, User } from "@supabase/supabase-js"; import { supabase } from "@/integrations/supabase/client"; interface AuthCtx { user: User | null; session: Session | null; loading: boolean; signOut: () => Promise; } const Ctx = createContext({ user: null, session: null, loading: true, signOut: async () => {} }); export function AuthProvider({ children }: { children: ReactNode }) { const [session, setSession] = useState(null); const [user, setUser] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { // Listener FIRST const { data: sub } = supabase.auth.onAuthStateChange((_event, sess) => { setSession(sess); setUser(sess?.user ?? null); const name = (sess?.user?.user_metadata as any)?.username; if (name) localStorage.setItem("distractiq.lastUsername", name); }); supabase.auth.getSession().then(({ data: { session } }) => { setSession(session); setUser(session?.user ?? null); const name = (session?.user?.user_metadata as any)?.username; if (name) localStorage.setItem("distractiq.lastUsername", name); setLoading(false); }); return () => sub.subscription.unsubscribe(); }, []); const signOut = async () => { await supabase.auth.signOut(); }; return {children}; } export const useAuth = () => useContext(Ctx);