From 5407f19592a0b2a118c00df6baa833b4acae0c4e Mon Sep 17 00:00:00 2001 From: Nuwan Date: Sun, 8 Feb 2026 20:52:17 +0530 Subject: [PATCH] feat(21-01): add clearAllMessages action and dispatch on session leave - Add clearAllMessages reducer to sessionChatSlice.js - Export clearAllMessages action - Dispatch clearAllMessages in handleLeaveSubmit (explicit leave) - Dispatch clearAllMessages in unmount cleanup useEffect Fixes CHAT-03: Prevents stale chat data accumulation across sessions --- jam-ui/src/components/client/JKSessionScreen.js | 8 +++++++- jam-ui/src/store/features/sessionChatSlice.js | 17 ++++++++++++++++- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/jam-ui/src/components/client/JKSessionScreen.js b/jam-ui/src/components/client/JKSessionScreen.js index 2bef88172..907380749 100644 --- a/jam-ui/src/components/client/JKSessionScreen.js +++ b/jam-ui/src/components/client/JKSessionScreen.js @@ -55,7 +55,7 @@ import { selectBackingTrackData, selectJamTrackData } from '../../store/features/activeSessionSlice'; -import { addMessageFromWebSocket, uploadAttachment, selectIsUploading, selectUploadError, selectUploadFileName, selectUploadStatus, clearUploadError, fetchChatHistory } from '../../store/features/sessionChatSlice'; +import { addMessageFromWebSocket, uploadAttachment, selectIsUploading, selectUploadError, selectUploadFileName, selectUploadStatus, clearUploadError, fetchChatHistory, clearAllMessages } from '../../store/features/sessionChatSlice'; import { validateFile } from '../../services/attachmentValidation'; import { CLIENT_ROLE, RECORD_TYPE_AUDIO, RECORD_TYPE_BOTH } from '../../helpers/globals'; @@ -912,6 +912,9 @@ const JKSessionScreen = () => { // Then perform leave operations await sessionModel.handleLeaveSession(); + // Clear Redux chat state to prevent stale data + dispatch(clearAllMessages()); + // Clear Redux session state dispatch(clearSession()); @@ -940,6 +943,9 @@ const JKSessionScreen = () => { resetMetronome(); } + // Clear Redux chat state to prevent stale data + dispatch(clearAllMessages()); + // Clear Redux session state on unmount dispatch(clearSession()); }; diff --git a/jam-ui/src/store/features/sessionChatSlice.js b/jam-ui/src/store/features/sessionChatSlice.js index a664cf40b..01a822a69 100644 --- a/jam-ui/src/store/features/sessionChatSlice.js +++ b/jam-ui/src/store/features/sessionChatSlice.js @@ -311,6 +311,20 @@ const sessionChatSlice = createSlice({ clearUploadError: (state) => { state.uploadState.error = null; state.uploadState.status = 'idle'; + }, + + /** + * Clear all messages when leaving session + * Called from JKSessionScreen when user leaves to prevent stale data + */ + clearAllMessages: (state) => { + state.messagesByChannel = {}; + state.unreadCounts = {}; + state.fetchStatus = {}; + state.fetchError = {}; + state.nextCursors = {}; + // Preserve lastReadAt for persistence across sessions + // Preserve isWindowOpen and windowPosition for UX continuity } }, extraReducers: (builder) => { @@ -552,7 +566,8 @@ export const { setWindowPosition, clearSendError, setUploadStatus, - clearUploadError + clearUploadError, + clearAllMessages } = sessionChatSlice.actions; // Phase 7 Plan 3: Memoized selectors using createSelector from Redux Toolkit