mirror of
https://github.com/supabase/supabase.git
synced 2026-07-05 07:14:28 +08:00
72 lines
1.5 KiB
JavaScript
72 lines
1.5 KiB
JavaScript
import { useEffect, useState, createContext, useContext } from 'react'
|
|
import { supabase } from '../utils/initSupabase'
|
|
import { useRouter } from 'next/router'
|
|
|
|
export const SignOut = async () => {
|
|
await supabase.auth.signOut()
|
|
}
|
|
|
|
export const RequireAuth = () => {
|
|
const { user } = useUser()
|
|
const router = useRouter()
|
|
|
|
useEffect(() => {
|
|
if (!user) {
|
|
router.push('/auth')
|
|
}
|
|
}, [user, router])
|
|
}
|
|
|
|
export const AuthRedirect = () => {
|
|
const { user } = useUser()
|
|
const router = useRouter()
|
|
|
|
useEffect(() => {
|
|
if (user) {
|
|
router.push('/profile')
|
|
}
|
|
}, [user, router])
|
|
}
|
|
|
|
export const UserContext = createContext()
|
|
|
|
export const UserContextProvider = (props) => {
|
|
const [session, setSession] = useState(false)
|
|
const [user, setUser] = useState(false)
|
|
|
|
useEffect(() => {
|
|
const session = supabase.auth.session()
|
|
setSession(session)
|
|
setUser(session?.user ?? false)
|
|
const { data: authListener } = supabase.auth.onAuthStateChange(async (event, session) => {
|
|
setSession(session)
|
|
setUser(session?.user ?? false)
|
|
})
|
|
|
|
return () => {
|
|
authListener.unsubscribe()
|
|
}
|
|
}, [])
|
|
|
|
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
|
|
}
|
|
|
|
const AuthUser = () => {
|
|
const { user } = useUser()
|
|
return user
|
|
}
|
|
|
|
export default AuthUser
|