Skip to content

Commit 5973888

Browse files
committed
fix: recognize async moderated shadow blocked messages as blocked (#3131)
https://linear.app/stream/issue/REACT-945/handle-shadow-blocked-images-in-react-chat-sdk `isMessageBlocked` method decides if we should display the `MessageBlocked` placeholder for a message. This method didn't categorize `shadowed` messages as blocked (probably because these messages are not displayed in message list, except when they change from `shadowed: false` to `shadowed: true`) _Provide a description of the implementation_ _Add relevant screenshots_
1 parent 01d92a3 commit 5973888

4 files changed

Lines changed: 48 additions & 9 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@
234234
"react": "^19.0.0",
235235
"react-dom": "^19.0.0",
236236
"semantic-release": "^25.0.2",
237-
"stream-chat": "^9.38.0",
237+
"stream-chat": "^9.41.1",
238238
"ts-jest": "^29.2.5",
239239
"typescript": "^5.4.5",
240240
"typescript-eslint": "^8.17.0"

src/components/Message/__tests__/utils.test.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { generateMessage, generateReaction, generateUser } from 'mock-builders';
2+
import { fromPartial } from '@total-typescript/shoehorn';
23
import {
34
countReactions,
45
getTestClientWithUser,
@@ -12,6 +13,7 @@ import {
1213
getMessageActions,
1314
getNonImageAttachments,
1415
getReadByTooltipText,
16+
isMessageBlocked,
1517
isUserMuted,
1618
mapToUserNameOrId,
1719
MESSAGE_ACTIONS,
@@ -514,4 +516,40 @@ describe('Message utils', () => {
514516
);
515517
});
516518
});
519+
520+
describe('isMessageBlocked function', () => {
521+
it('returns true when message.shadowed is true', () => {
522+
const message =
523+
fromPartial <
524+
LocalMessage >
525+
{
526+
shadowed: true,
527+
type: 'regular',
528+
};
529+
expect(isMessageBlocked(message)).toBe(true);
530+
});
531+
532+
it('returns true for moderation remove error messages when not shadowed', () => {
533+
const message =
534+
fromPartial <
535+
LocalMessage >
536+
{
537+
moderation: { action: 'remove' },
538+
shadowed: false,
539+
type: 'error',
540+
};
541+
expect(isMessageBlocked(message)).toBe(true);
542+
});
543+
544+
it('returns false when message is not shadowed and not a moderation remove error', () => {
545+
const message =
546+
fromPartial <
547+
LocalMessage >
548+
{
549+
shadowed: false,
550+
type: 'regular',
551+
};
552+
expect(isMessageBlocked(message)).toBe(false);
553+
});
554+
});
517555
});

src/components/Message/utils.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -497,11 +497,12 @@ export const isMessageBounced = (
497497
message.moderation?.action === 'bounce');
498498

499499
export const isMessageBlocked = (
500-
message: Pick<LocalMessage, 'type' | 'moderation' | 'moderation_details'>,
500+
message: Pick<LocalMessage, 'type' | 'moderation' | 'moderation_details' | 'shadowed'>,
501501
) =>
502-
message.type === 'error' &&
503-
(message.moderation_details?.action === 'MESSAGE_RESPONSE_ACTION_REMOVE' ||
504-
message.moderation?.action === 'remove');
502+
message.shadowed ||
503+
(message.type === 'error' &&
504+
(message.moderation_details?.action === 'MESSAGE_RESPONSE_ACTION_REMOVE' ||
505+
message.moderation?.action === 'remove'));
505506

506507
export const isMessageEdited = (message: Pick<LocalMessage, 'message_text_updated_at'>) =>
507508
!!message.message_text_updated_at;

yarn.lock

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11936,10 +11936,10 @@ stdin-discarder@^0.2.2:
1193611936
resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.2.2.tgz#390037f44c4ae1a1ae535c5fe38dc3aba8d997be"
1193711937
integrity sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==
1193811938

11939-
stream-chat@^9.38.0:
11940-
version "9.38.0"
11941-
resolved "https://registry.yarnpkg.com/stream-chat/-/stream-chat-9.38.0.tgz#5c13eb8bbc2fa4adb774687b0c9c51f129d1b458"
11942-
integrity sha512-nyTFKHnhGfk1Op/xuZzPKzM9uNTy4TBma69+ApwGj/UtrK2pT6rSaU0Qy/oAqub+Bh7jR2/5vlV/8FWJ2BObFg==
11939+
stream-chat@^9.41.1:
11940+
version "9.41.1"
11941+
resolved "https://registry.yarnpkg.com/stream-chat/-/stream-chat-9.41.1.tgz#a877c8aa800d78b497eec2fad636345d4422309c"
11942+
integrity sha512-W8zjfINYol2UtdRMz2t/NN2GyjDrvb4pJgKmhtuRYzCY1u0Cjezcsu5OCNgyAM0QsenlY6tRqnvAU8Qam5R49Q==
1194311943
dependencies:
1194411944
"@types/jsonwebtoken" "^9.0.8"
1194511945
"@types/ws" "^8.5.14"

0 commit comments

Comments
 (0)