diff --git a/src/components/ProtectedRoute.jsx b/src/components/ProtectedRoute.jsx index 811ec45..b4e58b9 100644 --- a/src/components/ProtectedRoute.jsx +++ b/src/components/ProtectedRoute.jsx @@ -1,6 +1,7 @@ import React from "react"; import { Navigate, useNavigate } from "react-router-dom"; import PageWrapper from "./PageWrapper"; +import useIdleTimer from "../hooks/useIdleTimer"; const ProtectedRoute = ({ children }) => { const token = localStorage.getItem("token"); @@ -11,42 +12,33 @@ const ProtectedRoute = ({ children }) => { navigate("/login"); }; - if (!token) { - return ; - } + useIdleTimer(() => { + if (token) { + handleLogout(); + } + }, 60000); // 1 minute + + if (!token) return ; return ( -
- - {children} -
+ Logout + + {children}
); }; diff --git a/src/hooks/useIdleTimer.js b/src/hooks/useIdleTimer.js new file mode 100644 index 0000000..564b732 --- /dev/null +++ b/src/hooks/useIdleTimer.js @@ -0,0 +1,24 @@ +import { useEffect, useRef } from "react"; + +const useIdleTimer = (onIdle, timeout = 60000) => { + const timerRef = useRef(null); + + const resetTimer = () => { + clearTimeout(timerRef.current); + timerRef.current = setTimeout(onIdle, timeout); + }; + + useEffect(() => { + const events = ["mousemove", "keydown", "mousedown", "touchstart"]; + events.forEach(e => window.addEventListener(e, resetTimer)); + + resetTimer(); // initialize timer + + return () => { + clearTimeout(timerRef.current); + events.forEach(e => window.removeEventListener(e, resetTimer)); + }; + }, []); +}; + +export default useIdleTimer;