Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/quiet-users-hide.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@rocket.chat/meteor': patch
---

Fixes user mute and unmute system messages remaining visible in rooms configured to hide them.
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,13 @@ const mergeHideSysMessages = (
sysMesArray1: Array<MessageTypesValues>,
sysMesArray2: Array<MessageTypesValues>,
): Array<MessageTypesValues> => {
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],

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3: The mute/unmute grouped-type expansion (mute_unmute['user-muted', 'user-unmuted']) is now written twice in this PR (here in mergeHideSysMessages and identically in getHiddenSystemMessages), even though server/lib/systemMessage/hideSystemMessage.ts already centralizes this logic with isMutedUnmuted. Extract one shared helper (e.g. normalizeHiddenSystemMessages) and reuse it on both client and server so the mapping can't drift when more grouped types are added.

Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At apps/meteor/client/views/room/MessageList/hooks/useMessages.ts, line 18:

<comment>The mute/unmute grouped-type expansion (`mute_unmute` → `['user-muted', 'user-unmuted']`) is now written twice in this PR (here in `mergeHideSysMessages` and identically in `getHiddenSystemMessages`), even though `server/lib/systemMessage/hideSystemMessage.ts` already centralizes this logic with `isMutedUnmuted`. Extract one shared helper (e.g. `normalizeHiddenSystemMessages`) and reuse it on both client and server so the mapping can't drift when more grouped types are added.</comment>

<file context>
@@ -12,7 +12,13 @@ const mergeHideSysMessages = (
+	return Array.from(
+		new Set(
+			[...sysMesArray1, ...sysMesArray2].flatMap((messageType): MessageTypesValues[] =>
+				messageType === 'mute_unmute' ? ['user-muted', 'user-unmuted'] : [messageType],
+			),
+		),
</file context>

),
),
);
};

export const useMessages = ({ rid }: { rid: IRoom['_id'] }): IMessage[] => {
Expand Down
6 changes: 3 additions & 3 deletions apps/meteor/server/lib/messaging/getHiddenSystemMessages.ts
Original file line number Diff line number Diff line change
@@ -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;
};
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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'];

Expand Down Expand Up @@ -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,
Expand All @@ -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);
});
});
Loading