mirror of
https://github.com/kevin-DL/breeze-next-template.git
synced 2026-01-11 18:34:27 +00:00
116 lines
3.1 KiB
JavaScript
116 lines
3.1 KiB
JavaScript
import useSWR from 'swr'
|
|
import axios from '@/lib/axios'
|
|
import { useEffect } from 'react'
|
|
import { useRouter } from 'next/router'
|
|
|
|
export const useAuth = ({ middleware, redirectIfAuthenticated } = {}) => {
|
|
const router = useRouter()
|
|
|
|
const { data: user, error, revalidate } = useSWR('/api/user', () =>
|
|
axios
|
|
.get('/api/user')
|
|
.then(res => res.data)
|
|
.catch(error => {
|
|
if (error.response.status != 409) throw error
|
|
|
|
router.push('/verify-email')
|
|
}),
|
|
)
|
|
|
|
const csrf = () => axios.get('/sanctum/csrf-cookie')
|
|
|
|
const register = async ({ setErrors, ...props }) => {
|
|
await csrf()
|
|
|
|
setErrors([])
|
|
|
|
axios
|
|
.post('/register', props)
|
|
.then(() => revalidate())
|
|
.catch(error => {
|
|
if (error.response.status !== 422) throw error
|
|
|
|
setErrors(Object.values(error.response.data.errors).flat())
|
|
})
|
|
}
|
|
|
|
const login = async ({ setErrors, setStatus, ...props }) => {
|
|
await csrf()
|
|
|
|
setErrors([])
|
|
setStatus(null)
|
|
|
|
axios
|
|
.post('/login', props)
|
|
.then(() => revalidate())
|
|
.catch(error => {
|
|
if (error.response.status !== 422) throw error
|
|
|
|
setErrors(Object.values(error.response.data.errors).flat())
|
|
})
|
|
}
|
|
|
|
const forgotPassword = async ({ setErrors, setStatus, email }) => {
|
|
await csrf()
|
|
|
|
setErrors([])
|
|
setStatus(null)
|
|
|
|
axios
|
|
.post('/forgot-password', { email })
|
|
.then(response => setStatus(response.data.status))
|
|
.catch(error => {
|
|
if (error.response.status !== 422) throw error
|
|
|
|
setErrors(Object.values(error.response.data.errors).flat())
|
|
})
|
|
}
|
|
|
|
const resetPassword = async ({ setErrors, setStatus, ...props }) => {
|
|
await csrf()
|
|
|
|
setErrors([])
|
|
setStatus(null)
|
|
|
|
axios
|
|
.post('/reset-password', { token: router.query.token, ...props })
|
|
.then(response => router.push('/login?reset=' + btoa(response.data.status)))
|
|
.catch(error => {
|
|
if (error.response.status != 422) throw error
|
|
|
|
setErrors(Object.values(error.response.data.errors).flat())
|
|
})
|
|
}
|
|
|
|
const resendEmailVerification = ({ setStatus }) => {
|
|
axios
|
|
.post('/email/verification-notification')
|
|
.then(response => setStatus(response.data.status))
|
|
}
|
|
|
|
const logout = async () => {
|
|
if (! error) {
|
|
await axios.post('/logout')
|
|
|
|
revalidate()
|
|
}
|
|
|
|
window.location.pathname = '/login'
|
|
}
|
|
|
|
useEffect(() => {
|
|
if (middleware === 'guest' && redirectIfAuthenticated && user) router.push(redirectIfAuthenticated)
|
|
if (middleware === 'auth' && error) logout()
|
|
}, [user, error])
|
|
|
|
return {
|
|
user,
|
|
register,
|
|
login,
|
|
forgotPassword,
|
|
resetPassword,
|
|
resendEmailVerification,
|
|
logout,
|
|
}
|
|
}
|