|
- // ** UseJWT import to get config
- import axios from "axios";
- import {isUserLoggedIn} from "../utils/Utils";
- import jwtApplicationConfig from "auth/jwtApplicationConfig";
- import jwt_decode from "jwt-decode";
- import {apiPath} from "./utils";
-
- //import axios from "axios";
- export const refreshIntervalName = 'refreshInterval'
- export const predictProductionQty = 'predictProductionQty'
- export const predictUsageCount = 'predictUsageCount'
- export const windowCount = 'windowCount'
- import {useNavigate} from "react-router-dom";
- import {useDispatch} from "react-redux";
- import { REFRESH_TOKEN } from 'utils/ApiPathConst';
-
- // ** Handle User Login
- export const handleLogin = data => {
- return dispatch => {
-
- dispatch({
- type: 'LOGIN',
- data,
- jwtApplicationConfig,
- accessToken: data['accessToken'],
- refreshToken: data['refreshToken']
- })
-
- // console.log(data)
- // ** Add to user, accessToken & refreshToken to localStorage
- localStorage.setItem('userData', JSON.stringify(data))
- localStorage.setItem('accessToken', data.accessToken)
- localStorage.setItem('refreshToken', data.refreshToken)
- localStorage.setItem('axiosToken', "Bearer " + data.accessToken)
- //localStorage.setItem(config.storageUserRoleKeyName, JSON.stringify(data.role).slice(1).slice(0, -1))
- localStorage.setItem(refreshIntervalName, "60")
- // for demo only
- localStorage.setItem(windowCount, '0')
- localStorage.setItem(predictProductionQty, '0')
- localStorage.setItem(predictUsageCount, '0')
- }
- }
-
- export const isLocalTokenValid = () => {
- axios.get(`${apiPath}/test`)
- .then((response) => {
- if(response.status === 200){
- return true;
- }
- else{
- return false;
- }
- })
- .catch(error => {
- console.log(error);
- return false;
- });
- return false;
- }
-
- export const isTokenValid = () =>{
- if(localStorage.getItem('accessToken') !== null && localStorage.getItem('accessToken') !== 'null'){
- let isExpired = false;
- const token = localStorage.getItem('accessToken');
- let decodedToken=jwt_decode(token);
- let dateNow = new Date();
-
- if(decodedToken.exp < dateNow.getTime())
- isExpired = true;
- return isExpired;
- }
- else{
- return false;
- }
- }
-
- // ** Handle User Logout
- export const handleLogoutFunction = () => {
- return dispatch => {
- dispatch({
- type: 'LOGOUT',
- accessToken: null,
- refreshToken: null
- }
- )
-
- // console.log("logout");
- // ** Remove user, accessToken & refreshToken from localStorage
- localStorage.removeItem('userData')
- localStorage.removeItem('accessToken')
- localStorage.removeItem('refreshToken')
- localStorage.removeItem('webtoken')
- localStorage.removeItem('transactionid')
- //localStorage.removeItem(config.storageUserRoleKeyName)
- localStorage.removeItem(refreshIntervalName)
- localStorage.removeItem(windowCount)
- localStorage.removeItem(predictProductionQty)
- localStorage.removeItem(predictUsageCount)
- setTimeout(()=> localStorage.removeItem("expiredAlertShown"), 5000)
- }
- }
-
- // ** Handle axios token
- export const SetupAxiosInterceptors = () => {
- const navigate = useNavigate()
- const dispatch = useDispatch();
- //const updateLastRequestTime = useContext(TimerContext);
- let isRefreshToken= false;
-
- axios.interceptors.request.use(
- config => {
- // ** Get token from localStorage
- const accessToken = localStorage.getItem("accessToken")
-
- // ** If token is present add it to request's Authorization Header
- if (isUserLoggedIn()) {
- config.headers.Authorization = `${jwtApplicationConfig.tokenType} ${accessToken}`
- }
- config.headers['X-Authorization'] = process.env.REACT_APP_API_KEY
- return config
- },
- error => {
- Promise.reject(error)
- }
- )
-
- axios.interceptors.response.use(
- response => {
- //updateLastRequestTime(Date.now());
- return response;
- },
- async (error) => {
- // ** const { config, response: { status } } = error
- if (error.response.status === 401 && error.config.url !== apiPath + REFRESH_TOKEN) {
- // Make a request to refresh the access token
- const refreshToken = localStorage.getItem('refreshToken');
- if (isRefreshToken) {
- return;
- }
- isRefreshToken = true;
- return axios
- .post(`${apiPath}${REFRESH_TOKEN}`, {
- refreshToken: refreshToken // Replace with your refresh token
- })
- .then((response) => {
- if (response.status === 200) {
- const newAccessToken = response.data.accessToken;
- const newRefreshToken = response.data.refreshToken;
- localStorage.setItem('accessToken', newAccessToken);
- localStorage.setItem('refreshToken', newRefreshToken);
- isRefreshToken = false;
- window.location.reload();
- }
- })
- .catch((refreshError) => {
- dispatch(handleLogoutFunction());
- navigate('/login');
- isRefreshToken = false;
- window.location.reload();
- throw refreshError;
- });
- } else {
- if (isUserLoggedIn()){
- if (error.response.status === 401) {
- if (localStorage.getItem("expiredAlertShown") === null) {
- localStorage.setItem("expiredAlertShown", true)
- alert("登入驗證已過期,請重新登入。")
- }
-
- }
-
- // ** if (status === 401) {
- if (response.status === 401) {
- if (localStorage.getItem("expiredAlertShown") === null) {
- localStorage.setItem("expiredAlertShown", true)
- alert("登入驗證已過期,請重新登入。")
- }
- }
-
- if (response && response.status === 401) {
- if (localStorage.getItem("expiredAlertShown") === null) {
- localStorage.setItem("expiredAlertShown", true)
- alert("登入驗證已過期,請重新登入。")
- }
- }
-
- if (localStorage.getItem("expiredAlertShown")) {
- await dispatch(handleLogoutFunction());
- await navigate('/login');
- await window.location.reload();
- }
- } else {
- if (error.response.status === 401) {
- await dispatch(handleLogoutFunction());
- await navigate('/login');
- // await window.location.reload();
- }
- }
- }
-
- return Promise.reject(error)
- }
-
- )
- }
-
- export const handleRefreshTokenFunction = () => {
- // const token = localStorage.getItem('accessToken');
- let isRefresh = false;
-
- if (!isRefresh) {
- const refreshToken = localStorage.getItem('refreshToken');
- isRefresh = true;
- axios.post(`${apiPath}${REFRESH_TOKEN}`, {
- refreshToken: refreshToken
- }).then((response) => {
- if (response.status === 200) {
- const newAccessToken = response.data.accessToken;
- const newRefreshToken = response.data.refreshToken;
- localStorage.setItem('accessToken', newAccessToken);
- localStorage.setItem('refreshToken', newRefreshToken);
- // token = newAccessToken;
- isRefresh = false;
- } else {
- // token = null;
- isRefresh = false;
- }
- })
- .catch((refreshError) => {
- console.log('Failed to refresh token');
- console.log(refreshError)
- // token = null
- isRefresh = false;
- });
- }
-
- return isRefresh;
- }
|