You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

72 lines
1.6 KiB

import { useEffect, useState, createContext, useContext } from 'react';
import { supabase } from '../supabaseClient';
const AuthContext = createContext();
const AuthProvider = ({ children }) => {
const [user, setUser] = useState();
const [authLoading, setAuthLoading] = useState(true);
useEffect(() => {
const session = supabase.auth.session();
setUser(session?.user ?? null);
const { data: listener } = supabase.auth.onAuthStateChange(
(event, session) => {
setUser(session?.user ?? null);
}
);
setAuthLoading(false);
return () => {
listener?.unsubscribe();
};
}, []);
const signUp = async (email, password) => {
const { user, session, error } = await supabase.auth.signUp({
email,
password,
});
if (error) return { error };
return { user, session };
};
const signIn = async (email, password) => {
const { user, session, error } = await supabase.auth.signIn({
email,
password,
});
if (error) return { error };
return { user, session };
};
const signOut = async () => {
const { error } = await supabase.auth.signOut();
if (error) return error.message;
return { status: 'success' };
};
const value = { signUp, signIn, signOut, user };
return (
<AuthContext.Provider value={value}>
{!authLoading && children}
</AuthContext.Provider>
);
};
const useAuth = () => {
const context = useContext(AuthContext);
if (!context) throw new Error('useAuth must be used within AuthProvider');
return context;
};
export { AuthProvider, useAuth };