import {Fragment} from 'react'; import {AutoSizer, List as ReactVirtualizedList} from 'react-virtualized'; import Row from './row'; import {ItemsAfterFilter} from './types'; type RowProps = Pick< React.ComponentProps, 'itemSize' | 'inputValue' | 'getItemProps' | 'registerVisibleItem' >; type Props = { /** * The item index that is currently isActive */ highlightedIndex: number; /** * Flat item array or grouped item array */ items: ItemsAfterFilter; /** * Max height of dropdown menu. Units are assumed as `px` */ maxHeight: number; /** * Callback for when dropdown menu is being scrolled */ onScroll?: () => void; /** * Supplying this height will force the dropdown menu to be a virtualized * list. This is very useful (and probably required) if you have a large list. * e.g. Project selector with many projects. * * Currently, our implementation of the virtualized list requires a fixed * height. */ virtualizedHeight?: number; /** * If you use grouping with virtualizedHeight, the labels will be that height * unless specified here */ virtualizedLabelHeight?: number; } & RowProps; function getHeight( items: ItemsAfterFilter, maxHeight: number, virtualizedHeight: number, virtualizedLabelHeight?: number ) { const minHeight = virtualizedLabelHeight ? items.reduce( (a, r) => a + (r.groupLabel ? virtualizedLabelHeight : virtualizedHeight), 0 ) : items.length * virtualizedHeight; return Math.min(minHeight, maxHeight); } const List = ({ virtualizedHeight, virtualizedLabelHeight, onScroll, items, highlightedIndex, maxHeight, ...rowProps }: Props) => { if (virtualizedHeight) { return ( {({width}) => ( items[index].groupLabel && virtualizedLabelHeight ? virtualizedLabelHeight : virtualizedHeight } rowRenderer={({key, index, style}) => ( )} /> )} ); } return ( {items.map((item, index) => ( ))} ); }; export default List;