|
1 |
| -import React from 'react'; |
| 1 | +import React, { useMemo } from 'react'; |
2 | 2 | import clsx from 'clsx';
|
| 3 | +import type { TranslationLanguages } from 'stream-chat'; |
3 | 4 |
|
4 | 5 | import { Attachment as DefaultAttachment } from '../Attachment';
|
5 | 6 | import { Avatar as DefaultAvatar } from '../Avatar';
|
6 | 7 | import { Poll } from '../Poll';
|
7 |
| - |
8 | 8 | import { useChatContext } from '../../context/ChatContext';
|
9 | 9 | import { useComponentContext } from '../../context/ComponentContext';
|
10 | 10 | import { useMessageContext } from '../../context/MessageContext';
|
11 | 11 | import { useTranslationContext } from '../../context/TranslationContext';
|
12 | 12 | import { useChannelActionContext } from '../../context/ChannelActionContext';
|
| 13 | +import { renderText as defaultRenderText } from './renderText'; |
| 14 | +import type { MessageContextValue } from '../../context/MessageContext'; |
13 | 15 |
|
14 |
| -import type { TranslationLanguages } from 'stream-chat'; |
| 16 | +export type QuotedMessageProps< |
| 17 | + StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics, |
| 18 | +> = Pick<MessageContextValue<StreamChatGenerics>, 'renderText'>; |
15 | 19 |
|
16 | 20 | import type { DefaultStreamChatGenerics } from '../../types/types';
|
17 | 21 |
|
18 | 22 | export const QuotedMessage = <
|
19 | 23 | StreamChatGenerics extends DefaultStreamChatGenerics = DefaultStreamChatGenerics,
|
20 |
| ->() => { |
| 24 | +>({ |
| 25 | + renderText: propsRenderText, |
| 26 | +}: QuotedMessageProps) => { |
21 | 27 | const { Attachment = DefaultAttachment, Avatar: ContextAvatar } =
|
22 | 28 | useComponentContext<StreamChatGenerics>('QuotedMessage');
|
23 | 29 | const { client } = useChatContext();
|
24 |
| - const { isMyMessage, message } = useMessageContext<StreamChatGenerics>('QuotedMessage'); |
| 30 | + const { |
| 31 | + isMyMessage, |
| 32 | + message, |
| 33 | + renderText: contextRenderText, |
| 34 | + } = useMessageContext<StreamChatGenerics>('QuotedMessage'); |
25 | 35 | const { t, userLanguage } = useTranslationContext('QuotedMessage');
|
26 | 36 | const { jumpToMessage } = useChannelActionContext('QuotedMessage');
|
27 | 37 |
|
| 38 | + const renderText = propsRenderText ?? contextRenderText ?? defaultRenderText; |
| 39 | + |
28 | 40 | const Avatar = ContextAvatar || DefaultAvatar;
|
29 | 41 |
|
30 | 42 | const { quoted_message } = message;
|
31 |
| - if (!quoted_message) return null; |
32 | 43 |
|
33 |
| - const poll = quoted_message.poll_id && client.polls.fromState(quoted_message.poll_id); |
| 44 | + const poll = quoted_message?.poll_id && client.polls.fromState(quoted_message.poll_id); |
34 | 45 | const quotedMessageDeleted =
|
35 |
| - quoted_message.deleted_at || quoted_message.type === 'deleted'; |
| 46 | + quoted_message?.deleted_at || quoted_message?.type === 'deleted'; |
36 | 47 |
|
37 | 48 | const quotedMessageText = quotedMessageDeleted
|
38 | 49 | ? t('This message was deleted...')
|
39 |
| - : quoted_message.i18n?.[`${userLanguage}_text` as `${TranslationLanguages}_text`] || |
40 |
| - quoted_message.text; |
| 50 | + : quoted_message?.i18n?.[`${userLanguage}_text` as `${TranslationLanguages}_text`] || |
| 51 | + quoted_message?.text; |
41 | 52 |
|
42 | 53 | const quotedMessageAttachment =
|
43 |
| - quoted_message.attachments?.length && !quotedMessageDeleted |
| 54 | + quoted_message?.attachments?.length && !quotedMessageDeleted |
44 | 55 | ? quoted_message.attachments[0]
|
45 | 56 | : null;
|
46 | 57 |
|
| 58 | + const renderedText = useMemo( |
| 59 | + () => renderText(quotedMessageText, quoted_message?.mentioned_users), |
| 60 | + [quotedMessageText, quoted_message?.mentioned_users, renderText], |
| 61 | + ); |
| 62 | + |
| 63 | + if (!quoted_message) return null; |
47 | 64 | if (!quoted_message.poll && !quotedMessageText && !quotedMessageAttachment) return null;
|
48 | 65 |
|
49 | 66 | return (
|
@@ -80,7 +97,7 @@ export const QuotedMessage = <
|
80 | 97 | className='str-chat__quoted-message-bubble__text'
|
81 | 98 | data-testid='quoted-message-text'
|
82 | 99 | >
|
83 |
| - {quotedMessageText} |
| 100 | + {renderedText} |
84 | 101 | </div>
|
85 | 102 | </>
|
86 | 103 | )}
|
|
0 commit comments