import { UserGroupIcon } from "@heroicons/react/24/outline"; import { GroupsFeedType } from "@hey/data/enums"; import { GroupsOrderBy, type GroupsRequest, PageSize, useGroupsQuery } from "@hey/indexer"; import { useCallback } from "react"; import { WindowVirtualizer } from "virtua"; import SingleGroup from "@/components/Shared/Group/SingleGroup"; import GroupListShimmer from "@/components/Shared/Shimmer/GroupListShimmer"; import { EmptyState, ErrorMessage } from "@/components/Shared/UI"; import useLoadMoreOnIntersect from "@/hooks/useLoadMoreOnIntersect"; import { useAccountStore } from "@/store/persisted/useAccountStore"; interface ListProps { feedType: GroupsFeedType; } const List = ({ feedType }: ListProps) => { const { currentAccount } = useAccountStore(); const request: GroupsRequest = { filter: { ...(feedType === GroupsFeedType.Member && { member: currentAccount?.address }), ...(feedType === GroupsFeedType.Managed && { managedBy: { address: currentAccount?.address } }) }, orderBy: GroupsOrderBy.LatestFirst, pageSize: PageSize.Fifty }; const { data, error, fetchMore, loading } = useGroupsQuery({ variables: { request } }); const groups = data?.groups?.items; const pageInfo = data?.groups?.pageInfo; const hasMore = pageInfo?.next; const handleEndReached = useCallback(async () => { if (hasMore) { await fetchMore({ variables: { request: { ...request, cursor: pageInfo?.next } } }); } }, [fetchMore, hasMore, pageInfo?.next, request]); const loadMoreRef = useLoadMoreOnIntersect(handleEndReached); if (loading) { return ; } if (!groups?.length) { return ( } message="No groups." /> ); } if (error) { return ( ); } return (
{groups.map((group) => (
))} {hasMore && }
); }; export default List;