16848: Improved event handler installation/removal.
authorLucas Di Pentima <lucas@di-pentima.com.ar>
Mon, 15 Feb 2021 20:44:13 +0000 (17:44 -0300)
committerLucas Di Pentima <lucas@di-pentima.com.ar>
Mon, 15 Feb 2021 20:44:13 +0000 (17:44 -0300)
Arvados-DCO-1.1-Signed-off-by: Lucas Di Pentima <lucas@di-pentima.com.ar>

src/store/auth/auth-action.test.ts
src/views-components/auto-logout/auto-logout.tsx

index 13575d44d5ce1ab65196fd0dab4bbf43ecb464a2..616f2d2c4908d2b794a9b7969f10f3d1521baddb 100644 (file)
@@ -9,7 +9,7 @@ import 'jest-localstorage-mock';
 import { ServiceRepository, createServices } from "~/services/services";
 import { configureStore, RootStore } from "../store";
 import { createBrowserHistory } from "history";
-import { mockConfig, DISCOVERY_DOC_PATH, } from '~/common/config';
+import { mockConfig } from '~/common/config';
 import { ApiActions } from "~/services/api/api-actions";
 import { ACCOUNT_LINK_STATUS_KEY } from '~/services/link-account-service/link-account-service';
 import Axios from "axios";
index 9ccf79a57f881f759e5c8af28d487682af4567dc..54411926d215d42d1898f58c96475c437668d402 100644 (file)
@@ -24,12 +24,10 @@ interface AutoLogoutActionProps {
     doCloseWarn: () => void;
 }
 
-const mapStateToProps = (state: RootState, ownProps: any): AutoLogoutDataProps => {
-    return {
-        sessionIdleTimeout: parse(state.auth.config.clusterConfig.Workbench.IdleTimeout, 's') || 0,
-        lastWarningDuration: ownProps.lastWarningDuration || 60,
-    };
-};
+const mapStateToProps = (state: RootState, ownProps: any): AutoLogoutDataProps => ({
+    sessionIdleTimeout: parse(state.auth.config.clusterConfig.Workbench.IdleTimeout, 's') || 0,
+    lastWarningDuration: ownProps.lastWarningDuration || 60,
+});
 
 const mapDispatchToProps = (dispatch: Dispatch): AutoLogoutActionProps => ({
     doLogout: () => dispatch<any>(logout(true)),
@@ -57,15 +55,25 @@ const LAST_ACTIVE_TIMESTAMP = 'lastActiveTimestamp';
 export const AutoLogoutComponent = (props: AutoLogoutProps) => {
     let logoutTimer: NodeJS.Timer;
     const lastWarningDuration = min([props.lastWarningDuration, props.sessionIdleTimeout])! * 1000;
-    const handleOtherTabActivity = debounce(500, () => {
-        handleOnActive();
-        reset();
-    });
 
-    window.addEventListener('storage', (e: StorageEvent) => {
-        // Other tab activity detected by a localStorage change event.
-        if (e.key === LAST_ACTIVE_TIMESTAMP) { handleOtherTabActivity(); }
-    });
+    // Runs once after render
+    React.useEffect(() => {
+        window.addEventListener('storage', handleStorageEvents);
+        // Component cleanup
+        return () => {
+            window.removeEventListener('storage', handleStorageEvents);
+        };
+    }, []);
+
+    const handleStorageEvents = (e: StorageEvent) => {
+        if (e.key === LAST_ACTIVE_TIMESTAMP) {
+            // Other tab activity detected by a localStorage change event.
+            debounce(500, () => {
+                handleOnActive();
+                reset();
+            })();
+        }
+    };
 
     const handleOnIdle = () => {
         logoutTimer = setTimeout(