You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

126 lines
4.1 KiB

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