From 8087882b08dd7260864909e3a949fb83fa32dbaa Mon Sep 17 00:00:00 2001 From: erinz2020 Date: Mon, 16 Sep 2024 20:31:18 +0000 Subject: [PATCH] add session warning in react --- frontend/src/FrontDesk.jsx | 2 + frontend/src/components/SessionWarning.jsx | 144 +++++++++++++++++++++ 2 files changed, 146 insertions(+) create mode 100644 frontend/src/components/SessionWarning.jsx diff --git a/frontend/src/FrontDesk.jsx b/frontend/src/FrontDesk.jsx index 878190dec4..ea1fc616ef 100644 --- a/frontend/src/FrontDesk.jsx +++ b/frontend/src/FrontDesk.jsx @@ -9,6 +9,7 @@ import LoadingScreen from "./components/LoadingScreen"; import GoogleTagManager from "./GoogleTagManager"; import Cookies from "js-cookie"; import "./css/scrollBar.css"; +import SessionWarning from "./components/SessionWarning"; export default function FrontDesk() { const [isLoggedIn, setIsLoggedIn] = useState(false); @@ -72,6 +73,7 @@ export default function FrontDesk() { }} > + { + const intl = useIntl(); + const originalContent = intl.formatMessage({ id: "SESSION_WARNING_CONTENT" }); + const countdownContent = intl.formatMessage({ + id: "SESSION_WARNING_COUNTDOWN", + }); + const extendButton = intl.formatMessage({ id: "EXTEND" }); + const loginButton = intl.formatMessage({ id: "LOGIN" }); + + const [showModal, setShowModal] = useState(false); + const [countdown, setCountdown] = useState(sessionCountdownTime * 60); + const [countdownInterval, setCountdownInterval] = useState(null); + const [extendButtonText, setExtendButtonText] = useState(extendButton); + const [modalText, setModalText] = useState(originalContent); + const [action, setAction] = useState("extendSession"); + + const activityTimeout = sessionWarningTime * 60 * 1000; + + const showWarning = () => { + const now = Date.now(); + const lastActivityTimestamp = localStorage.getItem("lastActivity"); + const timeSinceLastActivity = now - lastActivityTimestamp; + + if (timeSinceLastActivity < activityTimeout) { + setShowModal(false); + startSessionTimer(); + return; + } + + setShowModal(true); + startCountdown(); + }; + + const handleSessionButtonClick = () => { + if (action === "login") { + window.open(`/react/login/`, "_blank"); + } else { + fetch(`${window.wildbookGlobals?.baseUrl}../ExtendSession`) + .then((res) => res.json()) + .then((data) => { + console.log(data); + localStorage.setItem("sessionExtended", Date.now().toString()); + setShowModal(false); + clearInterval(countdownInterval); + resetActivity(); + }) + .catch((error) => console.warn("Error extending session:", error)); + } + }; + + const startSessionTimer = () => { + setExtendButtonText(extendButton); + setAction("extendSession"); + setModalText(originalContent); + setShowModal(false); + clearTimeout(countdownInterval); + setCountdownInterval(setTimeout(showWarning, activityTimeout)); + }; + + const resetActivity = () => { + const now = Date.now(); + localStorage.setItem("lastActivity", now.toString()); + startSessionTimer(); + }; + + const startCountdown = () => { + const warningCountdownTime = sessionCountdownTime * 60 * 1000; + + const interval = setInterval(() => { + const now = Date.now(); + const lastActivityTimestamp = parseInt( + localStorage.getItem("lastActivity"), + 10, + ); + const countdownTime = + lastActivityTimestamp + activityTimeout + warningCountdownTime - now; + const secondsRemaining = Math.floor(countdownTime / 1000); + + if (countdownTime < 0) { + clearInterval(interval); + setExtendButtonText(loginButton); + setAction("login"); + setModalText(countdownContent); + setCountdown(0); + } else { + setCountdown(secondsRemaining); + } + }, 1000); + + setCountdownInterval(interval); + }; + + const formatCountdown = () => { + const minutes = Math.floor(countdown / 60); + const secondsLeft = countdown % 60; + return `${minutes}:${secondsLeft < 10 ? "0" : ""}${secondsLeft}`; + }; + + useEffect(() => { + const handleStorage = (e) => { + if (e.key === "lastActivity") { + startSessionTimer(); + } else if (e.key === "sessionExtended") { + resetActivity(); + } + }; + + window.addEventListener("storage", handleStorage); + + resetActivity(); + + return () => { + window.removeEventListener("storage", handleStorage); + }; + }, []); + + return ( + <> + setShowModal(false)}> + + {"Warning"} + + +

{modalText}

+

{formatCountdown()}

+
+ + + +
+ + ); +}; + +export default SessionWarningModal;