import type { FC } from '../../../lib/teact/teact'; import React, { memo, useCallback, useMemo } from '../../../lib/teact/teact'; import { getActions, withGlobal } from '../../../global'; import type { ApiUser, ApiUserStatus } from '../../../api/types'; import { StoryViewerOrigin } from '../../../types'; import { filterUsersByName, sortUserIds } from '../../../global/helpers'; import useAppLayout from '../../../hooks/useAppLayout'; import useHistoryBack from '../../../hooks/useHistoryBack'; import useInfiniteScroll from '../../../hooks/useInfiniteScroll'; import useLang from '../../../hooks/useLang'; import PrivateChatInfo from '../../common/PrivateChatInfo'; import FloatingActionButton from '../../ui/FloatingActionButton'; import InfiniteScroll from '../../ui/InfiniteScroll'; import ListItem from '../../ui/ListItem'; import Loading from '../../ui/Loading'; export type OwnProps = { filter: string; isActive: boolean; onReset: () => void; }; type StateProps = { usersById: Record; userStatusesById: Record; contactIds?: string[]; }; const ContactList: FC = ({ isActive, filter, usersById, userStatusesById, contactIds, onReset, }) => { const { openChat, openNewContactDialog, } = getActions(); const lang = useLang(); const { isMobile } = useAppLayout(); useHistoryBack({ isActive, onBack: onReset, }); const handleClick = useCallback((id: string) => { openChat({ id, shouldReplaceHistory: true }); }, [openChat]); const listIds = useMemo(() => { if (!contactIds) { return undefined; } const filteredIds = filterUsersByName(contactIds, usersById, filter); return sortUserIds(filteredIds, usersById, userStatusesById); }, [contactIds, filter, usersById, userStatusesById]); const [viewportIds, getMore] = useInfiniteScroll(undefined, listIds, Boolean(filter)); return ( {viewportIds?.length ? ( viewportIds.map((id) => ( handleClick(id)} > )) ) : viewportIds && !viewportIds.length ? (

{filter.length ? 'No contacts matched your search.' : 'Contact list is empty.'}

) : ( )}
); }; export default memo(withGlobal( (global): StateProps => { const { userIds: contactIds } = global.contactList || {}; const { byId: usersById, statusesById: userStatusesById } = global.users; return { usersById, userStatusesById, contactIds, }; }, )(ContactList));