export type ItemHeight = number | undefined; export type NoItemState = undefined; interface BeforeResizeState { itemHeights: number[]; columnsCount: number; verticalSpacing: number; } export interface State { items: Item[]; firstShownItemIndex: number; lastShownItemIndex: number; beforeItemsHeight: number; afterItemsHeight: number; itemStates: ItemState[]; itemHeights: ItemHeight[]; verticalSpacing?: number; columnsCount?: number; scrollableContainerWidth?: number; beforeResize?: BeforeResizeState; } export class ItemsContainer { constructor(getElement: () => Element); getNthRenderedItemTopOffset(renderedElementIndex: number): number; getNthRenderedItemHeight(renderedElementIndex: number): number; getHeight(): number; } export class ScrollableContainer { constructor(element: Element, getItemsContainerElement: () => Element); getWidth(): number; getHeight(): number; getItemsContainerTopOffset(): number; getScrollY(): number; scrollToY(scrollY: number): void; onScroll(onScroll: () => void): () => void; onResize(onResize: () => void): () => void; } export interface Engine { createItemsContainer(getItemsContainerElement: () => Element): ItemsContainer; createScrollableContainer(getScrollableContainer: () => Element, getItemsContainerElement: () => Element): ScrollableContainer; } interface ScrollableContainerArgument { getWidth(): number; } // "Common" options shared by the "core" component and its implementations // like React Virtual Scroller or DOM Virtual Scroller. export interface VirtualScrollerCommonOptions { bypass?: boolean; onStateChange?(newState: State): void; getInitialItemState?: (item: Item) => ItemState; measureItemsBatchSize?: number; getEstimatedItemHeight?: () => number; getEstimatedVisibleItemRowsCount?: () => number; getEstimatedInterItemVerticalSpacing?: () => number; initialScrollPosition?: number; onScrollPositionChange?(scrollY: number): void; onItemInitialRender?(item: Item): void; getItemId?: ((item: Item) => number) | ((item: Item) => string); getColumnsCount?(scrollableContainer: ScrollableContainerArgument): number; } // "Core" component options. interface Options extends VirtualScrollerCommonOptions { state?: State; render?(state: State, previousState?: State): void; engine?: Engine; delayRecursiveRenderUntilNextTick?: boolean; // `scrollableContainer` is deprecated, use `getScrollableContainer()` instead. scrollableContainer?: Element; getScrollableContainer?(): Element; } interface UseStateOptionsWithSetStateFunction { getState(): State; setState(newState: State): void; } interface UseStateOptionsWithUpdateStateFunction { getState(): State; updateState(stateUpdate: Partial>): void; } type UseStateOptions = UseStateOptionsWithSetStateFunction | UseStateOptionsWithUpdateStateFunction export interface SetItemsOptions { preserveScrollPositionOnPrependItems?: boolean; } export default class VirtualScroller { constructor( getItemsContainerElement: () => Element | null, items: Item[], options?: Options ); start(): void; stop(): void; updateLayout(): void; onRender(): void; setItems(newItems: Item[], options?: SetItemsOptions): void; onItemHeightDidChange(item: Item): void; setItemState(item: Item, itemState?: object): void; getItemScrollPosition(item: Item): number | undefined; getInitialState(): State; useState(options: UseStateOptions): void; } export class ItemNotRenderedError { constructor( message: string ); }