119 lines
2.9 KiB
JavaScript
119 lines
2.9 KiB
JavaScript
|
|
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,
|
||
|
|
}
|
||
|
|
}
|