Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

115 строки
3.5 KiB

  1. import React, { createContext, useState, useEffect } from 'react';
  2. import {useNavigate} from "react-router-dom";
  3. //import axios from "axios";
  4. import {getUserData} from "../auth/utils";
  5. import {isObjEmpty} from "../utils/Utils";
  6. import {useIdleTimer} from "react-idle-timer";
  7. import { handleLogoutFunction } from 'auth/index';
  8. import { useDispatch } from "react-redux";
  9. import {
  10. isUserLoggedIn,
  11. isGLDLoggedIn,
  12. // isPrimaryLoggedIn,
  13. // isCreditorLoggedIn,
  14. // isINDLoggedIn,
  15. // isORGLoggedIn,
  16. // getUserId
  17. } from "utils/Utils";
  18. const TimerContext = createContext();
  19. const AutoLogoutProvider = ({ children }) => {
  20. const [lastRequestTime, setLastRequestTime] = useState(Date.now());
  21. const navigate = useNavigate();
  22. const [logoutInterval, setLogoutInterval] = useState(1);
  23. const [state, setState] = useState('Active');
  24. const dispatch = useDispatch()
  25. const onIdle = () => {
  26. setLastRequestTime(Date.now());
  27. setState('Idle')
  28. }
  29. const onActive = () => {
  30. setLastRequestTime(Date.now());
  31. setState('Active')
  32. }
  33. const {
  34. getRemainingTime,
  35. //getTabId,
  36. isLastActiveTab,
  37. } = useIdleTimer({
  38. onIdle,
  39. onActive,
  40. timeout: 1_000,
  41. throttle: 500,
  42. crossTab: true,
  43. syncTimers: 200,
  44. })
  45. const lastActiveTab = isLastActiveTab() === null ? 'loading' : isLastActiveTab()
  46. //const tabId = getTabId() === null ? 'loading' : getTabId().toString()
  47. useEffect(() => {
  48. const userData = getUserData();
  49. if(!isObjEmpty(userData)){
  50. //TODO: get auto logout time here
  51. if(isGLDLoggedIn()){
  52. setLogoutInterval(240);
  53. }else{
  54. setLogoutInterval(1);
  55. }
  56. // axios.get(`${apiPath}${GET_IDLE_LOGOUT_TIME}`,
  57. // )
  58. // .then((response) => {
  59. // if (response.status === 200) {
  60. // setLastRequestTime(Date.now());
  61. // setLogoutInterval(parseInt(response.data.data));
  62. // }
  63. // })
  64. // .catch(error => {
  65. // console.log(error);
  66. // return false;
  67. // });
  68. }
  69. else{
  70. //navigate('/login');
  71. }
  72. }, []);
  73. useEffect(() => {
  74. const interval = setInterval(async () => {
  75. const currentTime = Date.now();
  76. getRemainingTime();
  77. if(state !== "Active" && lastActiveTab){
  78. const timeElapsed = currentTime - lastRequestTime;
  79. // console.log(parseInt(timeElapsed/1000));
  80. // console.log(logoutInterval* 60);
  81. if (timeElapsed >= logoutInterval * 60 * 1000) {
  82. if(isUserLoggedIn()){
  83. alert("登入驗證已過期,請重新登入。")
  84. dispatch(handleLogoutFunction());
  85. navigate('/login');
  86. }
  87. }
  88. }
  89. else if(state === "Active"){
  90. //TODO: if is active and remaining time < 5 min then refresh token
  91. }
  92. }, 1000); // Check every second
  93. return () => {
  94. clearInterval(interval);
  95. };
  96. }, [lastRequestTime,logoutInterval]);
  97. return (
  98. <TimerContext.Provider value={{lastRequestTime,setLastRequestTime}}>
  99. {children}
  100. </TimerContext.Provider>
  101. );
  102. };
  103. export { TimerContext, AutoLogoutProvider };