import { useEffect, useState, useRef } from 'react'; import { useParams, useNavigate, useLocation } from 'react-router-dom'; import { Dropdown, Input, Button, Empty, Tooltip, Tag, Select, Divider, Radio, Popover } from 'antd'; import { PlusOutlined, WhatsAppOutlined, LoadingOutlined, HistoryOutlined, FireOutlined,AudioTwoTone, FilterOutlined, TagsOutlined, TagsTwoTone, FilterTwoTone } from '@ant-design/icons'; import { fetchConversationsList, fetchOrderConversationsList, fetchConversationItemClose, fetchConversationsSearch, postNewConversationItem, fetchConversationItemUnread, UNREAD_MARK } from '@/actions/ConversationActions'; import { ChatItem } from 'react-chat-elements'; import ConversationsNewItem from './ConversationsNewItem'; import { isEmpty, olog, stringToColour } from '@/utils/commons'; import useConversationStore from '@/stores/ConversationStore'; import useAuthStore from '@/stores/AuthStore'; import { useVisibilityState } from '@/hooks/useVisibilityState'; import { OrderLabelDefaultOptions, OrderStatusDefaultOptions, RemindStateDefaultOptions } from '@/stores/OrderStore' const { Option, OptGroup } = Select; const TagColorStyle = (tag) => { const color = stringToColour(tag); return { color: `${color}`, borderColor: `${color}66`, backgroundColor: `${color}0D` } } /** * [] */ const Conversations = ({ mobile }) => { const routerReplace = mobile === undefined ? true : false; // : true; const routePrefix = mobile === undefined ? `/order/chat` : `/m/chat`; const { state: orderRow } = useLocation(); const { coli_guest_WhatsApp } = orderRow || {}; const { order_sn } = useParams(); const navigate = useNavigate(); const userId = useAuthStore((state) => state.loginUser.userId); const initialState = useConversationStore((state) => state.initialState); const [currentConversation, setCurrentConversation] = useConversationStore((state) => [state.currentConversation, state.setCurrentConversation]); const conversationsList = useConversationStore((state) => state.conversationsList); const [conversationsListLoading, setConversationsListLoading] = useConversationStore((state) => [state.conversationsListLoading, state.setConversationsListLoading]); const addToConversationList = useConversationStore((state) => state.addToConversationList); const delConversationitem = useConversationStore((state) => state.delConversationitem); const closedConversationsList = useConversationStore((state) => state.closedConversationsList); const setClosedConversationList = useConversationStore((state) => state.setClosedConversationList); const isVisible = useVisibilityState(); const [tabSelectedConversation, setTabSelectedConversation] = useState({}); const [tabCnt, setTabCnt] = useState(-1); async function refreshConversationList() { setConversationsListLoading(mobile !== undefined ? true : false); const _list = await fetchConversationsList({ opisn: userId }); addToConversationList(_list); setConversationsListLoading(false); } useEffect(() => { if (mobile !== undefined) { setCurrentConversation({}); } return () => {}; }, []); useEffect(() => { if (isVisible) { refreshConversationList(); } return () => {}; }, [isVisible]); const [activeList, setActiveList] = useState(true); const [dataSource, setDataSource] = useState(conversationsList); const [listUpdateFlag, setListUpdateFlag] = useState(); useEffect(() => { // setDataSource(conversationsList); setDataSource(activeList ? conversationsList: closedConversationsList); return () => {}; }, [conversationsList.length, listUpdateFlag, currentConversation.unread_msg_count]); const [switchToC, setSwitchToC] = useState({}); const [shouldFetchCList, setShouldFetchCList] = useState(true); useEffect(() => { if (order_sn && shouldFetchCList && initialState) { getOrderConversationList(order_sn); } return () => {}; }, [order_sn, shouldFetchCList, initialState]); const getOrderConversationList = async (colisn, WHATSAPP_ID = null) => { const { whatsapp_phone_number } = switchToC; const whatsappID = WHATSAPP_ID || coli_guest_WhatsApp || whatsapp_phone_number || ''; // let findCurrentOrderChats = conversationsList.filter((item) => `${item.coli_sn}` === `${colisn}`); // 使用opisn + whatsappID 判断, 解决订单修改whatsappID号码之后获取新会话, 登录账号此处省略 let findCurrentOrderChats = conversationsList.filter((item) => `${item.whatsapp_phone_number}` === `${whatsappID}` && `${item.coli_sn}` === `${colisn}`); let findCurrentIndex = isEmpty(findCurrentOrderChats) ? -1 : 0; // findCurrentOrderChats.length-1; let findCurrent = findCurrentOrderChats[findCurrentIndex]; if (findCurrentIndex !== -1) { addToConversationList(findCurrentOrderChats); } else if (!isEmpty(whatsappID)) { const data = await fetchOrderConversationsList({ opisn: userId, colisn: colisn, whatsappid: whatsappID }); if (!isEmpty(data)) { addToConversationList(data); findCurrentIndex = 0; // data.length-1; // data.lastIndexOf((item) => item.coli_sn === Number(colisn)); findCurrent = data[findCurrentIndex]; } else { // findCurrentIndex = conversationsList.findIndex((item) => item.coli_sn === Number(colisn)); // data.findIndex((item) => item.sn === currentConversation.sn); } } else if (isEmpty(whatsappID)) { // 刷新页面 findCurrentIndex = conversationsList.findIndex((item) => `${item.coli_sn}` === `${colisn}`); findCurrent = conversationsList[findCurrentIndex]; } if (findCurrentIndex >= 0) { setCurrentConversation(findCurrent); return findCurrent; } else { // reset chat window setCurrentConversation({ sn: '', customer_name: '', coli_sn: order_sn }); return false; } }; const onSwitchConversation = async (item) => { setCurrentConversation(item); if (isEmpty(item.coli_sn)) { navigate(routePrefix, { replace: true }); } else { setSwitchToC(item); setShouldFetchCList(false); navigate(`${routePrefix}/${item.coli_sn}`, { replace: routerReplace }); } // if (!isEmpty(item.coli_sn)) { // setSwitchToC(item); // setShouldFetchCList(false); // navigate(`/order/chat/${item.coli_sn}`, { replace: true }); // } else { // navigate(`/order/chat`, { replace: true }); // } // switchConversation(item); }; const handleConversationItemClose = async (item) => { 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); }; const handleConversationItemUnread = async (item) => { await fetchConversationItemUnread({ conversationid: item.sn }); await refreshConversationList(); setListUpdateFlag(Math.random()); } const searchInputRef = useRef(null); const [searchContent, setSearchContent] = useState(''); const handleSearchConversations = (val) => { const fromSource = activeList ? conversationsList : closedConversationsList; if (val.toLowerCase().trim() !== '') { const res = fromSource.filter( (item) => item.whatsapp_name.toLowerCase().includes(val.toLowerCase().trim()) || item.whatsapp_phone_number.toLowerCase().includes(val.toLowerCase().trim()) || item.coli_id.toLowerCase().includes(val.toLowerCase().trim()) ); setDataSource(res); return false; } setDataSource(fromSource); }; const handleRichSearchConvs = (params) => { // alert('1') } const [newChatModalVisible, setNewChatModalVisible] = useState(false); // const closedVisible = closedConversationsList.length > 0; const toggleClosedConversationsList = () => { const _active = activeList; setDataSource(_active ? closedConversationsList : conversationsList); setActiveList(!activeList); setCurrentConversation({}); }; const filterTags = [ { color: 'volcano', label: '重点', value: '重点' }, { color: 'success', label: '成行', value: '成行' }, { color: 'gold', label: '老客户', value: '老客户' }, { color: 'blue', label: '走团中', value: '走团中' }, { color: 'red-inverse', label: '投诉', value: '投诉' }, ]; /** * todo: 弹出, 多选 */ const filterTag = ( ); return (
{/*
{conversationsListLoading && dataSource.length === 0 ? (
) : null} {dataSource.map((item) => ( , key: 'd2' }, { label: '隐藏会话', key: 'close', danger: true }, ], onClick: ({ key, domEvent }) => { domEvent.stopPropagation(); switch (key) { case 'close': return handleConversationItemClose(item); case 'unread': return handleConversationItemUnread(item); default: return; } }, }} trigger={['contextMenu']}>
{/* {filterTags.map((tag) => {tag.label})} */}
{item.coli_id}
{[ { label: '已付款', key: 'p1' }, { label: '地接', key: 'p2' }, ]?.map((tag) => ( {tag.label} ))}
} date={item.last_received_time || item.last_send_time} unread={item.unread_msg_count > 99 ? 0 : item.unread_msg_count} // className={[ // String(item.sn) === String(currentConversation.sn) ? '__active text-primary bg-whatsapp-bg' : '', // String(item.sn) === String(tabSelectedConversation?.sn) ? ' bg-neutral-200' : '', // ].join(' ')} statusText={} statusColor={'#fff'} onClick={() => onSwitchConversation(item)} customStatusComponents={[ ...(item.unread_msg_count > 99 ? [() =>
] : []), // () => 💎💴❤👑💼🤝💤💔💨✅🕳❓❔❇✳❎🚫❌🎈🎊🎁📜, ]} />
))} {dataSource.length === 0 && }
setNewChatModalVisible(false)} onCancel={() => setNewChatModalVisible(false)} /> ); }; export default Conversations;