import type { ReactNode } from "react"; import type { SelectionStrategy, SingleSelectionStrategy } from "./selectionTypes"; export interface CollectionIndexer { value: number; } export interface CollectionItemBase { id: string; description?: string; disabled?: boolean; focusable?: false | undefined; index?: number; label?: string; value: T | null; } export interface CollectionItem extends CollectionItemBase { childNodes?: CollectionItem[]; count?: number; expanded?: boolean; header?: boolean; level?: number; selectable?: boolean; } export interface SourceGroup { childNodes: T[]; } export type CollectionOptions = { collapsibleHeaders?: boolean; defaultExpanded?: boolean; filterPattern?: string; getFilterRegex?: (inputValue: string) => RegExp; getItemId?: (indexOfItem: number) => string; noChildrenLabel?: string; itemToString?: (item: T) => string; revealSelected?: boolean | T | T[]; }; export type CollectionHookProps = { children?: ReactNode; id: string; label?: string; source?: ReadonlyArray; options?: CollectionOptions; }; export type CollectionHookResult = { /** set expanded to false for target */ collapseGroupItem: (item: CollectionItem) => void; /** data items from the collection to be rendered */ data: CollectionItem[]; /** set expanded to true for target */ expandGroupItem: (item: CollectionItem) => void; setFilterPattern: (pattern: undefined | string) => void; itemById: (id: string) => T | never; itemToCollectionItem: (item: U) => Selection extends SingleSelectionStrategy ? CollectionItem | null : CollectionItem[]; stringToCollectionItem: (item: string | null | undefined) => Selection extends SingleSelectionStrategy ? CollectionItem | null : CollectionItem[]; toCollectionItem: (item: T) => CollectionItem; itemToId: (item: T) => string; };