Spaces:
Sleeping
Sleeping
| 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<void>; | |
| } | |
| const Ctx = createContext<AuthCtx>({ user: null, session: null, loading: true, signOut: async () => {} }); | |
| export function AuthProvider({ children }: { children: ReactNode }) { | |
| const [session, setSession] = useState<Session | null>(null); | |
| const [user, setUser] = useState<User | null>(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 <Ctx.Provider value={{ user, session, loading, signOut }}>{children}</Ctx.Provider>; | |
| } | |
| export const useAuth = () => useContext(Ctx); | |