import classNames from 'clsx'; import React, { useRef, useState } from 'react'; import { FormattedMessage } from 'react-intl'; import { Virtuoso } from 'react-virtuoso'; import { fetchChats } from 'soapbox/actions/chats'; import PullToRefresh from 'soapbox/components/pull-to-refresh'; import { Spinner, Stack, Text } from 'soapbox/components/ui'; import PlaceholderChat from 'soapbox/features/placeholder/components/placeholder-chat'; import { useAppDispatch } from 'soapbox/hooks'; import { useChats } from 'soapbox/queries/chats'; import ChatListItem from './chat-list-item'; interface IChatList { onClickChat: (chat: any) => void, useWindowScroll?: boolean, searchValue?: string } const ChatList: React.FC = ({ onClickChat, useWindowScroll = false, searchValue }) => { const dispatch = useAppDispatch(); const chatListRef = useRef(null); const { chatsQuery: { data: chats, isFetching, hasNextPage, fetchNextPage } } = useChats(searchValue); const [isNearBottom, setNearBottom] = useState(false); const [isNearTop, setNearTop] = useState(true); const handleLoadMore = () => { if (hasNextPage && !isFetching) { fetchNextPage(); } }; const handleRefresh = () => dispatch(fetchChats()); const renderEmpty = () => { if (isFetching) { return ( ); } return null; }; return (
setNearTop(atTop)} atBottomStateChange={(atBottom) => setNearBottom(atBottom)} useWindowScroll={useWindowScroll} data={chats} endReached={handleLoadMore} itemContent={(_index, chat) => (
) } components={{ ScrollSeekPlaceholder: () => , Footer: () => hasNextPage ? : null, EmptyPlaceholder: renderEmpty, }} />
<>
); }; export default ChatList;