import classNames from 'clsx'; import React, { useRef, useState } from 'react'; import { Virtuoso } from 'react-virtuoso'; import { fetchChats } from 'soapbox/actions/chats'; import PullToRefresh from 'soapbox/components/pull-to-refresh'; import { Stack } from 'soapbox/components/ui'; import PlaceholderChat from 'soapbox/features/placeholder/components/placeholder-chat'; import { useAppDispatch } from 'soapbox/hooks'; import { useChats, useChatSilences } 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 { data: chatSilences } = useChatSilences(); const [isNearBottom, setNearBottom] = useState(false); const [isNearTop, setNearTop] = useState(true); const isEmpty = (!chats || chats.length === 0); const handleLoadMore = () => { if (hasNextPage && !isFetching) { fetchNextPage(); } }; const handleRefresh = () => dispatch(fetchChats()) as any; const renderEmpty = () => ( ); return (
{isEmpty ? renderEmpty() : ( setNearTop(atTop)} atBottomStateChange={(atBottom) => setNearBottom(atBottom)} useWindowScroll={useWindowScroll} data={chats} endReached={handleLoadMore} itemContent={(_index, chat) => { const chatSilence = chatSilences?.find((chatSilence) => String(chatSilence.target_account_id) === chat.account.id); return (
); }} components={{ ScrollSeekPlaceholder: () => , // Footer: () => hasNextPage ? : null, EmptyPlaceholder: renderEmpty, }} /> )}
<>
); }; export default ChatList;