Skip to content

Commit fbbb461

Browse files
Merge branch 'master' of github.com:GetStream/stream-chat-react into rc
2 parents 67bed79 + 5fa6b0f commit fbbb461

File tree

20 files changed

+80
-9
lines changed

20 files changed

+80
-9
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## [12.14.0](https://github.com/GetStream/stream-chat-react/compare/v12.13.1...v12.14.0) (2025-04-08)
2+
3+
### Features
4+
5+
* [REACT-218] add MessageBlocked component ([#2675](https://github.com/GetStream/stream-chat-react/issues/2675)) ([0ecd147](https://github.com/GetStream/stream-chat-react/commit/0ecd147264a57921623cf80dad0faa97db203cf3))
6+
17
## [12.13.1](https://github.com/GetStream/stream-chat-react/compare/v12.13.0...v12.13.1) (2025-03-05)
28

39
### Chores

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@
186186
"@playwright/test": "^1.42.1",
187187
"@semantic-release/changelog": "^6.0.3",
188188
"@semantic-release/git": "^10.0.1",
189-
"@stream-io/stream-chat-css": "^5.7.2",
189+
"@stream-io/stream-chat-css": "^5.8.0",
190190
"@testing-library/dom": "^10.4.0",
191191
"@testing-library/jest-dom": "^6.6.3",
192192
"@testing-library/react": "^16.2.0",

src/components/Channel/Channel.tsx

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,7 @@ type ChannelPropsForwardedToComponentContext = Pick<
124124
| 'Message'
125125
| 'MessageActions'
126126
| 'MessageBouncePrompt'
127+
| 'MessageBlocked'
127128
| 'MessageDeleted'
128129
| 'MessageListNotifications'
129130
| 'MessageListMainPanel'
@@ -1296,6 +1297,7 @@ const ChannelInner = <V extends CustomTrigger = CustomTrigger>(
12961297
LoadingIndicator: props.LoadingIndicator,
12971298
Message: props.Message,
12981299
MessageActions: props.MessageActions,
1300+
MessageBlocked: props.MessageBlocked,
12991301
MessageBouncePrompt: props.MessageBouncePrompt,
13001302
MessageDeleted: props.MessageDeleted,
13011303
MessageListNotifications: props.MessageListNotifications,
@@ -1348,6 +1350,7 @@ const ChannelInner = <V extends CustomTrigger = CustomTrigger>(
13481350
props.DateSeparator,
13491351
props.EditMessageInput,
13501352
props.EmojiPicker,
1353+
props.emojiSearchIndex,
13511354
props.EmptyStateIndicator,
13521355
props.FileUploadIcon,
13531356
props.GiphyPreviewMessage,
@@ -1357,6 +1360,7 @@ const ChannelInner = <V extends CustomTrigger = CustomTrigger>(
13571360
props.LoadingIndicator,
13581361
props.Message,
13591362
props.MessageActions,
1363+
props.MessageBlocked,
13601364
props.MessageBouncePrompt,
13611365
props.MessageDeleted,
13621366
props.MessageListNotifications,
@@ -1376,11 +1380,14 @@ const ChannelInner = <V extends CustomTrigger = CustomTrigger>(
13761380
props.QuotedMessage,
13771381
props.QuotedMessagePreview,
13781382
props.QuotedPoll,
1383+
props.reactionOptions,
13791384
props.ReactionSelector,
13801385
props.ReactionsList,
13811386
props.ReactionsListModal,
13821387
props.SendButton,
13831388
props.StartRecordingAudioButton,
1389+
props.StopAIGenerationButton,
1390+
props.StreamedMessageText,
13841391
props.ThreadHead,
13851392
props.ThreadHeader,
13861393
props.ThreadStart,
@@ -1390,10 +1397,6 @@ const ChannelInner = <V extends CustomTrigger = CustomTrigger>(
13901397
props.UnreadMessagesNotification,
13911398
props.UnreadMessagesSeparator,
13921399
props.VirtualMessage,
1393-
props.StopAIGenerationButton,
1394-
props.StreamedMessageText,
1395-
props.emojiSearchIndex,
1396-
props.reactionOptions,
13971400
],
13981401
);
13991402

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import React from 'react';
2+
import clsx from 'clsx';
3+
4+
import { useUserRole } from './hooks/useUserRole';
5+
import { useTranslationContext } from '../../context/TranslationContext';
6+
import { useMessageContext } from '../../context';
7+
8+
export const MessageBlocked = () => {
9+
const { message } = useMessageContext();
10+
const { t } = useTranslationContext('MessageBlocked');
11+
12+
const { isMyMessage } = useUserRole(message);
13+
14+
const messageClasses = clsx(
15+
'str-chat__message str-chat__message-simple str-chat__message--blocked',
16+
message.type,
17+
{
18+
'str-chat__message--me str-chat__message-simple--me': isMyMessage,
19+
'str-chat__message--other': !isMyMessage,
20+
},
21+
);
22+
23+
return (
24+
<div
25+
className={messageClasses}
26+
data-testid='message-blocked-component'
27+
key={message.id}
28+
>
29+
<div className='str-chat__message--blocked-inner'>
30+
{t<string>('Message was blocked by moderation policies')}
31+
</div>
32+
</div>
33+
);
34+
};

src/components/Message/MessageSimple.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ import clsx from 'clsx';
44
import { MessageErrorIcon } from './icons';
55
import { MessageBouncePrompt as DefaultMessageBouncePrompt } from '../MessageBounce';
66
import { MessageDeleted as DefaultMessageDeleted } from './MessageDeleted';
7+
import { MessageBlocked as DefaultMessageBlocked } from './MessageBlocked';
78
import { MessageOptions as DefaultMessageOptions } from './MessageOptions';
89
import { MessageRepliesCountButton as DefaultMessageRepliesCountButton } from './MessageRepliesCountButton';
910
import { MessageStatus as DefaultMessageStatus } from './MessageStatus';
1011
import { MessageText } from './MessageText';
1112
import { MessageTimestamp as DefaultMessageTimestamp } from './MessageTimestamp';
1213
import {
1314
areMessageUIPropsEqual,
15+
isMessageBlocked,
1416
isMessageBounced,
1517
isMessageEdited,
1618
messageHasAttachments,
@@ -72,6 +74,7 @@ const MessageSimpleWithContext = (props: MessageSimpleWithContextProps) => {
7274
// TODO: remove this "passthrough" in the next
7375
// major release and use the new default instead
7476
MessageActions = MessageOptions,
77+
MessageBlocked = DefaultMessageBlocked,
7578
MessageDeleted = DefaultMessageDeleted,
7679
MessageBouncePrompt = DefaultMessageBouncePrompt,
7780
MessageRepliesCountButton = DefaultMessageRepliesCountButton,
@@ -96,6 +99,10 @@ const MessageSimpleWithContext = (props: MessageSimpleWithContextProps) => {
9699
return <MessageDeleted message={message} />;
97100
}
98101

102+
if (isMessageBlocked(message)) {
103+
return <MessageBlocked />;
104+
}
105+
99106
const showMetadata = !groupedByUser || endOfGroup;
100107
const showReplyCountButton = !threadList && !!message.reply_count;
101108
const allowRetry = message.status === 'failed' && message.errorStatusCode !== 403;

src/components/Message/utils.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -459,6 +459,13 @@ export const isMessageBounced = (
459459
(message.moderation_details?.action === 'MESSAGE_RESPONSE_ACTION_BOUNCE' ||
460460
message.moderation?.action === 'bounce');
461461

462+
export const isMessageBlocked = (
463+
message: Pick<StreamMessage, 'type' | 'moderation' | 'moderation_details'>,
464+
) =>
465+
message.type === 'error' &&
466+
(message.moderation_details?.action === 'MESSAGE_RESPONSE_ACTION_REMOVE' ||
467+
message.moderation?.action === 'remove');
468+
462469
export const isMessageEdited = (
463470
message: Pick<StreamMessage, 'message_text_updated_at'>,
464471
) => !!message.message_text_updated_at;

src/context/ComponentContext.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ export type ComponentContextValue<V extends CustomTrigger = CustomTrigger> = {
116116
MessageActions?: React.ComponentType;
117117
/** Custom UI component to display the contents of a bounced message modal. Usually it allows to retry, edit, or delete the message. Defaults to and accepts the same props as: [MessageBouncePrompt](https://github.com/GetStream/stream-chat-react/blob/master/src/components/MessageBounce/MessageBouncePrompt.tsx) */
118118
MessageBouncePrompt?: React.ComponentType<MessageBouncePromptProps>;
119+
/** Custom UI component for a moderation-blocked message, defaults to and accepts same props as: [MessageBlocked](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageBlocked.tsx) */
120+
MessageBlocked?: React.ComponentType;
119121
/** Custom UI component for a deleted message, defaults to and accepts same props as: [MessageDeleted](https://github.com/GetStream/stream-chat-react/blob/master/src/components/Message/MessageDeleted.tsx) */
120122
MessageDeleted?: React.ComponentType<MessageDeletedProps>;
121123
MessageListMainPanel?: React.ComponentType<PropsWithChildrenOnly>;

src/i18n/de.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
"Message deleted": "Nachricht gelöscht",
6868
"Message has been successfully flagged": "Nachricht wurde erfolgreich gemeldet",
6969
"Message pinned": "Nachricht angeheftet",
70+
"Message was blocked by moderation policies": "Nachricht wurde durch moderationsrichtlinien blockiert",
7071
"Messages have been marked unread.": "Nachrichten wurden als ungelesen markiert.",
7172
"Missing permissions to upload the attachment": "Fehlende Berechtigungen zum Hochladen des Anhangs",
7273
"Multiple answers": "Mehrere Antworten",

src/i18n/en.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
"Message deleted": "Message deleted",
6868
"Message has been successfully flagged": "Message has been successfully flagged",
6969
"Message pinned": "Message pinned",
70+
"Message was blocked by moderation policies": "Message was blocked by moderation policies",
7071
"Messages have been marked unread.": "Messages have been marked unread.",
7172
"Missing permissions to upload the attachment": "Missing permissions to upload the attachment",
7273
"Multiple answers": "Multiple answers",

src/i18n/es.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
"Message deleted": "Mensaje eliminado",
6868
"Message has been successfully flagged": "El mensaje se marcó correctamente",
6969
"Message pinned": "Mensaje fijado",
70+
"Message was blocked by moderation policies": "El mensaje fue bloqueado por las políticas de moderación",
7071
"Messages have been marked unread.": "Los mensajes han sido marcados como no leídos.",
7172
"Missing permissions to upload the attachment": "Faltan permisos para subir el archivo adjunto",
7273
"Multiple answers": "Múltiples respuestas",

0 commit comments

Comments
 (0)