import { Flex, Text } from '@radix-ui/themes'; import fuzzysort from 'fuzzysort'; import { times } from 'lodash-es'; import { useMemo, useState } from 'react'; import { GalleryEphemeral } from '../../stores/galleryEphemeral'; import { GalleryCard } from './Card'; interface GalleryListProps { avatars: Avatar[]; } export interface Avatar { name: string; id: string; } const DEFAULT_LOADED = 42; const PREVIEW_COUNT = 14; export function GalleryList({ avatars }: GalleryListProps) { const search = GalleryEphemeral.use((state) => state.search); const [loadedCards, setLoadedCards] = useState(DEFAULT_LOADED); const filtered = useMemo(() => { setLoadedCards(DEFAULT_LOADED); if (search === undefined) { return avatars; } else { return fuzzysort .go(search, avatars, { keys: ['name', 'id'] }) .map((result) => result.obj); } }, [search]); return ( <> {filtered.length.toLocaleString()} avatars {filtered.slice(0, loadedCards).map((avatar) => ( ))} {times( Math.min(PREVIEW_COUNT, filtered.length - loadedCards), (index) => ( setLoadedCards((state) => state + 2)} /> ), )} ); }