61 lines
1.5 KiB
React
61 lines
1.5 KiB
React
/* eslint-disable react-refresh/only-export-components */
|
|
import { createContext, useContext, useEffect, useState } from 'react'
|
|
import { supabase } from '@/lib/supabase'
|
|
|
|
const AuthContext = createContext(null)
|
|
|
|
export function AuthProvider({ children }) {
|
|
const [user, setUser] = useState(null)
|
|
const [profile, setProfile] = useState(null)
|
|
const [loading, setLoading] = useState(true)
|
|
|
|
useEffect(() => {
|
|
supabase.auth.getSession().then(({ data: { session } }) => {
|
|
if (session?.user) {
|
|
setUser(session.user)
|
|
fetchProfile(session.user.id)
|
|
}
|
|
setLoading(false)
|
|
})
|
|
|
|
const { data: { subscription } } = supabase.auth.onAuthStateChange((_event, session) => {
|
|
if (session?.user) {
|
|
setUser(session.user)
|
|
fetchProfile(session.user.id)
|
|
} else {
|
|
setUser(null)
|
|
setProfile(null)
|
|
}
|
|
})
|
|
|
|
return () => subscription.unsubscribe()
|
|
}, [])
|
|
|
|
async function fetchProfile(userId) {
|
|
const { data } = await supabase
|
|
.from('members')
|
|
.select('*')
|
|
.eq('id', userId)
|
|
.single()
|
|
setProfile(data)
|
|
}
|
|
|
|
async function signIn(email, password) {
|
|
return supabase.auth.signInWithPassword({ email, password })
|
|
}
|
|
|
|
async function signOut() {
|
|
await supabase.auth.signOut()
|
|
setUser(null)
|
|
setProfile(null)
|
|
}
|
|
|
|
return (
|
|
<AuthContext.Provider value={{ user, profile, loading, signIn, signOut, fetchProfile }}>
|
|
{children}
|
|
</AuthContext.Provider>
|
|
)
|
|
}
|
|
|
|
export const useAuth = () => useContext(AuthContext)
|