diff --git a/.changeset/quiet-users-hide.md b/.changeset/quiet-users-hide.md new file mode 100644 index 0000000000000..6254787450ae8 --- /dev/null +++ b/.changeset/quiet-users-hide.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': patch +--- + +Fixes user mute and unmute system messages remaining visible in rooms configured to hide them. diff --git a/apps/meteor/client/views/room/MessageList/hooks/useMessages.ts b/apps/meteor/client/views/room/MessageList/hooks/useMessages.ts index 5a5ba8a0c431e..f717db256d255 100644 --- a/apps/meteor/client/views/room/MessageList/hooks/useMessages.ts +++ b/apps/meteor/client/views/room/MessageList/hooks/useMessages.ts @@ -12,7 +12,13 @@ const mergeHideSysMessages = ( sysMesArray1: Array, sysMesArray2: Array, ): Array => { - return Array.from(new Set([...sysMesArray1, ...sysMesArray2])); + return Array.from( + new Set( + [...sysMesArray1, ...sysMesArray2].flatMap((messageType): MessageTypesValues[] => + messageType === 'mute_unmute' ? ['user-muted', 'user-unmuted'] : [messageType], + ), + ), + ); }; export const useMessages = ({ rid }: { rid: IRoom['_id'] }): IMessage[] => { diff --git a/apps/meteor/server/lib/messaging/getHiddenSystemMessages.ts b/apps/meteor/server/lib/messaging/getHiddenSystemMessages.ts index 08f52620e0805..d29ab6ba30951 100644 --- a/apps/meteor/server/lib/messaging/getHiddenSystemMessages.ts +++ b/apps/meteor/server/lib/messaging/getHiddenSystemMessages.ts @@ -1,10 +1,10 @@ import type { MessageTypesValues, IRoom } from '@rocket.chat/core-typings'; export const getHiddenSystemMessages = (room: IRoom, hiddenSystemMessages: MessageTypesValues[]): MessageTypesValues[] => { - const hiddenTypes = hiddenSystemMessages.reduce((array, value): MessageTypesValues[] => { + const hiddenTypes = Array.isArray(room?.sysMes) ? room.sysMes : hiddenSystemMessages; + + return hiddenTypes.reduce((array, value): MessageTypesValues[] => { const newValue: MessageTypesValues[] = value === 'mute_unmute' ? ['user-muted', 'user-unmuted'] : [value]; return [...array, ...newValue]; }, [] as MessageTypesValues[]); - - return Array.isArray(room?.sysMes) ? room.sysMes : hiddenTypes; }; diff --git a/apps/meteor/tests/unit/server/lib/messaging/getHiddenSystemMessage.spec.ts b/apps/meteor/tests/unit/server/lib/messaging/getHiddenSystemMessage.spec.ts index 320d519105483..b3ccde2f01c0c 100644 --- a/apps/meteor/tests/unit/server/lib/messaging/getHiddenSystemMessage.spec.ts +++ b/apps/meteor/tests/unit/server/lib/messaging/getHiddenSystemMessage.spec.ts @@ -7,7 +7,7 @@ describe('getHiddenSystemMessages', () => { it('should return room.sysMes if it is an array', async () => { const room: IRoom = { _id: 'roomId', - sysMes: ['mute_unmute', 'room_changed_description'] as MessageTypesValues[], + sysMes: ['room-archived', 'room_changed_description'] as MessageTypesValues[], t: 'c', msgs: 0, u: {} as IUser, @@ -20,6 +20,22 @@ describe('getHiddenSystemMessages', () => { expect(result).to.deep.equal(room.sysMes); }); + it('should normalize grouped mute/unmute messages from room.sysMes', async () => { + const room: IRoom = { + _id: 'roomId', + sysMes: ['mute_unmute', 'room_changed_description'] as MessageTypesValues[], + t: 'c', + msgs: 0, + u: {} as IUser, + usersCount: 0, + _updatedAt: new Date(), + }; + + const result = getHiddenSystemMessages(room, []); + + expect(result).to.deep.equal(['user-muted', 'user-unmuted', 'room_changed_description']); + }); + it('should return cached hidden system messages if room.sysMes is not an array', async () => { const cachedHiddenSystemMessage: MessageTypesValues[] = ['mute_unmute', 'room_changed_description']; @@ -75,7 +91,7 @@ describe('getHiddenSystemMessages', () => { const room: IRoom = { _id: 'roomId', - sysMes: ['mute_unmute', 'room_changed_description'] as MessageTypesValues[], + sysMes: ['room-unarchived', 'room_changed_description'] as MessageTypesValues[], t: 'c', msgs: 0, u: {} as IUser, @@ -85,6 +101,6 @@ describe('getHiddenSystemMessages', () => { const result = getHiddenSystemMessages(room, cachedHiddenSystemMessage); - expect(result).to.deep.equal(['mute_unmute', 'room_changed_description']); + expect(result).to.deep.equal(room.sysMes); }); });