diff --git a/src/lib/msgUtils.js b/src/lib/msgUtils.js index 6212dd1..fa82325 100644 --- a/src/lib/msgUtils.js +++ b/src/lib/msgUtils.js @@ -266,9 +266,9 @@ export const whatsappMsgTypeMapped = { }, }, originText: msg.image?.caption || '', - onOpen: () => { - console.log('Open image', msg.image.link); - }, + // onOpen: () => { + // console.log('Open image', msg.image.link); + // }, }), renderForReply: (msg) => ({ id: msg.wamid, diff --git a/src/views/Conversations/Components/MessagesList.jsx b/src/views/Conversations/Components/MessagesList.jsx index cbc7ed2..6902482 100644 --- a/src/views/Conversations/Components/MessagesList.jsx +++ b/src/views/Conversations/Components/MessagesList.jsx @@ -1,60 +1,61 @@ -import { useEffect, useState, useRef, memo, createRef, forwardRef } from 'react'; -import { Image, Button } from 'antd'; -import { DownOutlined } from '@ant-design/icons'; +import { useEffect, useRef, useState, forwardRef, memo } from 'react'; import { MessageBox } from 'react-chat-elements'; -import useConversationStore from '@/stores/ConversationStore'; +import { Button } from 'antd'; +import { DownOutlined } from '@ant-design/icons'; import { useShallow } from 'zustand/react/shallow'; +import useConversationStore from '@/stores/ConversationStore'; import { isEmpty, olog } from '@/utils/utils'; -const MessagesList = ({ reference, contactsModalOpen, setContactsModalOpen, ...props }) => { +const MessagesList = ({ messages, handlePreview, reference }) => { const setReferenceMsg = useConversationStore(useShallow((state) => state.setReferenceMsg)); - olog('render message list'); - - const scrollToMessage = (id, index) => { - const _i = index || props.dataSource.findIndex((msg) => msg.id === id); - if (_i >= 0) { - messageRefs.current[_i].current.scrollIntoView({ behavior: 'smooth', block: 'center' }); - } - }; + // const messagesEndRef = useRef(null); const messageRefs = useRef([]); - messageRefs.current = props.dataSource.map((_, i) => messageRefs.current[i] ?? createRef()); + const [page, setPage] = useState(1); + let timeout = null; - const toBottom = (e) => { - if (!reference) return; - reference.current.scrollTop = reference.current.scrollHeight - reference.current.offsetHeight; + const fetchNextPage = async () => { + olog('fetchNextPage') + setPage(page + 1); + // Fetch next page of messages here }; - const prevProps = useRef(props); - useEffect(() => { - if (prevProps.current.dataSource.length !== props.dataSource.length) { - toBottom(); + const handleScroll = (e) => { + const { scrollTop } = e.target; + const delay = 1000; // 1 second + + if (scrollTop === 0) { + if (timeout) clearTimeout(timeout); + timeout = setTimeout(fetchNextPage, delay); } + }; - prevProps.current = props; - }, [prevProps, props]); + const scrollToBottom = () => { + if (reference.current) { + reference.current.scrollTop = reference.current.scrollHeight; + } + }; - const [previewVisible, setPreviewVisible] = useState(false); - const [previewSrc, setPreviewSrc] = useState(); - const onPreviewClose = () => { - setPreviewSrc(''); - setPreviewVisible(false); + const scrollToMessage = (id, index) => { + const _i = index || messages.findIndex((msg) => msg.id === id); + if (reference.current && messageRefs.current[_i]) { + reference.current.scrollTop = messageRefs.current[_i].offsetTop; + } }; - const handlePreview = (msg) => { - switch (msg.type) { - case 'photo': - setPreviewVisible(true); - setPreviewSrc(msg.data.uri); - return false; - case 'file': - window.open(msg.data.link || msg.data.uri, '_blank', 'noopener,noreferrer'); - return false; + useEffect(scrollToBottom, [messages]); - default: - return false; + useEffect(() => { + const messageList = reference.current; + if (messageList) { + messageList.addEventListener('scroll', handleScroll); } - }; + return () => { + if (messageList) { + messageList.removeEventListener('scroll', handleScroll); + } + }; + }, []); const RenderText = memo(function renderText({ str }) { const parts = str.split(/(https?:\/\/[^\s]+|\p{Emoji_Presentation})/gmu).filter((s) => s !== ''); @@ -88,6 +89,7 @@ const MessagesList = ({ reference, contactsModalOpen, setContactsModalOpen, ...p ); }); + // eslint-disable-next-line react/display-name const MessageBoxWithRef = forwardRef((props, ref) => (