Files
supabase/examples/auth/nextjs-auth-tailwind/hooks/authUser.js
2022-04-27 15:20:41 +02:00

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