Skip to content

Commit a071ffb

Browse files
Merge pull request #4497 from OneCommunityGlobal/venkataramanan_fix_permissions_change_issue
Venkataramanan 🔥 Permissions change auto logout and notification issue
2 parents b880273 + 7358843 commit a071ffb

1 file changed

Lines changed: 18 additions & 51 deletions

File tree

src/components/Auth/PermissionWatcher.jsx

Lines changed: 18 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -13,74 +13,57 @@ function PermissionWatcher() {
1313
const userProfile = useSelector(state => state.userProfile);
1414
const isAcknowledged = userProfile?.permissions?.isAcknowledged;
1515
const [isAckLoading, setIsAckLoading] = useState(false);
16-
// Get seconds remaining until force logout
1716
const secondsRemaining = useCountdown(forceLogoutAt);
1817
const [wasForceLoggedOut, setWasForceLoggedOut] = useState(false);
1918
const [flagReady, setFlagReady] = useState(false);
20-
// Track the initial acknowledged state when user first logs in
2119
const [initialAcknowledgedState, setInitialAcknowledgedState] = useState(null);
22-
// Track if user has just logged in (to distinguish from mid-session changes)
2320
const [isInitialLogin, setIsInitialLogin] = useState(false);
2421

25-
// On mount or when authentication changes, read flag from sessionStorage
2622
useEffect(() => {
2723
if (isAuthenticated) {
2824
try {
2925
const flag = sessionStorage.getItem('wasForceLoggedOut');
3026
setWasForceLoggedOut(flag === 'true');
3127
sessionStorage.removeItem('wasForceLoggedOut');
32-
} catch {
33-
// sessionStorage might not be available (private browsing, etc.)
34-
// Silently fail - component will work without the flag
35-
}
36-
37-
// Mark as initial login (initial state will be captured when profile loads)
28+
} catch {}
3829
setIsInitialLogin(true);
39-
setInitialAcknowledgedState(null); // Reset to wait for profile load
30+
setInitialAcknowledgedState(null);
4031
} else {
41-
// User logged out, reset state
4232
setIsInitialLogin(false);
4333
setInitialAcknowledgedState(null);
4434
setWasForceLoggedOut(false);
4535
}
46-
4736
setFlagReady(true);
4837
}, [isAuthenticated]);
4938

50-
// Track when user profile is first loaded after login and handle initial login cases
5139
useEffect(() => {
5240
if (!isAuthenticated || !flagReady) return;
53-
if (userProfile === null || userProfile === undefined) return; // Wait for profile to load
54-
if (!isInitialLogin) return; // Only handle initial login cases
41+
if (!userProfile) return;
42+
if (!isInitialLogin) return;
5543

56-
// Capture the initial acknowledged state when profile is first loaded
5744
if (initialAcknowledgedState === null) {
58-
setInitialAcknowledgedState(isAcknowledged);
59-
return; // Wait for next render to check conditions
45+
const safestate = isAcknowledged === undefined ? true : isAcknowledged;
46+
setInitialAcknowledgedState(safestate);
47+
return;
6048
}
6149

62-
// Edge Case 2: User permissions changed when logged out → show banner only on login
63-
// Detected by: user just logged in with unacknowledged permissions
64-
// AND was NOT force logged out (just normal logout with permission changes)
6550
const loggedInWithUnacknowledgedPermissions =
66-
!isAcknowledged && !forceLogoutAt && !wasForceLoggedOut;
51+
isAcknowledged === false && !forceLogoutAt && !wasForceLoggedOut;
6752

6853
if (loggedInWithUnacknowledgedPermissions) {
69-
setIsInitialLogin(false); // Mark as no longer initial login
54+
setIsInitialLogin(false);
7055
return;
7156
}
7257

73-
// Edge Case 3: User was force logged out → permissions change → user logs back in → show banner only
74-
// Detected by: user just logged in with unacknowledged permissions AND was force logged out
75-
const loggedInAfterForceLogout = !isAcknowledged && !forceLogoutAt && wasForceLoggedOut;
58+
const loggedInAfterForceLogout =
59+
isAcknowledged === false && !forceLogoutAt && wasForceLoggedOut;
7660

7761
if (loggedInAfterForceLogout) {
78-
setIsInitialLogin(false); // Mark as no longer initial login
62+
setIsInitialLogin(false);
7963
return;
8064
}
8165

82-
// If initial login and permissions are acknowledged, mark as no longer initial
83-
if (isAcknowledged) {
66+
if (isAcknowledged !== false) {
8467
setIsInitialLogin(false);
8568
}
8669
}, [
@@ -95,27 +78,21 @@ function PermissionWatcher() {
9578
userProfile,
9679
]);
9780

98-
// Handle mid-session permission changes (Edge Case 1)
9981
useEffect(() => {
10082
if (!isAuthenticated || !flagReady) return;
101-
if (userProfile === null || userProfile === undefined) return; // Wait for profile to load
102-
if (isInitialLogin) return; // Skip mid-session checks during initial login
83+
if (!userProfile) return;
84+
if (isInitialLogin) return;
10385

104-
// User permissions changed when logged in → start timer
105-
// Detected by: permissions were acknowledged (or was null/true), then became unacknowledged
106-
// AND user was already logged in (not initial login)
10786
const permissionsChangedMidSession =
108-
!isAcknowledged && !forceLogoutAt && initialAcknowledgedState !== false; // Was acknowledged or null before (not explicitly false)
87+
isAcknowledged === false && !forceLogoutAt && initialAcknowledgedState !== false;
10988

11089
if (permissionsChangedMidSession) {
11190
dispatch(startForceLogout(20000));
11291
return;
11392
}
11493

115-
// Case: permissions re-acknowledged → cancel timer
116-
if (isAcknowledged && forceLogoutAt) {
94+
if (isAcknowledged === true && forceLogoutAt) {
11795
dispatch(stopForceLogout());
118-
// Reset initial state since permissions are now acknowledged
11996
setInitialAcknowledgedState(true);
12097
}
12198
}, [
@@ -129,16 +106,13 @@ function PermissionWatcher() {
129106
userProfile,
130107
]);
131108

132-
// Handle acknowledgment of permission changes
133109
const handleAcknowledge = async () => {
134110
try {
135111
setIsAckLoading(true);
136-
137112
if (!userProfile || !userProfile._id) {
138113
setIsAckLoading(false);
139114
return;
140115
}
141-
142116
const { firstName: name, lastName, personalLinks, adminLinks, _id } = userProfile;
143117

144118
axios
@@ -147,30 +121,23 @@ function PermissionWatcher() {
147121
lastName,
148122
personalLinks,
149123
adminLinks,
150-
151124
isAcknowledged: true,
152125
})
153126
.then(() => {
154127
setIsAckLoading(false);
155-
// Update initial state to reflect acknowledgment
156128
setInitialAcknowledgedState(true);
157129
setIsInitialLogin(false);
158130
dispatch(getUserProfile(_id));
159131
})
160132
.catch(error => {
161-
// eslint-disable-next-line no-console
162-
// console.error('Error updating user profile:', error);
163133
setIsAckLoading(false);
164134
});
165135
} catch (error) {
166-
// eslint-disable-next-line no-console
167-
// console.error('Error acknowledging permission changes:', error);
168136
setIsAckLoading(false);
169137
}
170138
};
171139

172-
// Force logout timer running (mid-session permission change)
173-
if (forceLogoutAt && !isAcknowledged) {
140+
if (forceLogoutAt && isAcknowledged === false) {
174141
return (
175142
<PopUpBar
176143
message={`Permissions changed—logging out in ${secondsRemaining}s unless acknowledged.`}

0 commit comments

Comments
 (0)