@@ -2,7 +2,7 @@ import { useEffect, useState } from 'react';
22import { useSelector , useDispatch } from 'react-redux' ;
33import axios from 'axios' ;
44import { ENDPOINTS } from '~/utils/URL' ;
5- import { startForceLogout } from '../../actions/authActions' ;
5+ import { startForceLogout , stopForceLogout } from '../../actions/authActions' ;
66import { useCountdown } from '../../hooks/useCountdown' ;
77import PopUpBar from '../PopUpBar/PopUpBar' ;
88import { getUserProfile } from '../../actions/userProfile' ;
@@ -11,31 +11,108 @@ function PermissionWatcher() {
1111 const dispatch = useDispatch ( ) ;
1212 const { isAuthenticated, forceLogoutAt } = useSelector ( state => state . auth || { } ) ;
1313 const userProfile = useSelector ( state => state . userProfile ) ;
14- const isAcknowledged = userProfile ?. permissions ?. isAcknowledged !== false ;
14+ const isAcknowledged = userProfile ?. permissions ?. isAcknowledged ;
1515 const [ isAckLoading , setIsAckLoading ] = useState ( false ) ;
16- // Get seconds remaining until force logout
1716 const secondsRemaining = useCountdown ( forceLogoutAt ) ;
17+ const [ wasForceLoggedOut , setWasForceLoggedOut ] = useState ( false ) ;
18+ const [ flagReady , setFlagReady ] = useState ( false ) ;
19+ const [ initialAcknowledgedState , setInitialAcknowledgedState ] = useState ( null ) ;
20+ const [ isInitialLogin , setIsInitialLogin ] = useState ( false ) ;
1821
19- // Start the force logout countdown when conditions are met
2022 useEffect ( ( ) => {
21- if ( isAuthenticated && ! isAcknowledged && ! forceLogoutAt ) {
22- // eslint-disable-next-line no-console
23- console . log ( 'Starting force logout countdown due to unacknowledged permission changes' ) ;
24- dispatch ( startForceLogout ( 20000 ) ) ; // 20 seconds countdown
23+ if ( isAuthenticated ) {
24+ try {
25+ const flag = sessionStorage . getItem ( 'wasForceLoggedOut' ) ;
26+ setWasForceLoggedOut ( flag === 'true' ) ;
27+ sessionStorage . removeItem ( 'wasForceLoggedOut' ) ;
28+ } catch { }
29+ setIsInitialLogin ( true ) ;
30+ setInitialAcknowledgedState ( null ) ;
31+ } else {
32+ setIsInitialLogin ( false ) ;
33+ setInitialAcknowledgedState ( null ) ;
34+ setWasForceLoggedOut ( false ) ;
2535 }
26- } , [ isAuthenticated , isAcknowledged , forceLogoutAt , dispatch ] ) ;
27- // Handle acknowledgment of permission changes
36+ setFlagReady ( true ) ;
37+ } , [ isAuthenticated ] ) ;
38+
39+ useEffect ( ( ) => {
40+ if ( ! isAuthenticated || ! flagReady ) return ;
41+ if ( ! userProfile ) return ;
42+ if ( ! isInitialLogin ) return ;
43+
44+ if ( initialAcknowledgedState === null ) {
45+ const safestate = isAcknowledged === undefined ? true : isAcknowledged ;
46+ setInitialAcknowledgedState ( safestate ) ;
47+ return ;
48+ }
49+
50+ const loggedInWithUnacknowledgedPermissions =
51+ isAcknowledged === false && ! forceLogoutAt && ! wasForceLoggedOut ;
52+
53+ if ( loggedInWithUnacknowledgedPermissions ) {
54+ setIsInitialLogin ( false ) ;
55+ return ;
56+ }
57+
58+ const loggedInAfterForceLogout =
59+ isAcknowledged === false && ! forceLogoutAt && wasForceLoggedOut ;
60+
61+ if ( loggedInAfterForceLogout ) {
62+ setIsInitialLogin ( false ) ;
63+ return ;
64+ }
65+
66+ if ( isAcknowledged !== false ) {
67+ setIsInitialLogin ( false ) ;
68+ }
69+ } , [
70+ isAuthenticated ,
71+ flagReady ,
72+ isAcknowledged ,
73+ forceLogoutAt ,
74+ wasForceLoggedOut ,
75+ dispatch ,
76+ isInitialLogin ,
77+ initialAcknowledgedState ,
78+ userProfile ,
79+ ] ) ;
80+
81+ useEffect ( ( ) => {
82+ if ( ! isAuthenticated || ! flagReady ) return ;
83+ if ( ! userProfile ) return ;
84+ if ( isInitialLogin ) return ;
85+
86+ const permissionsChangedMidSession =
87+ isAcknowledged === false && ! forceLogoutAt && initialAcknowledgedState !== false ;
88+
89+ if ( permissionsChangedMidSession ) {
90+ dispatch ( startForceLogout ( 20000 ) ) ;
91+ return ;
92+ }
93+
94+ if ( isAcknowledged === true && forceLogoutAt ) {
95+ dispatch ( stopForceLogout ( ) ) ;
96+ setInitialAcknowledgedState ( true ) ;
97+ }
98+ } , [
99+ isAuthenticated ,
100+ flagReady ,
101+ isAcknowledged ,
102+ forceLogoutAt ,
103+ dispatch ,
104+ isInitialLogin ,
105+ initialAcknowledgedState ,
106+ userProfile ,
107+ ] ) ;
108+
28109 const handleAcknowledge = async ( ) => {
29110 try {
30111 setIsAckLoading ( true ) ;
31-
32112 if ( ! userProfile || ! userProfile . _id ) {
33- // eslint-disable-next-line no-console
34- //console.error('User profile not available');
35113 setIsAckLoading ( false ) ;
36114 return ;
37115 }
38-
39116 const { firstName : name , lastName, personalLinks, adminLinks, _id } = userProfile ;
40117
41118 axios
@@ -44,40 +121,34 @@ function PermissionWatcher() {
44121 lastName,
45122 personalLinks,
46123 adminLinks,
47-
48124 isAcknowledged : true ,
49125 } )
50126 . then ( ( ) => {
51127 setIsAckLoading ( false ) ;
128+ setInitialAcknowledgedState ( true ) ;
129+ setIsInitialLogin ( false ) ;
52130 dispatch ( getUserProfile ( _id ) ) ;
53131 } )
54132 . catch ( error => {
55- // eslint-disable-next-line no-console
56- // console.error('Error updating user profile:', error);
57133 setIsAckLoading ( false ) ;
58134 } ) ;
59135 } catch ( error ) {
60- // eslint-disable-next-line no-console
61- // console.error('Error acknowledging permission changes:', error);
62136 setIsAckLoading ( false ) ;
63137 }
64138 } ;
65139
66- // Only render the popup when a force logout is in progress
67- if ( ! forceLogoutAt ) {
68- return null ;
69- }
70- return (
71- ! isAcknowledged && (
140+ if ( forceLogoutAt && isAcknowledged === false ) {
141+ return (
72142 < PopUpBar
73- message = { `Permissions changed—logging out in ${ secondsRemaining } s. Timer will be stopped; please restart after login .` }
143+ message = { `Permissions changed—logging out in ${ secondsRemaining } s unless acknowledged .` }
74144 onClickClose = { handleAcknowledge }
75- textColor = "red"
76145 isLoading = { isAckLoading }
77- button = { false }
146+ button
78147 />
79- )
80- ) ;
148+ ) ;
149+ }
150+
151+ return null ;
81152}
82153
83154export default PermissionWatcher ;
0 commit comments