31 lines
870 B
JavaScript
31 lines
870 B
JavaScript
import { useEffect } from 'react'
|
|
import Router from 'next/router'
|
|
import useSWR from 'swr'
|
|
|
|
const fetcher = (url) =>
|
|
fetch(url)
|
|
.then((r) => r.json())
|
|
.then((data) => {
|
|
return { user: data?.user || null }
|
|
})
|
|
|
|
export function useUser({ redirectTo, redirectIfFound } = {}) {
|
|
const { data, error } = useSWR('/api/user', fetcher)
|
|
const user = data?.user
|
|
const finished = Boolean(data)
|
|
const hasUser = Boolean(user)
|
|
|
|
useEffect(() => {
|
|
if (!redirectTo || !finished) return
|
|
if (
|
|
// If redirectTo is set, redirect if the user was not found.
|
|
(redirectTo && !redirectIfFound && !hasUser) ||
|
|
// If redirectIfFound is also set, redirect if the user was found
|
|
(redirectIfFound && hasUser)
|
|
) {
|
|
Router.push(redirectTo)
|
|
}
|
|
}, [redirectTo, redirectIfFound, finished, hasUser])
|
|
|
|
return error ? null : user
|
|
}
|