import { Collection, CollectionProxy, CollectionState, Item, ItemAdaptee, ItemAdapter, UseCollectionOptions, } from 'onekijs-framework'; import React, { FC, ReactNode } from 'react'; import { StylableProps } from '../../styles/typings'; export type ArrayListProps = ListItem> = ListConfig & { adapter?: ListItemAdapter; dataSource: T[] | string; fetchOnce?: boolean; }; export type ListBodyProps< T = any, I extends ListItem = ListItem, S extends ListState = ListState, C extends ListCollection = ListCollection, > = Pick< CollectionListProps, | 'autoRefresh' | 'follow' | 'onItemSelect' | 'onItemUnselect' | 'onItemActivate' | 'onItemDeactivate' | 'onItemHighlight' | 'onItemUnhighlight' | 'multiSelect' | 'ItemComponent' | 'NotFoundComponent' | 'LoadingComponent' | 'height' | 'keyboardNavigable' | 'tail' > & { bodyRef?: React.RefObject; className?: string; ItemLoadingComponent?: FC; ItemComponent?: FC>; ItemContentComponent?: FC>; items: (I | undefined)[]; ListComponent?: FC>; parentRef?: React.RefObject; service: C; state: S; style?: React.CSSProperties; totalSize?: number; scrollToIndex?: (index: number, options?: { align: 'start' | 'center' | 'end' | 'auto' }) => void; scrollToOffset?: (index: number, options?: { align: 'start' | 'center' | 'end' | 'auto' }) => void; virtualItems?: VirtualItem[]; VirtualListComponent?: FC>; }; export type CollectionListProps< T = any, I extends ListItem = ListItem, S extends ListState = ListState, C extends ListCollection = ListCollection, > = ListConfig & { controller: CollectionProxy; }; export type ListCollection< T, I extends ListItem = ListItem, S extends ListState = ListState, > = Collection; export type ListFooterProps = { className?: string; style?: React.CSSProperties; }; export type ListHeaderProps = { className?: string; style?: React.CSSProperties; }; export type ListItem = Item; export type ListItemAdaptee = ItemAdaptee; export type ListItemAdapter = ItemAdapter; export type ListItemHandler = ListItem> = (item: I, index: number) => void; export interface ListItemProps = ListItem> { index: number; item: I; data: T; ItemContentComponent?: FC>; onClick?: (item: I, index: number) => boolean | void; onMouseEnter?: ListItemHandler; onMouseLeave?: ListItemHandler; className?: string; } export type ListItems = ListItem> = T[] | ListCollection; export type ListConfig = ListItem> = { autoRefresh?: number; className?: string; follow?: number; height?: string | number; increment?: number; ItemLoadingComponent?: FC; ItemComponent?: FC>; ItemContentComponent?: FC>; NotFoundComponent?: FC | null; LoadingComponent?: FC; itemHeight?: number | ((index: number) => number); keyboardNavigable?: boolean; multiSelect?: boolean; onItemActivate?: ListItemHandler; onItemDeactivate?: ListItemHandler; onItemHighlight?: ListItemHandler; onItemUnhighlight?: ListItemHandler; onItemSelect?: ListItemHandler; onItemUnselect?: ListItemHandler; paddingEnd?: number; paddingStart?: number; parentRef?: React.RefObject; overscan?: number; preload?: number; style?: React.CSSProperties; tail?: boolean; virtual?: boolean; }; export type ListNotFoundProps = { text?: ReactNode | ReactNode[]; }; export type ListProps< T = any, I extends ListItem = ListItem, S extends ListState = ListState, C extends ListCollection = ListCollection, > = ListConfig & { adapter?: ListItemAdapter; controller?: CollectionProxy; dataSource?: T[] | string; fetchOnce?: boolean; }; export type ListState = ListItem> = CollectionState; export enum ListStatus { NotInitialized = 'not initialized', NotLoaded = 'not loaded', Loading = 'loading', Fetching = 'fetching', PartialFetching = 'partial fetching', PartialLoading = 'partial loading', Loaded = 'loaded', } export type StandardListProps = ListItem> = Pick< ListBodyProps, 'items' | 'ItemComponent' | 'ItemLoadingComponent' | 'ItemContentComponent' | 'LoadingComponent' > & { onItemClick?: ListItemHandler; onItemMouseEnter?: ListItemHandler; onItemMouseLeave?: ListItemHandler; }; export type UseListOptions = ListItem> = UseCollectionOptions & { adapter?: ListItemAdapter; }; export type VirtualItem = { end: number; index: number; start: number; size: number; measureRef: (el: HTMLElement | null) => void; }; export type VirtualListProps = ListItem> = StandardListProps & { virtualItems: VirtualItem[]; }; export type VirtualItemWrapperProps = ListItem> = { ItemLoadingComponent?: FC; ItemComponent?: FC>; ItemContentComponent?: FC>; listItem: any; onItemClick?: ListItemHandler; onItemMouseEnter?: ListItemHandler; onItemMouseLeave?: ListItemHandler; virtualItem: VirtualItem; };