25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 

147 satır
4.8 KiB

  1. import React, { createContext, useState, useEffect } from 'react';
  2. import {handleLogoutFunction} from "../auth";
  3. import {dispatch} from "../store";
  4. import {useNavigate} from "react-router-dom";
  5. import axios from "axios";
  6. import {apiPath, getUserData} from "../auth/utils";
  7. import {GET_IDLE_LOGOUT_TIME, GET_USER_PASSWORD_DURATION} from "../utils/ApiPathConst";
  8. import {isObjEmpty} from "../utils/Utils";
  9. import {useIdleTimer} from "react-idle-timer";
  10. import {LIONER_FORM_THEME} from "../themes/themeConst";
  11. import {ChangePasswordWindow} from "../layout/MainLayout/Header/HeaderContent/Profile/ChangePasswordWindow";
  12. import {ThemeProvider} from "@emotion/react";
  13. const TimerContext = createContext();
  14. const AutoLogoutProvider = ({ children }) => {
  15. const [lastRequestTime, setLastRequestTime] = useState(Date.now());
  16. const navigate = useNavigate();
  17. const [logoutInterval, setLogoutInterval] = useState(30);
  18. const [state, setState] = useState('Active');
  19. const [isTempWindowOpen, setIsTempWindowOpen] = useState(false);
  20. const [forceChangePassword, setForceChangePassword] = useState(false);
  21. useEffect(() => {
  22. const userData = getUserData();
  23. const checked = localStorage.getItem("checkPasswordExpired");
  24. if(userData !== null){
  25. //system user
  26. if(checked === "false"){
  27. axios.get(`${apiPath}${GET_USER_PASSWORD_DURATION}`,{
  28. params:{
  29. id: userData.id
  30. }
  31. })
  32. .then((response) => {
  33. if (response.status === 200) {
  34. setForceChangePassword(response.data.expired);
  35. if(!response.data.expired){
  36. localStorage.setItem("checkPasswordExpired",true);
  37. }
  38. }
  39. })
  40. .catch(error => {
  41. console.log(error);
  42. return false;
  43. });
  44. }
  45. }
  46. }, []);
  47. const onIdle = () => {
  48. setLastRequestTime(Date.now());
  49. setState('Idle')
  50. }
  51. const onActive = () => {
  52. setLastRequestTime(Date.now());
  53. setState('Active')
  54. }
  55. const {
  56. getRemainingTime,
  57. //getTabId,
  58. isLastActiveTab,
  59. } = useIdleTimer({
  60. onIdle,
  61. onActive,
  62. timeout: 60_000,
  63. throttle: 500,
  64. crossTab: true,
  65. syncTimers: 200,
  66. })
  67. const lastActiveTab = isLastActiveTab() === null ? 'loading' : isLastActiveTab()
  68. //const tabId = getTabId() === null ? 'loading' : getTabId().toString()
  69. useEffect(() => {
  70. const userData = getUserData();
  71. if(!isObjEmpty(userData)){
  72. axios.get(`${apiPath}${GET_IDLE_LOGOUT_TIME}`,
  73. )
  74. .then((response) => {
  75. if (response.status === 200) {
  76. setLastRequestTime(Date.now());
  77. setLogoutInterval(parseInt(response.data.data));
  78. }
  79. })
  80. .catch(error => {
  81. console.log(error);
  82. return false;
  83. });
  84. }
  85. else{
  86. //navigate('/login');
  87. }
  88. }, []);
  89. useEffect(() => {
  90. const interval = setInterval(async () => {
  91. const currentTime = Date.now();
  92. getRemainingTime();
  93. if(state !== "Active" && lastActiveTab){
  94. const timeElapsed = currentTime - lastRequestTime;
  95. // if (timeElapsed >= logoutInterval * 60 * 1000) {
  96. // await dispatch(handleLogoutFunction());
  97. // await navigate('/login');
  98. // await window.location.reload();
  99. // }
  100. }
  101. }, 1000); // Check every second
  102. return () => {
  103. clearInterval(interval);
  104. };
  105. }, [lastRequestTime,logoutInterval]);
  106. useEffect(() => {
  107. //if user data from parent are not null
  108. if(forceChangePassword){
  109. setIsTempWindowOpen(true);
  110. }
  111. }, [forceChangePassword]);
  112. const handleTempClose = (event, reason) => {
  113. if (reason && reason === "backdropClick")
  114. return;
  115. setIsTempWindowOpen(false);
  116. };
  117. return (
  118. <TimerContext.Provider value={{lastRequestTime,setLastRequestTime}}>
  119. {children}
  120. <ThemeProvider theme={LIONER_FORM_THEME}>
  121. <ChangePasswordWindow
  122. isWindowOpen={isTempWindowOpen}
  123. title={"Change Password"}
  124. onNormalClose={handleTempClose}
  125. onConfirmClose={handleTempClose}
  126. isForce={true}
  127. />
  128. </ThemeProvider>
  129. </TimerContext.Provider>
  130. );
  131. };
  132. export { TimerContext, AutoLogoutProvider };