import React, { useEffect, useState, useRef } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { Dropdown, Input, Button, Tag, Popover, Form, Tooltip, Spin } from 'antd'; import { CloseCircleOutlined, MinusCircleOutlined } from '@ant-design/icons'; import { fetchConversationItemClose, fetchConversationsSearch, fetchConversationItemUnread, fetchConversationItemTop, postConversationTags, deleteConversationTags, fetchCleanUnreadMsgCount } from '@/actions/ConversationActions'; import { ChatItem } from 'react-chat-elements'; // import ConversationsNewItem from './ConversationsNewItem'; import { flush, isEmpty, isNotEmpty, stringToColour, TagColorStyle } from '@/utils/commons'; import useConversationStore from '@/stores/ConversationStore'; import useAuthStore from '@/stores/AuthStore'; import ChannelLogo from './ChannelLogo'; import RegionCodeEmoji from '@/components/RegionCodeEmoji' import { ReadIcon } from '@/components/Icons'; import useStyleStore from '@/stores/StyleStore'; import { OrderLabelDefaultOptionsMapped, OrderStatusDefaultOptionsMapped } from '@/stores/OrderStore'; import { whatsappMsgTypeMapped } from '@/channel/bubbleMsgUtils'; const OrderSignEmoji = ({ item }) => ( <> {OrderLabelDefaultOptionsMapped[String(item.order_label_id)]?.emoji} {OrderStatusDefaultOptionsMapped[String(item.order_state_id)]?.emoji} {item.intour === 1 && item.order_state_id === 5 ? '👣' : ''} ) const NewTagForm = ({onSubmit,...props}) => { const [form] = Form.useForm(); const [subLoding, setSubLoding] = useState(false); const inputRef = useRef(null); useEffect(() => { inputRef.current?.focus() return () => {} }, []) const onFinish = async (values) => { // console.log('Received values of form[new_tag]: ', values); setSubLoding(true); if (typeof onSubmit === 'function') { await onSubmit(values.tag_label); } form.resetFields(); setSubLoding(false); } return (
); }; const ChatListItem = (({item, refreshConversationList,setListUpdateFlag,onSwitchConversation, setNewChatModalVisible,setEditingChat,...props}) => { const [mobile] = useStyleStore((state) => [state.mobile]); const routerReplace = mobile === false ? true : false; // : true; const routePrefix = mobile === false ? `/order/chat` : `/m/chat`; const { order_sn } = useParams(); const navigate = useNavigate(); const userId = useAuthStore((state) => state.loginUser.userId); const [currentConversation, setCurrentConversation] = useConversationStore((state) => [state.currentConversation, state.setCurrentConversation]); const delConversationitem = useConversationStore((state) => state.delConversationitem); const setClosedConversationList = useConversationStore((state) => state.setClosedConversationList); const [currentHandleChat, setCurrentHandleChat] = useState({}); const [handleLoading, setHandleLoading] = useState(false); const itemTagsKeys = (item.tags || []).map(t => t.key); const [tags, addTag] = useConversationStore(state => [state.tags, state.addTag]); const handleConversationItemClose = async (item) => { setHandleLoading(true); await fetchConversationItemClose({ conversationid: item.sn, opisn: item.opi_sn }); delConversationitem(item); if (String(order_sn) === String(item.coli_sn)) { navigate(routePrefix, { replace: routerReplace }); } const _clist = await fetchConversationsSearch({ opisn: userId, session_enable: 0 }); setClosedConversationList(_clist); setCurrentHandleChat({}); setHandleLoading(false); }; const handleConversationItemUnread = async (item) => { setHandleLoading(true); if (item.unread_msg_count < 999) { await fetchConversationItemUnread({ conversationid: item.sn }); } else { await fetchCleanUnreadMsgCount({ opisn: item.opi_sn, conversationid: item.sn }); } await refreshConversationList(item.lasttime); setListUpdateFlag(Math.random()); setCurrentHandleChat({}); setHandleLoading(false); } const handleConversationItemTop = async (item) => { setHandleLoading(true); await fetchConversationItemTop({ conversationid: item.sn, top_state: item.top_state === 0 ? 1 : 0 }); await refreshConversationList(item.lasttime); setListUpdateFlag(Math.random()); setCurrentHandleChat({}); setHandleLoading(false); } const handleConversationItemMuted = async (item) => { setHandleLoading(true); await fetchConversationItemTop({ conversationid: item.sn, top_state: item.top_state === -1 ? 0 : -1 }); await refreshConversationList(item.lasttime); setListUpdateFlag(Math.random()); setCurrentHandleChat({}); setHandleLoading(false); } const handleConversationItemTags = async (item, tagKey, tagLabel) => { const _tags = (item.tags || []).map(t => t.key); setHandleLoading(true); if (isNotEmpty(tagKey) && _tags.includes(Number(tagKey))) { await deleteConversationTags({ conversationid: item.sn, tag_id: tagKey, opisn: userId }) } else { const rtag = await postConversationTags({ conversationid: item.sn, tag_id: tagKey || '', tag_label: tagLabel || '', opisn: userId, }) if (isEmpty(tagKey)) { addTag({ label: rtag.tag_label, key: rtag.tag_key, value: rtag.tag_key }) } } await refreshConversationList(item.lasttime); setListUpdateFlag(Math.random()); setContextMenuOpen(false); setCurrentHandleChat({}); setHandleLoading(false); } const [contextMenuOpen, setContextMenuOpen] = useState(false); const handleContextMenuOpenChange = (nextOpen, info, item) => { if (info.source === 'trigger' || nextOpen) { setContextMenuOpen(nextOpen); setCurrentHandleChat(nextOpen ? item : {}) } else { // setCurrentHandleChat({}); } }; const [openTags, setOpenTags] = useState([]); useEffect(() => { if (contextMenuOpen === false) { setOpenTags([]); } return () => {}; }, [contextMenuOpen]) const RenderLastMsg = (msg) => { const readFromMsg = msg?.originText || msg?.text || ''; // const _text = isEmpty(msg) ? '' : msg.type === 'text' ? msg.text.body : `[${(msg?.type || '').toUpperCase()}]`; const _text = isEmpty(msg?.type) ? '' : ((whatsappMsgTypeMapped?.[msg.type]?.renderForReply(msg) || {})?.message || readFromMsg) return ( <>{_text} ); }; return ( <> handleContextMenuOpenChange(nextOpen, info, item)} menu={{ items: [ { label: item.top_state === 1 ? '取消置顶' : '置顶会话', key: 'top' }, { label: item.unread_msg_count > 998 ? '标为已读' : '标记为未读', key: 'unread' }, // { label: item.top_state === -1 ? '取消静音' : '设为静音', key: 'mute' }, { label: '设置标签', key: 'tags', children: [ ...tags.map((t) => ({ ...t, key: `tag_${t.key}`, style: { color: stringToColour(t.label) }, // icon: itemTagsKeys.includes(t.key) ? : false, extra: itemTagsKeys.includes(t.key) ? : false, })), { label: ( <> { handleConversationItemTags(item, '', tagLabel) setContextMenuOpen(false) }} /> } placement='bottom' trigger={['click']}> ), key: 'new_tags', }, ], onTitleClick: ({ key, domEvent }) => { // console.log(']]]', key); }, }, { label: '编辑联系人', key: 'edit0' }, { type: 'divider' }, { label: '移到🗂隐藏列表', key: 'close', danger: true }, ], triggerSubMenuAction: 'click', openKeys: openTags, onOpenChange: (openKeys) => { if (!isEmpty(openKeys) && contextMenuOpen) { setOpenTags(openKeys) } }, onClick: ({ key, domEvent }) => { domEvent.stopPropagation() if (key.startsWith('tag_')) { const tagKey = key.replace('tag_', '') return handleConversationItemTags(item, tagKey) } switch (key) { case 'top': setContextMenuOpen(false); return handleConversationItemTop(item); case 'mute': setContextMenuOpen(false); return handleConversationItemMuted(item); case 'unread': setContextMenuOpen(false); return handleConversationItemUnread(item); case 'close': setContextMenuOpen(false); return handleConversationItemClose(item); case 'edit0': setOpenTags([]) setEditingChat({ ...item, is_new: false }) return setNewChatModalVisible(true) case 'new_tags': return default: // setContextMenuOpen(false); console.log('unknown key', key) return } }, }}>
{/*
{tags.map((tag) => {tag.label})}
*/} {/* 🔝 */} {/* */} {item.show_default} // item.conversation_memo || } // subtitle={item.coli_id} subtitle={ <> {/* */} {/* */} {/* */} {/* {item.coli_id} */} {/* 最后一条消息 */}
{(item?.tags || [])?.map((tag) => ( {tag.label} ))} {/* 附加备注 */}
} date={item.lasttime || item.last_received_time || item.last_send_time} dateString='' // 为了覆盖: 其他客户端发送的失败消息, 推送到此处产生新会话, 但是dataString是长字符串 unread={item.unread_msg_count > 99 ? 0 : item.unread_msg_count} muted={item.top_state === -1} showMute={item.top_state === -1} // className={[ // String(item.sn) === String(currentConversation.sn) ? '__active text-primary bg-whatsapp-bg' : '', // String(item.sn) === String(tabSelectedConversation?.sn) ? ' bg-neutral-200' : '', // ].join(' ')} // statusText={} statusText={ } statusColor={'#fff'} onClick={() => onSwitchConversation(item)} customStatusComponents={[ ...(item.unread_msg_count > 99 ? [() =>
] : []), // () =>