// @ts-nocheck 'use client'; import * as React from 'react'; import Combobox from '@/components/ui/combobox'; import { useVirtualizer } from '@tanstack/react-virtual'; export default function ExampleVirtualizedCombobox() { const [open, setOpen] = React.useState(false); 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({ open, virtualizerRef, }: { open: boolean; virtualizerRef: React.RefObject; }) { const filteredItems = Combobox.useFilteredItems(); const scrollElementRef = React.useRef(null); const virtualizer = useVirtualizer({ enabled: open, 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} ); })}
); } function CheckIcon(props: React.ComponentProps<'svg'>) { return ( ); } 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>;