@@ -22,40 +22,42 @@ import { MAX_USER_MENTION_COUNT, MAX_USER_SUGGESTION_COUNT } from '../../context
2222import DateSeparator from '../../../../ui/DateSeparator' ;
2323import Label , { LabelTypography , LabelColors } from '../../../../ui/Label' ;
2424import MessageInput from '../../../../ui/MessageInput' ;
25- import MessageContent from '../../../../ui/MessageContent' ;
25+ import MessageContent , { type MessageContentProps } from '../../../../ui/MessageContent' ;
2626import FileViewer from '../FileViewer' ;
2727import RemoveMessageModal from '../RemoveMessageModal' ;
2828import { MessageInputKeys } from '../../../../ui/MessageInput/const' ;
29- import { EveryMessage , RenderCustomSeparatorProps , RenderMessageProps } from '../../../../types' ;
29+ import { EveryMessage , RenderCustomSeparatorProps , RenderMessageParamsType } from '../../../../types' ;
3030import { useLocalization } from '../../../../lib/LocalizationContext' ;
3131import { useDirtyGetMentions } from '../../../Message/hooks/useDirtyGetMentions' ;
3232import SuggestedReplies from '../SuggestedReplies' ;
33+ import { omitObjectProperties } from '../../../../utils/omitObjectProperty' ;
3334
34- type MessageUIProps = {
35+ export interface MessageUIProps {
3536 message : EveryMessage ;
3637 hasSeparator ?: boolean ;
3738 chainTop ?: boolean ;
3839 chainBottom ?: boolean ;
3940 handleScroll ?: ( isBottomMessageAffected ?: boolean ) => void ;
4041 // for extending
41- renderMessage ?: ( props : RenderMessageProps ) => React . ReactElement ;
42+ renderMessage ?: ( props : RenderMessageParamsType ) => React . ReactElement ;
43+ renderMessageContent ?: ( props : MessageContentProps ) => React . ReactElement ;
4244 renderCustomSeparator ?: ( props : RenderCustomSeparatorProps ) => React . ReactElement ;
4345 renderEditInput ?: ( ) => React . ReactElement ;
44- renderMessageContent ?: ( ) => React . ReactElement ;
45- } ;
46+ }
4647
4748// todo: Refactor this component, is too complex now
48- const Message = ( {
49- message,
50- hasSeparator,
51- chainTop,
52- chainBottom,
53- handleScroll,
54- renderCustomSeparator,
55- renderEditInput,
56- renderMessage,
57- renderMessageContent,
58- } : MessageUIProps ) : React . ReactElement => {
49+ const Message = ( props : MessageUIProps ) : React . ReactElement => {
50+ const {
51+ message,
52+ hasSeparator,
53+ chainTop,
54+ chainBottom,
55+ handleScroll,
56+ renderCustomSeparator,
57+ renderEditInput,
58+ renderMessage,
59+ renderMessageContent = ( props ) => ( < MessageContent { ...props } /> ) ,
60+ } = props ;
5961 const { dateLocale, stringSet } = useLocalization ( ) ;
6062 const globalStore = useSendbirdStateContext ( ) ;
6163
@@ -69,6 +71,7 @@ const Message = ({
6971 const maxUserMentionCount = userMention ?. maxMentionCount || MAX_USER_MENTION_COUNT ;
7072 const maxUserSuggestionCount = userMention ?. maxSuggestionCount || MAX_USER_SUGGESTION_COUNT ;
7173
74+ const context = useChannelContext ( ) ;
7275 const {
7376 initialized,
7477 currentGroupChannel,
@@ -94,7 +97,7 @@ const Message = ({
9497 onMessageHighlighted,
9598 sendMessage,
9699 localMessages,
97- } = useChannelContext ( ) ;
100+ } = context ;
98101 const [ showEdit , setShowEdit ] = useState ( false ) ;
99102 const [ showRemove , setShowRemove ] = useState ( false ) ;
100103 const [ showFileViewer , setShowFileViewer ] = useState ( false ) ;
@@ -191,20 +194,10 @@ const Message = ({
191194 clearTimeout ( messageAnimatedTimeout ) ;
192195 } ;
193196 } , [ animatedMessageId , messageScrollRef . current , message . messageId , onMessageAnimated ] ) ;
194- const renderedMessage = useMemo ( ( ) => {
195- return renderMessage ?.( {
196- message,
197- chainTop,
198- chainBottom,
199- } ) ;
200- } , [ message , renderMessage ] ) ;
201- const renderedCustomSeparator = useMemo ( ( ) => {
202- if ( renderCustomSeparator ) {
203- return renderCustomSeparator ?.( { message : message } ) ;
204- }
205- return null ;
206- } , [ message , renderCustomSeparator ] ) ;
207197
198+ // Operate `renderMessage` props
199+ const renderedCustomSeparator = useMemo ( ( ) => renderCustomSeparator ?.( { message : message } ) ?? null , [ message , renderCustomSeparator ] ) ;
200+ const renderedMessage = useMemo ( ( ) => renderMessage ?.( omitObjectProperties ( props , [ 'renderMessage' ] ) ) , [ message , renderMessage ] ) ;
208201 if ( renderedMessage ) {
209202 return (
210203 < div
@@ -346,35 +339,31 @@ const Message = ({
346339 ) )
347340 }
348341 { /* Message */ }
349- {
350- renderMessageContent ?.( ) || (
351- < MessageContent
352- className = "sendbird-message-hoc__message-content"
353- userId = { userId }
354- scrollToMessage = { scrollToMessage }
355- channel = { currentGroupChannel }
356- message = { message }
357- disabled = { ! isOnline }
358- chainTop = { chainTop }
359- chainBottom = { chainBottom }
360- isReactionEnabled = { isReactionEnabled }
361- replyType = { replyType }
362- threadReplySelectType = { threadReplySelectType }
363- nicknamesMap = { nicknamesMap }
364- emojiContainer = { emojiContainer }
365- showEdit = { setShowEdit }
366- showRemove = { setShowRemove }
367- showFileViewer = { setShowFileViewer }
368- resendMessage = { resendMessage }
369- deleteMessage = { deleteMessage }
370- toggleReaction = { toggleReaction }
371- setQuoteMessage = { setQuoteMessage }
372- onReplyInThread = { onReplyInThread }
373- onQuoteMessageClick = { onQuoteMessageClick }
374- onMessageHeightChange = { handleScroll }
375- />
376- )
377- }
342+ { renderMessageContent ( {
343+ className : 'sendbird-message-hoc__message-content' ,
344+ userId,
345+ scrollToMessage,
346+ channel : currentGroupChannel ,
347+ message,
348+ disabled : ! isOnline ,
349+ chainTop,
350+ chainBottom,
351+ isReactionEnabled,
352+ replyType,
353+ threadReplySelectType,
354+ nicknamesMap,
355+ emojiContainer,
356+ showEdit : setShowEdit ,
357+ showRemove : setShowRemove ,
358+ showFileViewer : setShowFileViewer ,
359+ resendMessage,
360+ deleteMessage,
361+ toggleReaction,
362+ setQuoteMessage,
363+ onReplyInThread,
364+ onQuoteMessageClick : onQuoteMessageClick ,
365+ onMessageHeightChange : handleScroll ,
366+ } ) }
378367 { /** Suggested Replies */ }
379368 { message . messageId === currentGroupChannel ?. lastMessage ?. messageId
380369 // the options should appear only when there's no failed or pending messages
0 commit comments