diff --git a/src/container/components/w-screen-wrapper/index.tsx b/src/container/components/w-screen-wrapper/index.tsx index 94dd1a9..b2f9a4c 100644 --- a/src/container/components/w-screen-wrapper/index.tsx +++ b/src/container/components/w-screen-wrapper/index.tsx @@ -8,6 +8,7 @@ import { useAppContext } from '../../../store'; import { useTheme } from '@mui/material'; import { useSnackbar } from 'notistack'; import { IMenuTreeItem } from '../../../ioc'; +import SessionTimeout from './session-timeout'; const WScreenWrapper: FC<{ menuTreeItem?: IMenuTreeItem; }> = ({ menuTreeItem }) => { @@ -61,6 +62,7 @@ const WScreenWrapper: FC<{ menuTreeItem?: IMenuTreeItem; }> = ({ menuTreeItem }) } return ( +
{appContext.screenMode === 'loading' &&
@@ -75,6 +77,7 @@ const WScreenWrapper: FC<{ menuTreeItem?: IMenuTreeItem; }> = ({ menuTreeItem })
+ ); } catch (error) { setPageError({ error }); diff --git a/src/container/components/w-screen-wrapper/session-timeout.tsx b/src/container/components/w-screen-wrapper/session-timeout.tsx new file mode 100644 index 0000000..ad28296 --- /dev/null +++ b/src/container/components/w-screen-wrapper/session-timeout.tsx @@ -0,0 +1,82 @@ +import React, { + useState, + useEffect, + useCallback, + useRef, + Fragment, + FC, + createContext, +} from "react"; +import { + useAppContext, + useConfiguration, + useUserContext, +} from "../../../store"; + +const SessionTimeoutContext = createContext(null as any); + +const SessionTimeout: FC<{ children: React.ReactNode }> = ({ children }) => { + const configuration = useConfiguration(); + const userContext = useUserContext(); + const appContext = useAppContext(); + + const logoutClicked = useCallback(() => { + userContext.logout(); + + try { + if (configuration.hooks?.onLogout) { + configuration.hooks?.onLogout(); + } + } catch (e) { + console.log(e); + } + + appContext.clear(); + }, [userContext.logout, appContext.clear]); + const checkForInactivity = () => { + const expireTime = Number(sessionStorage.getItem("expireTime")); + + if (expireTime < Date.now()) { + logoutClicked(); + } + }; + + const updateExpireTime = () => { + const expireTime = Date.now() + 720000; + sessionStorage.setItem("expireTime", expireTime.toString()); + }; + + useEffect(() => { + const interval = setInterval(() => { + checkForInactivity(); + }, 20000); + + return () => clearInterval(interval); + }, []); + + useEffect(() => { + updateExpireTime(); + + window.addEventListener("click", updateExpireTime); + window.addEventListener("scroll", updateExpireTime); + window.addEventListener("keypress", updateExpireTime); + window.addEventListener("mousemove", updateExpireTime); + return () => { + window.removeEventListener("click", updateExpireTime); + window.removeEventListener("scroll", updateExpireTime); + window.removeEventListener("keypress", updateExpireTime); + window.removeEventListener("mousemove", updateExpireTime); + }; + }, []); + + // change fragment to modal and handleclose func to close + return ( + + {children} + + ); +}; + +export default SessionTimeout;