@@ -3,7 +3,7 @@ import format from 'date-fns/format';
33import './index.scss' ;
44
55import MessageStatus from '../MessageStatus' ;
6- import { MessageMenu , MessageMenuProps } from '../MessageItemMenu ' ;
6+ import { MessageMenu , type MessageMenuProps } from '../MessageMenu ' ;
77import { MessageEmojiMenu , MessageEmojiMenuProps } from '../MessageItemReactionMenu' ;
88import Label , { LabelColors , LabelTypography } from '../Label' ;
99import EmojiReactions , { EmojiReactionsProps } from '../EmojiReactions' ;
@@ -46,6 +46,8 @@ import MessageFeedbackModal from '../MessageFeedbackModal';
4646import { SbFeedbackStatus } from './types' ;
4747import MessageFeedbackFailedModal from '../MessageFeedbackFailedModal' ;
4848import { MobileBottomSheetProps } from '../MobileMenu/types' ;
49+ import useElementObserver from '../../hooks/useElementObserver' ;
50+ import { EMOJI_MENU_ROOT_ID , getObservingId , MENU_OBSERVING_CLASS_NAME , MENU_ROOT_ID } from '../ContextMenu' ;
4951
5052export interface MessageContentProps {
5153 className ?: string | Array < string > ;
@@ -131,15 +133,21 @@ export default function MessageContent(props: MessageContentProps): ReactElement
131133 const { config, eventHandlers } = useSendbirdStateContext ( ) ;
132134 const { logger } = config ;
133135 const onPressUserProfileHandler = eventHandlers ?. reaction ?. onPressUserProfile ;
134- const contentRef = useRef ( null ) ;
136+ const contentRef = useRef < HTMLDivElement > ( ) ;
135137 const timestampRef = useRef < HTMLDivElement > ( ) ;
136138 const threadRepliesRef = useRef < HTMLDivElement > ( ) ;
137139 const feedbackButtonsRef = useRef < HTMLDivElement > ( ) ;
138140 const { isMobile } = useMediaQueryContext ( ) ;
139141 const [ showMenu , setShowMenu ] = useState ( false ) ;
140142
141143 const [ mouseHover , setMouseHover ] = useState ( false ) ;
142- const [ supposedHover , setSupposedHover ] = useState ( false ) ;
144+ const isMenuMounted = useElementObserver (
145+ `#${ getObservingId ( message . messageId ) } .${ MENU_OBSERVING_CLASS_NAME } ` ,
146+ [
147+ document . getElementById ( MENU_ROOT_ID ) ,
148+ document . getElementById ( EMOJI_MENU_ROOT_ID ) ,
149+ ] ,
150+ ) ;
143151 // Feedback states
144152 const [ showFeedbackOptionsMenu , setShowFeedbackOptionsMenu ] = useState ( false ) ;
145153 const [ showFeedbackModal , setShowFeedbackModal ] = useState ( false ) ;
@@ -169,7 +177,7 @@ export default function MessageContent(props: MessageContentProps): ReactElement
169177 const chainTopClassName = chainTop ? 'chain-top' : '' ;
170178 const isReactionEnabledInChannel = isReactionEnabled && ! channel ?. isEphemeral ;
171179 const isReactionEnabledClassName = isReactionEnabledInChannel ? 'use-reactions' : '' ;
172- const supposedHoverClassName = supposedHover ? 'sendbird-mouse-hover' : '' ;
180+ const hoveredMenuClassName = isMenuMounted ? 'sendbird-mouse-hover' : '' ;
173181 const useReplying = ! ! ( ( replyType === 'QUOTE_REPLY' || replyType === 'THREAD' )
174182 && message ?. parentMessageId && message ?. parentMessage
175183 && ! disableQuoteMessage
@@ -279,18 +287,16 @@ export default function MessageContent(props: MessageContentProps): ReactElement
279287 }
280288 { /* outgoing menu */ }
281289 { showOutgoingMenu && (
282- < div className = { classnames ( 'sendbird-message-content-menu' , isReactionEnabledClassName , supposedHoverClassName , isByMeClassName ) } >
290+ < div className = { classnames ( 'sendbird-message-content-menu' , isReactionEnabledClassName , hoveredMenuClassName , isByMeClassName ) } >
283291 { renderMessageMenu ( {
284292 channel,
285293 message,
286294 isByMe,
287295 replyType,
288- disabled,
289296 showEdit,
290297 showRemove,
291298 resendMessage,
292299 setQuoteMessage,
293- setSupposedHover,
294300 onReplyInThread : ( { message } ) => {
295301 if ( threadReplySelectType === ThreadReplySelectType . THREAD ) {
296302 onReplyInThread ?.( { message } ) ;
@@ -306,7 +312,6 @@ export default function MessageContent(props: MessageContentProps): ReactElement
306312 userId,
307313 emojiContainer,
308314 toggleReaction,
309- setSupposedHover,
310315 } )
311316 ) }
312317 </ div >
@@ -367,7 +372,7 @@ export default function MessageContent(props: MessageContentProps): ReactElement
367372 className = { classnames (
368373 'sendbird-message-content__middle__body-container__created-at' ,
369374 'left' ,
370- supposedHoverClassName ,
375+ hoveredMenuClassName ,
371376 uiContainerType ,
372377 ) }
373378 ref = { timestampRef }
@@ -423,7 +428,7 @@ export default function MessageContent(props: MessageContentProps): ReactElement
423428 className = { classnames (
424429 'sendbird-message-content__middle__body-container__created-at' ,
425430 'right' ,
426- supposedHoverClassName ,
431+ hoveredMenuClassName ,
427432 uiContainerType ,
428433 ) }
429434 type = { LabelTypography . CAPTION_3 }
@@ -519,15 +524,14 @@ export default function MessageContent(props: MessageContentProps): ReactElement
519524 className = { classnames ( 'sendbird-message-content__right' , chainTopClassName , isReactionEnabledClassName , useReplyingClassName ) }
520525 data-testid = "sendbird-message-content__right"
521526 >
522- < div className = { classnames ( 'sendbird-message-content-menu' , chainTopClassName , supposedHoverClassName , isByMeClassName ) } >
527+ < div className = { classnames ( 'sendbird-message-content-menu' , chainTopClassName , hoveredMenuClassName , isByMeClassName ) } >
523528 { isReactionEnabledInChannel && (
524529 renderEmojiMenu ( {
525530 className : 'sendbird-message-content-menu__reaction-menu' ,
526531 message,
527532 userId,
528533 emojiContainer,
529534 toggleReaction,
530- setSupposedHover,
531535 } )
532536 ) }
533537 { renderMessageMenu ( {
@@ -536,11 +540,9 @@ export default function MessageContent(props: MessageContentProps): ReactElement
536540 message,
537541 isByMe,
538542 replyType,
539- disabled,
540543 showRemove,
541544 resendMessage,
542545 setQuoteMessage,
543- setSupposedHover,
544546 onReplyInThread : ( { message } ) => {
545547 if ( threadReplySelectType === ThreadReplySelectType . THREAD ) {
546548 onReplyInThread ?.( { message } ) ;
0 commit comments