51 lines
1.2 KiB
JavaScript
51 lines
1.2 KiB
JavaScript
|
|
import React, { createContext, useContext, useState, useEffect } from 'react';
|
|
import { createClient } from '@supabase/supabase-js';
|
|
|
|
const supabase = createClient(
|
|
import.meta.env.PUBLIC_SUPABASE_URL,
|
|
import.meta.env.PUBLIC_SUPABASE_ANON_KEY
|
|
);
|
|
|
|
const AuthContext = createContext();
|
|
|
|
export function useAuth() {
|
|
const context = useContext(AuthContext);
|
|
if (!context) {
|
|
throw new Error('useAuth must be used within an AuthProvider');
|
|
}
|
|
return context;
|
|
}
|
|
|
|
export function AuthProvider({ children }) {
|
|
const [user, setUser] = useState(null);
|
|
const [loading, setLoading] = useState(true);
|
|
|
|
useEffect(() => {
|
|
const getSession = async () => {
|
|
setLoading(true);
|
|
const { data: { session } } = await supabase.auth.getSession();
|
|
if (session?.user) {
|
|
setUser(session.user);
|
|
} else {
|
|
setUser(null);
|
|
}
|
|
setLoading(false);
|
|
};
|
|
getSession();
|
|
const { data: listener } = supabase.auth.onAuthStateChange((_event, session) => {
|
|
setUser(session?.user || null);
|
|
});
|
|
return () => {
|
|
listener?.subscription.unsubscribe();
|
|
};
|
|
}, []);
|
|
|
|
const value = { user, loading, supabase };
|
|
|
|
return (
|
|
<AuthContext.Provider value={value}>
|
|
{children}
|
|
</AuthContext.Provider>
|
|
);
|
|
}
|