Files
supabase/examples/auth/nextjs-auth/lib/UserContext.js
2022-04-27 15:20:41 +02:00

39 lines
1.0 KiB
JavaScript

import React, { useEffect, useState, createContext, useContext } from 'react'
const UserContext = createContext({ user: null, session: null })
export const UserContextProvider = (props) => {
const { supabaseClient } = props
const [session, setSession] = useState(null)
const [user, setUser] = useState(null)
useEffect(() => {
const session = supabaseClient.auth.session()
setSession(session)
setUser(session?.user ?? null)
const { data: authListener } = supabaseClient.auth.onAuthStateChange(async (event, session) => {
setSession(session)
setUser(session?.user ?? null)
})
return () => {
authListener.unsubscribe()
}
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [])
const value = {
session,
user,
}
return <UserContext.Provider value={value} {...props} />
}
export const useUser = () => {
const context = useContext(UserContext)
if (context === undefined) {
throw new Error(`useUser must be used within a UserContextProvider.`)
}
return context
}