// @ts-nocheck 'use client'; import * as React from 'react'; import Autocomplete from '@/components/ui/autocomplete'; import { useVirtualizer } from '@tanstack/react-virtual'; export default function ExampleVirtualizedAutocomplete() { const virtualizerRef = React.useRef(null); return ( { const virtualizer = virtualizerRef.current; if (!item || !virtualizer) { return; } const isStart = index === 0; const isEnd = index === virtualizer.options.count - 1; const shouldScroll = reason === 'none' || (reason === 'keyboard' && (isStart || isEnd)); if (shouldScroll) { queueMicrotask(() => { virtualizer.scrollToIndex(index, { align: isEnd ? 'start' : 'end' }); }); } }} >
No items found.
); } function VirtualizedList({ virtualizerRef, }: { virtualizerRef: React.RefObject; }) { const filteredItems = Autocomplete.useFilteredItems(); const scrollElementRef = React.useRef(null); const virtualizer = useVirtualizer({ count: filteredItems.length, getScrollElement: () => scrollElementRef.current, estimateSize: () => 32, overscan: 20, paddingStart: 4, paddingEnd: 4, scrollPaddingEnd: 4, scrollPaddingStart: 4, }); React.useImperativeHandle(virtualizerRef, () => virtualizer); const handleScrollElementRef = React.useCallback( (element: HTMLDivElement | null) => { scrollElementRef.current = element; if (element) { virtualizer.measure(); } }, [virtualizer], ); const totalSize = virtualizer.getTotalSize(); if (!filteredItems.length) { return null; } return (
{virtualizer.getVirtualItems().map((virtualItem) => { const item = filteredItems[virtualItem.index]; if (!item) { return null; } return ( {item.name} ); })}
); } interface VirtualizedItem { id: string; name: string; } function getItemLabel(item: VirtualizedItem | null) { return item ? item.name : ''; } const virtualizedItems: VirtualizedItem[] = Array.from({ length: 10000 }, (_, index) => { const id = String(index + 1); const indexLabel = id.padStart(4, '0'); return { id, name: `Item ${indexLabel}` }; }); type Virtualizer = ReturnType>;