e-verify/hooks/auth.js

119 lines
2.9 KiB
JavaScript
Raw Normal View History

2024-05-14 22:19:14 +07:00
import { LoginPost, LogoutGet } from '@/services/auth-service'
import { useRouter } from 'next/router'
import { destroyCookie, parseCookies, setCookie } from 'nookies'
import { useEffect } from 'react'
import { useDispatch } from 'react-redux'
import { UPDATE_NAME } from 'store/userSlice'
import Swal from 'sweetalert2'
import axios from '../lib/axios'
export const useAuth = ({ middleware, redirectIfAuthenticated }) => {
const router = useRouter()
const { token } = parseCookies()
const dispatch = useDispatch()
useEffect(() => {
if (middleware === 'guest' && redirectIfAuthenticated && token) router.push(redirectIfAuthenticated)
if (middleware === 'auth' && !token) logout()
}, [token])
const login = async ({ toast, setLoading, ...props }) => {
LoginPost(props)
.then((res) => {
setLoading(false)
if (res.status === 'ok') {
setCookie(null, 'token', res.data.jwt, {
path: '/',
maxAge: res.data.token_expiry,
})
localStorage.setItem('menus', JSON.stringify(res.data.user_access))
localStorage.setItem('user', JSON.stringify(res.data))
} else {
// eslint-disable-next-line no-undef
grecaptcha.reset()
toast.current.show({ severity: 'error', summary: 'Error Message', detail: res.message })
}
})
.catch((err) => {
// eslint-disable-next-line no-undef
grecaptcha.reset()
setLoading(false)
switch (err.response.status) {
case 401:
toast.current.show({
severity: 'error',
summary: 'Error Message',
detail: 'Your account used on another device.',
})
break
default:
toast.current.show({ severity: 'error', summary: 'Error Message', detail: err })
break
}
})
}
const forgotPassword = async ({ ...props }) => {
axios
.post('/security/forgotPassword ', props)
.then((response) => {
Swal.fire({
icon: 'success',
title: 'Forgot Password',
text: response.data.message,
width: '25rem',
timer: 3000,
timerProgressBar: true,
}).then(() => {
router.push('/')
})
})
.catch((err) => {
console.log(err)
})
}
const resetPassword = async ({ ...props }) => {
axios
.post('/security/resetPassword ', props)
.then((response) => {
Swal.fire({
icon: 'success',
title: 'Reset Password',
text: response.data.message,
width: '25rem',
timer: 3000,
timerProgressBar: true,
}).then(() => {
router.push('/')
})
})
.catch((err) => {
console.log(err)
})
}
const logout = async () => {
LogoutGet()
.then((res) => {
if (res.status === 'ok') {
destroyCookie(null, 'token', { path: '/' })
localStorage.removeItem('menus')
localStorage.removeItem('user')
dispatch(UPDATE_NAME(''))
router.push('/')
}
})
.catch((err) => console.log(err))
}
return {
// user,
login,
logout,
forgotPassword,
resetPassword,
}
}