import React, { createContext, useState, useEffect } from 'react'; import {useNavigate} from "react-router-dom"; //import axios from "axios"; import {getUserData} from "../auth/utils"; import {isObjEmpty} from "../utils/Utils"; import {useIdleTimer} from "react-idle-timer"; import { handleLogoutFunction } from 'auth/index'; import { useDispatch } from "react-redux"; import { isUserLoggedIn, isGLDLoggedIn, // isPrimaryLoggedIn, // isCreditorLoggedIn, // isINDLoggedIn, // isORGLoggedIn, // getUserId } from "utils/Utils"; const TimerContext = createContext(); const AutoLogoutProvider = ({ children }) => { const [lastRequestTime, setLastRequestTime] = useState(Date.now()); const navigate = useNavigate(); const [logoutInterval, setLogoutInterval] = useState(1); const [state, setState] = useState('Active'); const dispatch = useDispatch() const onIdle = () => { setLastRequestTime(Date.now()); setState('Idle') } const onActive = () => { setLastRequestTime(Date.now()); setState('Active') } const { getRemainingTime, //getTabId, isLastActiveTab, } = useIdleTimer({ onIdle, onActive, timeout: 1_000, throttle: 500, crossTab: true, syncTimers: 200, }) const lastActiveTab = isLastActiveTab() === null ? 'loading' : isLastActiveTab() //const tabId = getTabId() === null ? 'loading' : getTabId().toString() useEffect(() => { const userData = getUserData(); if(!isObjEmpty(userData)){ //TODO: get auto logout time here if(isGLDLoggedIn()){ setLogoutInterval(240); }else{ setLogoutInterval(1); } // axios.get(`${apiPath}${GET_IDLE_LOGOUT_TIME}`, // ) // .then((response) => { // if (response.status === 200) { // setLastRequestTime(Date.now()); // setLogoutInterval(parseInt(response.data.data)); // } // }) // .catch(error => { // console.log(error); // return false; // }); } else{ //navigate('/login'); } }, []); useEffect(() => { const interval = setInterval(async () => { const currentTime = Date.now(); getRemainingTime(); if(state !== "Active" && lastActiveTab){ const timeElapsed = currentTime - lastRequestTime; // console.log(parseInt(timeElapsed/1000)); // console.log(logoutInterval* 60); if (timeElapsed >= logoutInterval * 60 * 1000) { if(isUserLoggedIn()){ alert("登入驗證已過期,請重新登入。") dispatch(handleLogoutFunction()); navigate('/login'); } } } else if(state === "Active"){ //TODO: if is active and remaining time < 5 min then refresh token } }, 1000); // Check every second return () => { clearInterval(interval); }; }, [lastRequestTime,logoutInterval]); return ( {children} ); }; export { TimerContext, AutoLogoutProvider };