Skip to content

Commit d0eb89d

Browse files
authored
feat: Support rendering subcomponents of ThreadListItem (#1205)
### ChangeLog * Added sub-rendering props to the `ThreadListItem` and `ThreadListItemContent` components. * Added props list: `renderSenderProfile`, `renderMessageBody`, `renderMessageHeader`, `renderEmojiReactions`, and `renderMobileMenuOnLongPress`. * How to use: ```tsx const CustomThread = () => ( <ThreadProvider> <ThreadUI renderMessage={(props) => ( <ThreadListItem {...props} renderSenderProfile={() => <></>} /> )} /> </ThreadProvider> ) ```
1 parent aa4add7 commit d0eb89d

File tree

5 files changed

+185
-262
lines changed

5 files changed

+185
-262
lines changed

src/modules/Thread/components/ThreadList/ThreadListItem.tsx

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useMemo, useState, useRef, useEffect, useLayoutEffect, ReactNode } from 'react';
1+
import React, { useMemo, useState, useRef, useEffect, useLayoutEffect } from 'react';
22
import format from 'date-fns/format';
33
import type { FileMessage, MultipleFilesMessage } from '@sendbird/chat/message';
44

@@ -21,32 +21,28 @@ import { SendableMessageType } from '../../../../utils';
2121
import { User } from '@sendbird/chat';
2222
import { getCaseResolvedReplyType } from '../../../../lib/utils/resolvedReplyType';
2323
import { classnames } from '../../../../utils/utils';
24-
import type { MessageMenuProps } from '../../../../ui/MessageMenu';
25-
import type { MessageEmojiMenuProps } from '../../../../ui/MessageItemReactionMenu';
24+
import { MessageComponentRenderers } from '../../../../ui/MessageContent';
2625

27-
export interface ThreadListItemProps {
26+
export interface ThreadListItemProps extends MessageComponentRenderers {
2827
className?: string;
2928
message: SendableMessageType;
3029
chainTop?: boolean;
3130
chainBottom?: boolean;
3231
hasSeparator?: boolean;
3332
renderCustomSeparator?: (props: { message: SendableMessageType }) => React.ReactElement;
3433
handleScroll?: () => void;
35-
renderEmojiMenu?: (props: MessageEmojiMenuProps) => ReactNode;
36-
renderMessageMenu?: (props: MessageMenuProps) => ReactNode;
3734
}
3835

39-
export default function ThreadListItem({
40-
className,
41-
message,
42-
chainTop,
43-
chainBottom,
44-
hasSeparator,
45-
renderCustomSeparator,
46-
handleScroll,
47-
renderEmojiMenu,
48-
renderMessageMenu,
49-
}: ThreadListItemProps): React.ReactElement {
36+
export default function ThreadListItem(props: ThreadListItemProps): React.ReactElement {
37+
const {
38+
className,
39+
message,
40+
chainTop,
41+
chainBottom,
42+
hasSeparator,
43+
renderCustomSeparator,
44+
handleScroll,
45+
} = props;
5046
const { stores, config } = useSendbirdStateContext();
5147
const { isOnline, userMention, logger, groupChannel } = config;
5248
const userId = stores?.userStore?.user?.userId;
@@ -237,13 +233,13 @@ export default function ThreadListItem({
237233
))
238234
}
239235
<ThreadListItemContent
236+
{...props}
240237
userId={userId}
241238
channel={currentChannel}
242239
message={message}
243240
chainTop={chainTop}
244241
chainBottom={chainBottom}
245242
isReactionEnabled={isReactionEnabled}
246-
isMentionEnabled={isMentionEnabled}
247243
disableQuoteMessage
248244
replyType={replyType}
249245
nicknamesMap={nicknamesMap}
@@ -253,8 +249,6 @@ export default function ThreadListItem({
253249
showFileViewer={setShowFileViewer}
254250
toggleReaction={toggleReaction}
255251
showEdit={setShowEdit}
256-
renderEmojiMenu={renderEmojiMenu}
257-
renderMessageMenu={renderMessageMenu}
258252
/>
259253
{/* modal */}
260254
{showRemove && (

0 commit comments

Comments
 (0)