-
Notifications
You must be signed in to change notification settings - Fork 298
Expand file tree
/
Copy pathQuotedMessage.tsx
More file actions
105 lines (93 loc) · 3.74 KB
/
QuotedMessage.tsx
File metadata and controls
105 lines (93 loc) · 3.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
import React, { useMemo } from 'react';
import clsx from 'clsx';
import type { TranslationLanguages } from 'stream-chat';
import { Attachment as DefaultAttachment } from '../Attachment';
import { Avatar as DefaultAvatar } from '../Avatar';
import { Poll } from '../Poll';
import { useChatContext } from '../../context/ChatContext';
import { useComponentContext } from '../../context/ComponentContext';
import { useMessageContext } from '../../context/MessageContext';
import { useTranslationContext } from '../../context/TranslationContext';
import { useChannelActionContext } from '../../context/ChannelActionContext';
import { renderText as defaultRenderText } from './renderText';
import type { MessageContextValue } from '../../context/MessageContext';
import { useActionHandler } from './';
export type QuotedMessageProps = Pick<MessageContextValue, 'renderText'>;
export const QuotedMessage = ({ renderText: propsRenderText }: QuotedMessageProps) => {
const { Attachment = DefaultAttachment, Avatar: ContextAvatar } =
useComponentContext('QuotedMessage');
const { client } = useChatContext();
const {
isMyMessage,
message,
renderText: contextRenderText,
} = useMessageContext('QuotedMessage');
const { t, userLanguage } = useTranslationContext('QuotedMessage');
const { jumpToMessage } = useChannelActionContext('QuotedMessage');
const actionHandler = useActionHandler(message);
const renderText = propsRenderText ?? contextRenderText ?? defaultRenderText;
const Avatar = ContextAvatar || DefaultAvatar;
const { quoted_message } = message;
const poll = quoted_message?.poll_id && client.polls.fromState(quoted_message.poll_id);
const quotedMessageDeleted =
quoted_message?.deleted_at || quoted_message?.type === 'deleted';
const quotedMessageText = quotedMessageDeleted
? t('This message was deleted...')
: quoted_message?.i18n?.[`${userLanguage}_text` as `${TranslationLanguages}_text`] ||
quoted_message?.text;
const quotedMessageAttachment =
quoted_message?.attachments?.length && !quotedMessageDeleted
? quoted_message.attachments[0]
: null;
const renderedText = useMemo(
() => renderText(quotedMessageText, quoted_message?.mentioned_users),
[quotedMessageText, quoted_message?.mentioned_users, renderText],
);
if (!quoted_message) return null;
if (!quoted_message.poll && !quotedMessageText && !quotedMessageAttachment) return null;
return (
<>
<div
className={clsx('str-chat__quoted-message-preview', { mine: isMyMessage() })}
data-testid='quoted-message'
onClickCapture={(e) => {
e.stopPropagation();
e.preventDefault();
jumpToMessage(quoted_message.id);
}}
>
{quoted_message.user && (
<Avatar
className='str-chat__avatar--quoted-message-sender'
image={quoted_message.user.image}
name={quoted_message.user.name || quoted_message.user.id}
user={quoted_message.user}
/>
)}
<div
className='str-chat__quoted-message-bubble'
data-testid='quoted-message-contents'
>
{poll ? (
<Poll isQuoted poll={poll} />
) : (
<>
{quotedMessageAttachment && (
<Attachment attachments={[quotedMessageAttachment]} isQuoted />
)}
<div
className='str-chat__quoted-message-bubble__text'
data-testid='quoted-message-text'
>
{renderedText}
</div>
</>
)}
</div>
</div>
{message.attachments?.length ? (
<Attachment actionHandler={actionHandler} attachments={message.attachments} />
) : null}
</>
);
};