import { createContext, useEffect, useState, memo } from 'react'; import { App, Button } from 'antd'; import { MailFilled, MailOutlined, WhatsAppOutlined } from '@ant-design/icons'; import { MessageBox } from 'react-chat-elements'; import { groupBy, isEmpty } from '@/utils/commons'; import useConversationStore from '@/stores/ConversationStore'; import { useShallow } from 'zustand/react/shallow'; import { WABIcon } from '@/components/Icons'; import ChannelLogo from './ChannelLogo'; const outboundStyle = { 'waba': { color: '#ccd4ae' }, 'whatsapp': { color: '#d9fdd3' }, 'wai': { color: '#d9fdd3' }, } const BubbleIM = ({ handlePreview, handleContactClick, setNewChatModalVisible, setNewChatFormValues, scrollToMessage, focusMsg, ...message }) => { const { message: appMessage } = App.useApp(); const setReferenceMsg = useConversationStore(useShallow((state) => state.setReferenceMsg)); const openNewChatModal = ({ wa_id, wa_name }) => { setNewChatModalVisible(true); setNewChatFormValues((prev) => ({ ...prev, phone_number: wa_id, name: wa_name })); }; const RenderText = memo(function renderText({ str, className, template, message }) { let headerObj, footerObj, buttonsArr; if (!isEmpty(template) && !isEmpty(template.components)) { const componentsObj = groupBy(template.components, (item) => item.type); headerObj = componentsObj?.header?.[0]; footerObj = componentsObj?.footer?.[0]; buttonsArr = componentsObj?.buttons?.reduce((r, c) => r.concat(c.buttons), []); } const parts = str.split(/(https?:\/\/[^\s()]+|\p{Emoji_Presentation}|\d{4,})/gmu).filter((s) => s !== ''); const links = str.match(/https?:\/\/[^\s()]+/gi) || []; const numbers = str.match(/\d{4,}/g) || []; const emojis = str.match(/([\u2700-\u27BF]|[\uE000-\uF8FF]|\uD83C[\uDC00-\uDFFF]|\uD83D[\uDC00-\uDFFF]|[\u2011-\u26FF]|\uD83E[\uDD10-\uDDFF])/g) || []; const extraClass = isEmpty(emojis) ? '' : ''; const objArr = parts.reduce((prev, curr, index) => { if (links.includes(curr)) { prev.push({ type: 'link', key: curr }); } else if (numbers.includes(curr)) { prev.push({ type: 'number', key: curr }); } else if (emojis.includes(curr)) { prev.push({ type: 'emoji', key: curr }); } else { prev.push({ type: 'text', key: curr }); } return prev; }, []); return ( {headerObj ? (
{'text' === (headerObj?.parameters?.[0]?.type || '').toLowerCase() &&
{headerObj.text}
} {'image' === (headerObj?.parameters?.[0]?.type || '').toLowerCase() && } {['document', 'video'].includes((headerObj?.parameters?.[0]?.type || '').toLowerCase()) && ( [ {headerObj.parameters[0].type} ] )}
) : null} {(objArr || []).map((part, index) => { if (part.type === 'link') { return ( {part.key} ) } else if (part.type === 'number') { return ( openNewChatModal({ wa_id: part.key, wa_name: part.key })}> {part.key} ) } else { // if (part.type === 'emoji') return part.key } })} {footerObj ?
{footerObj.text}
: null} {buttonsArr && buttonsArr.length > 0 ? (
{buttonsArr.map((btn, index) => btn.type.toLowerCase() === 'url' ? ( ) : btn.type.toLowerCase() === 'phone_number' ? ( ) : ( ), )}
) : null}
) }); return ( setReferenceMsg(message)} onReplyMessageClick={() => scrollToMessage(message.reply.id)} onOpen={() => handlePreview(message)} onTitleClick={() => handlePreview(message)} // title={
{message.title}
} text={} replyButton={['text', 'document', 'image'].includes(message.whatsapp_msg_type) && message.replyButton} {...(message.sender === 'me' ? { // styles: { backgroundColor: '#ccd4ae' }, notchStyle: { fill: outboundStyle[message.msg_source.toLowerCase()].color }, title: <>{message.wabaName ? ` ${message.wabaName} - ${message.title || ''}` : ` ${message.title || message.from || ''}`}, } : { // title: <>  {message.title}, dateString: `${message.wabaName} - ${message.dateString}`, })} className={[ 'whitespace-pre-wrap', message.whatsapp_msg_type === 'sticker' ? 'bg-transparent' : '', // message.sender === 'me' ? 'whatsappme-container' : '', focusMsg === message.id ? 'message-box-focus' : '', message.status === 'failed' ? 'failed-msg' : '', // '*:bg-waba-me' message.sender === 'me' ? (message.msg_source.toLowerCase() === 'waba' ? `[&_.rce-mbox]:bg-waba-me` : `[&_.rce-mbox]:bg-whatsapp-me`) : '', message.sender !== 'me' ? (message.msg_source.toLowerCase() === 'waba' ? `[&_.rce-mbox-time:before]:text-waba-600 [&_.rce-mbox-time:before]:font-semibold` : `[&_.rce-mbox-time:before]:text-whatsapp`) : '', ].join(' ')} {...(message.type === 'meetingLink' ? { actionButtons: [ ...(message.waBtn ? [ { onClickButton: () => handleContactClick(message.data), Component: () =>
发消息
, }, ] : []), { onClickButton: () => { navigator.clipboard.writeText(message.text); appMessage.success('复制成功😀'); }, Component: () =>
复制
, }, ], } : {})} /> ); }; export default BubbleIM;