perf: 在线聊天: 显示过期时间

dev/mobile
Lei OT 2 years ago
parent 3d14eb9680
commit f86da08caa

@ -255,11 +255,12 @@ const messageSlice = (set, get) => ({
const targetIndex = conversationsList.findIndex((ele) => String(ele.sn) === String(targetId)); const targetIndex = conversationsList.findIndex((ele) => String(ele.sn) === String(targetId));
let newConversations = []; let newConversations = [];
if (targetIndex !== -1 && message.status === 'received') { // 'delivered' if (targetIndex !== -1) { // 'delivered'
// 更新列表的时间 // 更新列表的时间
conversationsList.splice(targetIndex, 1, { conversationsList.splice(targetIndex, 1, {
...conversationsList[targetIndex], ...conversationsList[targetIndex],
last_received_time: message.deliverTime, // todo: 需要+8 hours last_received_time: message.status === 'received' ? message.deliverTime : conversationsList[targetIndex].last_received_time, // todo: 需要+8 hours
conversation_expiretime: message?.conversation?.expireTime || conversationsList[targetIndex].conversation_expiretime || '', // 保留使用UTC时间
}); });
} else if (targetIndex === -1) { } else if (targetIndex === -1) {
// 当前客户端不存在的会话 todo: 设置为当前(在WhatsApp返回号码不一致时) // 当前客户端不存在的会话 todo: 设置为当前(在WhatsApp返回号码不一致时)
@ -273,6 +274,7 @@ const messageSlice = (set, get) => ({
whatsapp_name: message?.senderName || message?.sender || '', whatsapp_name: message?.senderName || message?.sender || '',
customer_name: message?.senderName || message?.sender || '', customer_name: message?.senderName || message?.sender || '',
whatsapp_phone_number: message.from, whatsapp_phone_number: message.from,
conversation_expiretime: message?.conversation?.expireTime || '', // 保留使用UTC时间
}]; }];
} }

@ -1,7 +1,7 @@
import { useEffect, useState, useRef } from 'react'; import { useEffect, useState, useRef } from 'react';
import { useParams, useNavigate, useLocation } from 'react-router-dom'; import { useParams, useNavigate, useLocation } from 'react-router-dom';
import { Dropdown, Input } from 'antd'; import { Dropdown, Input } from 'antd';
import { fetchOrderConversationsList, fetchConversationItemClose, fetchMessages, MESSAGE_PAGE_SIZE, } from '@/actions/ConversationActions'; import { fetchOrderConversationsList, fetchConversationItemClose, } from '@/actions/ConversationActions';
import { ChatItem } from 'react-chat-elements'; import { ChatItem } from 'react-chat-elements';
import { isEmpty } from '@/utils/utils'; import { isEmpty } from '@/utils/utils';
import useConversationStore from '@/stores/ConversationStore'; import useConversationStore from '@/stores/ConversationStore';

@ -12,23 +12,33 @@ dayjs.extend(utc);
dayjs.extend(timezone); dayjs.extend(timezone);
dayjs.extend(relativeTime); dayjs.extend(relativeTime);
const ExpireTimeClock = () => { const ExpireTimeClock = ({ expireTime }) => {
const currentConversation = useConversationStore((state) => state.currentConversation); // const expireTime = useConversationStore((state) => state.currentConversation.conversation_expiretime);
const [customerDateTime, setCustomerDateTime] = useState(); const [customerDateTime, setCustomerDateTime] = useState('');
const [isExpired, setIsExpired] = useState(false);
useEffect(() => { useEffect(() => {
const intervalId = setInterval(() => { const intervalId = setInterval(() => {
setCustomerDateTime(dayjs(currentConversation.conversation_expireTime).tz('Asia/Shanghai').fromNow()); // .tz('Asia/Shanghai') UTC Asia/Shanghai GMT+8
}, 1000); // Update every second setCustomerDateTime(dayjs(expireTime).add(8, 'hours').fromNow());
}, 1000);
return () => clearInterval(intervalId); return () => clearInterval(intervalId);
}, []); }, [expireTime]);
return currentConversation.conversation_expireTime ? ( useEffect(() => {
const _ago = customerDateTime.slice(-3) === 'ago';
setIsExpired(_ago);
return () => {};
}, [customerDateTime]);
return expireTime && !isExpired ? (
<> <>
<Typography.Text className='text-primary'> <Typography.Text className={'text-primary'}>
<ClockCircleOutlined className='px-1' /> <ClockCircleOutlined className='px-1' />
Expire {customerDateTime} {isExpired ? 'Expired' : 'Expire'} {customerDateTime}
</Typography.Text> </Typography.Text>
</> </>
) : null; ) : null;

@ -216,10 +216,10 @@ const InputComposer = ({ mobile }) => {
<div> <div>
{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='referrer-msg border-l-3 border-y-0 border-r-0 border-slate-300 border-solid pl-2 pr-1 py-1'> <div className='flex flex-col referrer-msg 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 align-top'>{referenceMsg.senderName}</span> <span className=' text-primary pr-1 italic align-top'>{referenceMsg.senderName}</span>
{referenceMsg.type === 'photo' && <Image width={100} src={referenceMsg.data.uri} />} {referenceMsg.type === 'photo' && <Image width={100} src={referenceMsg.data.uri} />}
<span className='px-1'>{referenceMsg.originText}</span> <span className='px-1 whitespace-pre-wrap'>{referenceMsg.originText}</span>
</div> </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>
@ -278,7 +278,7 @@ const InputComposer = ({ mobile }) => {
<Button type='text' className='' icon={<FilePdfOutlined />} size={'middle'} /> */} <Button type='text' className='' icon={<FilePdfOutlined />} size={'middle'} /> */}
</Flex> </Flex>
<Flex gap={4} align={'center'}> <Flex gap={4} align={'center'}>
<ExpireTimeClock /> <ExpireTimeClock expireTime={currentConversation.conversation_expiretime} />
<Button key={'send-btn'} onClick={handleSendText} type='primary' size='middle' icon={<SendOutlined />} disabled={!textabled || pastedUploading}> <Button key={'send-btn'} onClick={handleSendText} type='primary' size='middle' icon={<SendOutlined />} disabled={!textabled || pastedUploading}>
Send Send
</Button> </Button>

@ -54,7 +54,7 @@ const MessagesHeader = () => {
<Spin spinning={msgListLoading} /> <Spin spinning={msgListLoading} />
</Flex> </Flex>
<Flex vertical={true} justify='space-between'> <Flex vertical={true} justify='space-between'>
<Typography.Text><ExpireTimeClock /></Typography.Text> <Typography.Text><ExpireTimeClock expireTime={currentConversation.conversation_expiretime} /></Typography.Text>
{/* <Typography.Text>{customerDateTime}</Typography.Text> */} {/* <Typography.Text>{customerDateTime}</Typography.Text> */}
</Flex> </Flex>
</Flex> </Flex>

Loading…
Cancel
Save