|
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