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.
66 lines
1.5 KiB
66 lines
1.5 KiB
import { useEffect, useState, createContext, useContext } from 'react'; |
|
import { supabase } from '../supabaseClient'; |
|
|
|
const AuthContext = createContext(); |
|
|
|
const AuthProvider = ({ children }) => { |
|
const [user, setUser] = useState(); |
|
|
|
useEffect(() => { |
|
const session = supabase.auth.session(); |
|
setUser(session?.user ?? null); |
|
|
|
const { data: listener } = supabase.auth.onAuthStateChange( |
|
async (event, session) => { |
|
setUser(session?.user ?? null); |
|
} |
|
); |
|
|
|
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}>{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 };
|
|
|