import { useRef, useEffect, useState, forwardRef, memo } from 'react'; import { App, Flex, List, Button, } from 'antd'; import { LoadingOutlined } from '@ant-design/icons'; import { MessageBox } from 'react-chat-elements'; import { MESSAGE_PAGE_SIZE, fetchMessagesHistory } from '@/actions/ConversationActions'; import useFormStore from '@/stores/FormStore'; import { isEmpty, stringToColour, groupBy, isNotEmpty } from '@/utils/commons'; import { useShallow } from 'zustand/react/shallow'; import MergeConversationTo from './MergeConversationTo'; import BubbleIM from '../Online/Components/BubbleIM'; import BubbleEmail from '../Online/Components/BubbleEmail'; const BIG_PAGE_SIZE = MESSAGE_PAGE_SIZE * 20; const MessagesList = ({ ...listProps }) => { const { message: appMessage } = App.useApp(); const [formValues] = useFormStore((state) => [state.chatHistoryForm]); const [selectedConversation] = useFormStore((state) => [state.chatHistorySelectChat]); const [paramsForMsgList, setParamsForMsgList] = useFormStore((state) => [state.msgListParams, state.setMsgListParams]); const [selectMatch, setSelectedMatch] = useFormStore((state) => [state.msgHistorySelectMatch, state.setMsgHistorySelectMatch]); const [setImageAlbumList, setImagePreviewSrc] = useFormStore(useShallow((state) => [state.setImageAlbum, state.setImagePreviewSrc])); const [chatItemMessages, setChatItemMessages] = useState([]); const [messageListPreLoading, setMessageListPreLoading] = useState(false); const [messageListLoading, setMessageListLoading] = useState(false); const getMessagesPre = async (chatItem) => { setMessageListPreLoading(true); const data = await fetchMessagesHistory({ ...chatItem, lasttime: chatItem.pretime, pagedir: 'pre', pagesize: BIG_PAGE_SIZE }); setMessageListPreLoading(false); // const prevChatItemMessages = chatItemMessages; // setChatItemMessages([].concat(data, prevChatItemMessages)); setChatItemMessages((prevValue) => [].concat(data, prevValue)); const loadPrePage = !(data.length === 0 || data.length < BIG_PAGE_SIZE); if (data.length > 0) { setParamsForMsgList({ loadPrePage, pretime: data[0].orgmsgtime }); } }; const getMessagesNext = async (chatItem) => { setMessageListLoading(true); const data = await fetchMessagesHistory({ ...chatItem, pagedir: 'next', pagesize: BIG_PAGE_SIZE }); setMessageListLoading(false); // const prevChatItemMessages = chatItemMessages; // setChatItemMessages([].concat(prevChatItemMessages, data)); setChatItemMessages((prevValue) => [].concat(prevValue, data)); const loadNextPage = !(data.length === 0 || data.length < BIG_PAGE_SIZE); if (data.length > 0) { setParamsForMsgList({ loadNextPage, lasttime: data[data.length - 1].orgmsgtime }); } }; // 选择指定消息之后, 定位 const scrollToSelectedMessage = (selected) => { const findIndex = chatItemMessages.findIndex((item) => item.id === selected.id); if (findIndex !== -1) { scrollToMessage(selected.id, findIndex); } }; // 选中会话之后, 获取消息记录 useEffect(() => { setChatItemMessages([]); setParamsForMsgList({}); setSelectedMatch({}); setFocusMsg(''); if (isEmpty(selectedConversation.conversationid)) { return () => {}; } // opisn: (selectedConversation.opi_sn || 0), whatsappid: selectedConversation.whatsapp_phone_number, const firstActionPageParams = { conversationid: selectedConversation.conversationid , loadNextPage: true }; // if (isEmpty(selectedConversation.matchMsgList)) { if (!isEmpty(formValues?.from_date)) { firstActionPageParams.lasttime = formValues.from_date; firstActionPageParams.loadPrePage = true; } if (!isEmpty(formValues?.search) && !isEmpty(selectedConversation.matchMsgList)) { firstActionPageParams.pretime = selectedConversation.matchMsgList[0].orgmsgtime; firstActionPageParams.lasttime = selectedConversation.matchMsgList[0].orgmsgtime; firstActionPageParams.loadPrePage = true; } setParamsForMsgList(firstActionPageParams); async function getFirstNext() { await getMessagesNext(firstActionPageParams); } getFirstNext(); return () => {}; }, [selectedConversation.conversationid]); // 点击匹配的记录, 定位滚动 useEffect(() => { async function getFirstPre(_params) { await getMessagesPre(_params); } const findIndex = chatItemMessages.findIndex((item) => item.id === selectMatch.id); if (findIndex === -1) { setMessageListLoading(true); getFirstPre({ ...paramsForMsgList }); setMessageListLoading(false); } scrollToSelectedMessage(selectMatch); return () => {}; }, [selectMatch.id]); // 更新是否需要显示上一页,下一页按钮 useEffect(() => { if (chatItemMessages.length > 0) { // setParamsForMsgList({ pretime: chatItemMessages[0].orgmsgtime, lasttime: chatItemMessages[chatItemMessages.length - 1].orgmsgtime }); const album = chatItemMessages.filter((ele) => ele.whatsapp_msg_type === 'image').map((ele) => ele.data.uri); setImageAlbumList(album); } return () => {}; }, [chatItemMessages]); const onLoadMore = () => { getMessagesNext(paramsForMsgList); // window.dispatchEvent(new Event('resize')); }; const loadMore = !messageListLoading && paramsForMsgList.loadNextPage ? (