feat: 链接识别和可点击

dev/chat
Lei OT 2 years ago
parent 738492da17
commit 64895873c3

@ -13,6 +13,13 @@ export const replaceTemplateString = (str, replacements) => {
return result; return result;
} }
const autoLinkText = (text) => {
let regex = /(https?:\/\/[^\s]+)/g;
let newText = text.replace(regex, '<a href="$1" target="_blank">$1</a>');
return newText;
}
/** /**
* *
// +8618777396951 lyj // +8618777396951 lyj
@ -37,6 +44,8 @@ export const sentMsgTypeMapped = {
...msg, ...msg,
actionId: msg.id, actionId: msg.id,
conversationid: msg.id.split('.')[0], conversationid: msg.id.split('.')[0],
originText: (msg.text),
text: autoLinkText(msg.text),
...(msg.context ...(msg.context
? { ? {
reply: { reply: {
@ -169,7 +178,7 @@ export const whatsappMsgTypeMapped = {
}, },
text: { text: {
type: 'text', type: 'text',
data: (msg) => ({ id: msg.wamid, text: msg.text.body }), data: (msg) => ({ id: msg.wamid, text: autoLinkText(msg.text.body), originText: msg.text.body }),
renderForReply: (msg) => ({ id: msg.wamid, message: msg.text.body }), renderForReply: (msg) => ({ id: msg.wamid, message: msg.text.body }),
}, },
image: { image: {

@ -72,7 +72,7 @@ const InputBox = () => {
{referenceMsg.id && ( {referenceMsg.id && (
<Flex justify='space-between' className='reply-to bg-gray-100 p-1 rounded-none text-slate-500'> <Flex justify='space-between' className='reply-to bg-gray-100 p-1 rounded-none text-slate-500'>
<div className=' border-l-3 border-y-0 border-r-0 border-slate-300 border-solid pl-2 pr-1 py-1'> <div className=' border-l-3 border-y-0 border-r-0 border-slate-300 border-solid pl-2 pr-1 py-1'>
<span className=' text-primary pr-1 italic'>{referenceMsg.senderName}</span>{referenceMsg.text}</div> <span className=' text-primary pr-1 italic'>{referenceMsg.senderName}</span>{referenceMsg.originText}</div>
<Button type='text' title='取消引用' className=' rounded-none text-slate-500' icon={<CloseCircleOutlined />} size={'middle'} onClick={() => (setReferenceMsg({}))} /> <Button type='text' title='取消引用' className=' rounded-none text-slate-500' icon={<CloseCircleOutlined />} size={'middle'} onClick={() => (setReferenceMsg({}))} />
</Flex> </Flex>
)} )}

@ -1,11 +1,12 @@
import { useEffect, useState, useRef, useMemo } from 'react'; import { useEffect, useState, useRef, useMemo } from 'react';
import { Image, Spin } from 'antd'; import { Image, Spin, Dropdown } from 'antd';
import { DownOutlined } from '@ant-design/icons';
import { MessageBox } from 'react-chat-elements'; import { MessageBox } from 'react-chat-elements';
import useConversationStore from '@/stores/ConversationStore'; import useConversationStore from '@/stores/ConversationStore';
import { useShallow } from 'zustand/react/shallow'; import { useShallow } from 'zustand/react/shallow';
const Messages = () => { const Messages = () => {
const { currentConversation, setReferenceMsg, msgListLoading, } = useConversationStore(); const { currentConversation, setReferenceMsg, msgListLoading } = useConversationStore();
const activeMessages = useConversationStore(useShallow((state) => (currentConversation.sn ? state.activeConversations[currentConversation.sn] : []))); const activeMessages = useConversationStore(useShallow((state) => (currentConversation.sn ? state.activeConversations[currentConversation.sn] : [])));
const messagesList = useMemo( const messagesList = useMemo(
@ -25,9 +26,9 @@ const Messages = () => {
replyButton: ['text'].includes(message.whatsapp_msg_type) ? true : false, replyButton: ['text'].includes(message.whatsapp_msg_type) ? true : false,
}), }),
})), })),
[activeMessages, currentConversation.sn] [activeMessages]
); );
console.log('messagesList----------------------------------------------------', messagesList); // console.log('messagesList----------------------------------------------------', messagesList);
const messagesEndRef = useRef(null); const messagesEndRef = useRef(null);
useEffect(() => { useEffect(() => {
@ -50,13 +51,38 @@ const Messages = () => {
return ( return (
<div> <div>
<Spin spinning={msgListLoading} tip={'正在读取...'} wrapperClassName='pt-8 ' > <Spin spinning={msgListLoading} tip={'正在读取...'} wrapperClassName='pt-8 '>
{messagesList.map((message, index) => ( {messagesList.map((message, index) => (
<MessageBox key={message.key} {...message} onReplyClick={() => setReferenceMsg(message)} onOpen={() => handlePreview(message)} /> // <Dropdown
))} // key={message.key}
<Image src={previewSrc} preview={{ visible: previewVisible, src: previewSrc, onClose: onPreviewClose }} /> // menu={{
<div ref={messagesEndRef}></div> // items: [{ label: '', key: 'reply' }],
</Spin> // onClick: ({ key, domEvent }) => {
// domEvent.stopPropagation();
// switch (key) {
// case 'reply':
// return setReferenceMsg(message);
// default:
// return;
// }
// },
// }}
// trigger={['contextMenu']}
// >
<MessageBox
key={message.key}
{...message}
onReplyClick={() => setReferenceMsg(message)}
onOpen={() => handlePreview(message)}
{...(message.type === 'text' ? { text: <div dangerouslySetInnerHTML={{ __html: message.text }}></div> } : {})}
/>
// </Dropdown>
))}
<Image src={previewSrc} preview={{ visible: previewVisible, src: previewSrc, onClose: onPreviewClose }} />
<div ref={messagesEndRef}></div>
</Spin>
</div> </div>
); );
}; };

@ -15,3 +15,6 @@
background: linear-gradient(0deg,#00000014,#0000); background: linear-gradient(0deg,#00000014,#0000);
color: #00000073; color: #00000073;
} }
.chatwindow-wrapper .rce-mbox-text:after{
content: none;
}

Loading…
Cancel
Save