@@ -7,10 +7,10 @@ import format from 'date-fns/format';
77import './index.scss' ;
88
99import MessageStatus from '../MessageStatus' ;
10- import MessageItemMenu from '../MessageItemMenu' ;
11- import MessageItemReactionMenu from '../MessageItemReactionMenu' ;
10+ import { MessageMenu , MessageMenuProps } from '../MessageItemMenu' ;
11+ import { MessageEmojiMenu , MessageEmojiMenuProps } from '../MessageItemReactionMenu' ;
1212import Label , { LabelTypography , LabelColors } from '../Label' ;
13- import EmojiReactions from '../EmojiReactions' ;
13+ import EmojiReactions , { EmojiReactionsProps } from '../EmojiReactions' ;
1414
1515import ClientAdminMessage from '../AdminMessage' ;
1616import QuoteMessage from '../QuoteMessage' ;
@@ -69,6 +69,9 @@ export interface MessageContentProps {
6969 renderSenderProfile ?: ( props : MessageProfileProps ) => ReactNode ;
7070 renderMessageBody ?: ( props : MessageBodyProps ) => ReactNode ;
7171 renderMessageHeader ?: ( props : MessageHeaderProps ) => ReactNode ;
72+ renderMessageMenu ?: ( props : MessageMenuProps ) => ReactNode ;
73+ renderEmojiMenu ?: ( props : MessageEmojiMenuProps ) => ReactNode ;
74+ renderEmojiReactions ?: ( props : EmojiReactionsProps ) => ReactNode ;
7275}
7376
7477export default function MessageContent ( props : MessageContentProps ) : ReactElement {
@@ -109,6 +112,15 @@ export default function MessageContent(props: MessageContentProps): ReactElement
109112 renderMessageHeader = ( props : MessageHeaderProps ) => (
110113 < MessageHeader { ...props } />
111114 ) ,
115+ renderMessageMenu = ( props : MessageMenuProps ) => (
116+ < MessageMenu { ...props } />
117+ ) ,
118+ renderEmojiMenu = ( props : MessageEmojiMenuProps ) => (
119+ < MessageEmojiMenu { ...props } />
120+ ) ,
121+ renderEmojiReactions = ( props : EmojiReactionsProps ) => (
122+ < EmojiReactions { ...props } />
123+ ) ,
112124 } = props ;
113125
114126 const { dateLocale } = useLocalization ( ) ;
@@ -165,20 +177,48 @@ export default function MessageContent(props: MessageContentProps): ReactElement
165177 onMouseLeave = { ( ) => setMouseHover ( false ) }
166178 >
167179 { /* left */ }
168- {
169- renderSenderProfile ( {
170- ...props ,
171- setSupposedHover,
172- isMobile,
173- isReactionEnabledInChannel,
174- isReactionEnabledClassName,
175- isByMe,
176- isByMeClassName,
177- useReplyingClassName,
178- displayThreadReplies,
179- supposedHoverClassName,
180- } )
181- }
180+ < div className = { getClassName ( [ 'sendbird-message-content__left' , isReactionEnabledClassName , isByMeClassName , useReplyingClassName ] ) } >
181+ {
182+ renderSenderProfile ( {
183+ ...props ,
184+ isByMe,
185+ displayThreadReplies,
186+ } )
187+ }
188+ { /* outgoing menu */ }
189+ { isByMe && ! isMobile && (
190+ < div className = { getClassName ( [ 'sendbird-message-content-menu' , isReactionEnabledClassName , supposedHoverClassName , isByMeClassName ] ) } >
191+ { renderMessageMenu ( {
192+ channel : channel ,
193+ message : message as SendableMessageType ,
194+ isByMe : isByMe ,
195+ replyType : replyType ,
196+ disabled : disabled ,
197+ showEdit : showEdit ,
198+ showRemove : showRemove ,
199+ resendMessage : resendMessage ,
200+ setQuoteMessage : setQuoteMessage ,
201+ setSupposedHover : setSupposedHover ,
202+ onReplyInThread : ( { message } ) => {
203+ if ( threadReplySelectType === ThreadReplySelectType . THREAD ) {
204+ onReplyInThread ( { message } ) ;
205+ } else if ( threadReplySelectType === ThreadReplySelectType . PARENT ) {
206+ scrollToMessage ( message . parentMessage ?. createdAt , message . parentMessageId ) ;
207+ }
208+ } ,
209+ } ) }
210+ { isReactionEnabledInChannel && (
211+ renderEmojiMenu ( {
212+ message : message as SendableMessageType ,
213+ userId : userId ,
214+ emojiContainer : emojiContainer ,
215+ toggleReaction : toggleReaction ,
216+ setSupposedHover : setSupposedHover ,
217+ } )
218+ ) }
219+ </ div >
220+ ) }
221+ </ div >
182222 { /* middle */ }
183223 < div
184224 className = { 'sendbird-message-content__middle' }
@@ -247,16 +287,18 @@ export default function MessageContent(props: MessageContentProps): ReactElement
247287 ? '' : 'primary' ,
248288 mouseHover ? 'mouse-hover' : '' ,
249289 ] ) } >
250- < EmojiReactions
251- userId = { userId }
252- message = { message as SendableMessageType }
253- channel = { channel }
254- isByMe = { isByMe }
255- emojiContainer = { emojiContainer }
256- memberNicknamesMap = { nicknamesMap }
257- toggleReaction = { toggleReaction }
258- onPressUserProfile = { onPressUserProfileHandler }
259- />
290+ {
291+ renderEmojiReactions ( {
292+ userId,
293+ message : message as SendableMessageType ,
294+ channel,
295+ isByMe,
296+ emojiContainer,
297+ memberNicknamesMap : nicknamesMap ,
298+ toggleReaction,
299+ onPressUserProfile : onPressUserProfileHandler ,
300+ } )
301+ }
260302 </ div >
261303 ) }
262304 { /* message timestamp when sent by others */ }
@@ -283,38 +325,37 @@ export default function MessageContent(props: MessageContentProps): ReactElement
283325 </ div >
284326 { /* right */ }
285327 < div className = { getClassName ( [ 'sendbird-message-content__right' , chainTopClassName , isReactionEnabledClassName , useReplyingClassName ] ) } >
286- { /* incoming menu */ }
287328 { ! isByMe && ! isMobile && (
288329 < div className = { getClassName ( [ 'sendbird-message-content-menu' , chainTopClassName , supposedHoverClassName , isByMeClassName ] ) } >
289330 { isReactionEnabledInChannel && (
290- < MessageItemReactionMenu
291- className = " sendbird-message-content-menu__reaction-menu"
292- message = { message as SendableMessageType }
293- userId = { userId }
294- emojiContainer = { emojiContainer }
295- toggleReaction = { toggleReaction }
296- setSupposedHover = { setSupposedHover }
297- />
331+ renderEmojiMenu ( {
332+ className : ' sendbird-message-content-menu__reaction-menu' ,
333+ message : message as SendableMessageType ,
334+ userId : userId ,
335+ emojiContainer : emojiContainer ,
336+ toggleReaction : toggleReaction ,
337+ setSupposedHover : setSupposedHover ,
338+ } )
298339 ) }
299- < MessageItemMenu
300- className = " sendbird-message-content-menu__normal-menu"
301- channel = { channel }
302- message = { message as SendableMessageType }
303- isByMe = { isByMe }
304- replyType = { replyType }
305- disabled = { disabled }
306- showRemove = { showRemove }
307- resendMessage = { resendMessage }
308- setQuoteMessage = { setQuoteMessage }
309- setSupposedHover = { setSupposedHover }
310- onReplyInThread = { ( { message } ) => {
340+ { renderMessageMenu ( {
341+ className : ' sendbird-message-content-menu__normal-menu' ,
342+ channel,
343+ message : message as SendableMessageType ,
344+ isByMe,
345+ replyType,
346+ disabled,
347+ showRemove,
348+ resendMessage,
349+ setQuoteMessage,
350+ setSupposedHover,
351+ onReplyInThread : ( { message } ) => {
311352 if ( threadReplySelectType === ThreadReplySelectType . THREAD ) {
312353 onReplyInThread ( { message } ) ;
313354 } else if ( threadReplySelectType === ThreadReplySelectType . PARENT ) {
314355 scrollToMessage ( message . parentMessage ?. createdAt , message . parentMessageId ) ;
315356 }
316- } }
317- />
357+ } ,
358+ } ) }
318359 </ div >
319360 ) }
320361 </ div >
0 commit comments