| import { createContext, useContext, useEffect, useState, ReactNode } from "react"; |
| import type { Session, User } from "@supabase/supabase-js"; |
| import { supabase } from "@/integrations/supabase/client"; |
|
|
| type AuthContextType = { |
| user: User | null; |
| session: Session | null; |
| loading: boolean; |
| signOut: () => Promise<void>; |
| }; |
|
|
| const AuthContext = createContext<AuthContextType>({ |
| 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(() => { |
| |
| const { data: sub } = supabase.auth.onAuthStateChange((_event, sess) => { |
| setSession(sess); |
| setUser(sess?.user ?? null); |
| }); |
|
|
| |
| supabase.auth.getSession().then(({ data: { session: sess } }) => { |
| setSession(sess); |
| setUser(sess?.user ?? null); |
| setLoading(false); |
| }); |
|
|
| return () => sub.subscription.unsubscribe(); |
| }, []); |
|
|
| const signOut = async () => { |
| await supabase.auth.signOut(); |
| }; |
|
|
| return ( |
| <AuthContext.Provider value={{ user, session, loading, signOut }}> |
| {children} |
| </AuthContext.Provider> |
| ); |
| } |
|
|
| export const useAuth = () => useContext(AuthContext); |
|
|