'use client' import React, { createContext, useState, useEffect, ReactNode } from 'react'; import { useIdleTimer } from "react-idle-timer"; import { signOut } from "next-auth/react"; interface TimerContextProps { lastRequestTime: number; setLastRequestTime: React.Dispatch>; } export const TimerContext = createContext(undefined); interface AutoLogoutProviderProps { children?: ReactNode; isUserLoggedIn: boolean; } const AutoLogoutProvider: React.FC = ({ children, isUserLoggedIn }) => { const [lastRequestTime, setLastRequestTime] = useState(Date.now()); const [logoutInterval, setLogoutInterval] = useState(1); // minute const [state, setState] = useState('Active'); const onIdle = () => { setLastRequestTime(Date.now()); setState('Idle') } const onActive = () => { setLastRequestTime(Date.now()); setState('Active') } const { isLastActiveTab, } = useIdleTimer({ onIdle, onActive, timeout: 1_000, throttle: 500, crossTab: true, syncTimers: 200, }) const lastActiveTab = isLastActiveTab() === null ? 'loading' : isLastActiveTab() const getLogoutInterval = () => { if (isUserLoggedIn && logoutInterval === 1) { //TODO: get auto logout time here setLogoutInterval(60); } else { if (!isUserLoggedIn && logoutInterval > 1) { setLogoutInterval(1); } } } useEffect(() => { getLogoutInterval() const interval = setInterval(async () => { const currentTime = Date.now(); // if (isPasswordExpiry()) { // navigate('/user/changePassword'); // } if (state !== "Active" && lastActiveTab) { const timeElapsed = currentTime - lastRequestTime; if (timeElapsed >= logoutInterval * 60 * 1000) { // console.log(timeElapsed / 1000); // console.log(logoutInterval* 60); // console.log(logoutInterval * 60 * 1000 - timeElapsed) signOut() } } }, 1000); // Check every second return () => { clearInterval(interval); }; }, [lastRequestTime, logoutInterval]); return ( {children} ); }; export default AutoLogoutProvider;