Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 

89 linhas
2.6 KiB

  1. 'use client'
  2. import React, { createContext, useState, useEffect, ReactNode } from 'react';
  3. import { useIdleTimer } from "react-idle-timer";
  4. import { signOut } from "next-auth/react";
  5. interface TimerContextProps {
  6. lastRequestTime: number;
  7. setLastRequestTime: React.Dispatch<React.SetStateAction<number>>;
  8. }
  9. export const TimerContext = createContext<TimerContextProps | undefined>(undefined);
  10. interface AutoLogoutProviderProps {
  11. children?: ReactNode;
  12. isUserLoggedIn: boolean;
  13. }
  14. const AutoLogoutProvider: React.FC<AutoLogoutProviderProps> = ({ children, isUserLoggedIn }) => {
  15. const [lastRequestTime, setLastRequestTime] = useState(Date.now());
  16. const [logoutInterval, setLogoutInterval] = useState(1); // minute
  17. const [state, setState] = useState('Active');
  18. const onIdle = () => {
  19. setLastRequestTime(Date.now());
  20. setState('Idle')
  21. }
  22. const onActive = () => {
  23. setLastRequestTime(Date.now());
  24. setState('Active')
  25. }
  26. const {
  27. isLastActiveTab,
  28. } = useIdleTimer({
  29. onIdle,
  30. onActive,
  31. timeout: 1_000,
  32. throttle: 500,
  33. crossTab: true,
  34. syncTimers: 200,
  35. })
  36. const lastActiveTab = isLastActiveTab() === null ? 'loading' : isLastActiveTab()
  37. const getLogoutInterval = () => {
  38. if (isUserLoggedIn && logoutInterval === 1) {
  39. //TODO: get auto logout time here
  40. setLogoutInterval(60);
  41. }
  42. else {
  43. if (!isUserLoggedIn && logoutInterval > 1) {
  44. setLogoutInterval(1);
  45. }
  46. }
  47. }
  48. useEffect(() => {
  49. getLogoutInterval()
  50. const interval = setInterval(async () => {
  51. const currentTime = Date.now();
  52. // if (isPasswordExpiry()) {
  53. // navigate('/user/changePassword');
  54. // }
  55. if (state !== "Active" && lastActiveTab) {
  56. const timeElapsed = currentTime - lastRequestTime;
  57. if (timeElapsed >= logoutInterval * 60 * 1000) {
  58. // console.log(timeElapsed / 1000);
  59. // console.log(logoutInterval* 60);
  60. // console.log(logoutInterval * 60 * 1000 - timeElapsed)
  61. signOut()
  62. }
  63. }
  64. }, 1000); // Check every second
  65. return () => {
  66. clearInterval(interval);
  67. };
  68. }, [lastRequestTime, logoutInterval]);
  69. return (
  70. <TimerContext.Provider value={{ lastRequestTime, setLastRequestTime }}>
  71. {children}
  72. </TimerContext.Provider>
  73. );
  74. };
  75. export default AutoLogoutProvider;