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, } }