import { GetRoomEngine, RoomChatSettings, RoomObjectCategory } from '@nitrots/nitro-renderer'; import { FC, useEffect, useMemo, useRef, useState } from 'react'; import { ChatBubbleMessage } from '../../../../api'; import { useOnClickChat } from '../../../../hooks'; interface ChatWidgetMessageViewProps { chat: ChatBubbleMessage; makeRoom: (chat: ChatBubbleMessage) => void; bubbleWidth?: number; } export const ChatWidgetMessageView: FC = ({ chat = null, makeRoom = null, bubbleWidth = RoomChatSettings.CHAT_BUBBLE_WIDTH_NORMAL }) => { const [ isVisible, setIsVisible ] = useState(false); const [ isReady, setIsReady ] = useState(false); const elementRef = useRef(null); const { onClickChat } = useOnClickChat(); const getBubbleWidth = useMemo(() => { switch(bubbleWidth) { case RoomChatSettings.CHAT_BUBBLE_WIDTH_NORMAL: return 'w-350'; case RoomChatSettings.CHAT_BUBBLE_WIDTH_THIN: return 'w-240'; case RoomChatSettings.CHAT_BUBBLE_WIDTH_WIDE: return 'w-2000'; default: return 'w-350'; } }, [ bubbleWidth ]); useEffect(() => { setIsVisible(false); const element = elementRef.current; if(!element) return; const { offsetWidth: width, offsetHeight: height } = element; chat.width = width; chat.height = height; chat.elementRef = element; let { left, top } = chat; if(!left && !top) { left = (chat.location.x - (width / 2)); top = (element.parentElement.offsetHeight - height); chat.left = left; chat.top = top; } setIsReady(true); return () => { chat.elementRef = null; setIsReady(false); }; }, [ chat ]); useEffect(() => { if(!isReady || !chat || isVisible) return; if(makeRoom) makeRoom(chat); setIsVisible(true); }, [ chat, isReady, isVisible, makeRoom ]); return (
GetRoomEngine().selectRoomObject(chat.roomId, chat.senderId, RoomObjectCategory.UNIT) }> { chat.styleId === 0 && (
) }
{ chat.imageUrl && chat.imageUrl.length > 0 && (
) }
); };