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 ? [() => ] : []),
// () =>