import { ReactNode } from "react"; export interface NestableProps { childrenProp?: string; className?: string; collapsed?: boolean; confirmChange?: ConfirmChange; disableCollapse?: boolean; disableDrag?: boolean | DisableDragFn; group?: number | string; handler?: ReactNode; idProp?: string; items?: Item[]; maxDepth?: number; onChange?: OnChange; onCollapseChange?: OnCollapseChange; onDragEnd?: OnDragEnd; onDragStart?: OnDragStart; renderCollapseIcon?: RenderCollapseIcon; renderItem?: RenderItem; threshold?: number; } export interface NestableState { collapsedItems: unknown[]; dragItem: Item | null; isDirty: boolean; items: Item[]; itemsOld: Item[] | null; cache: any; } export type Item = Record; export type ConfirmChange = (options: { dragItem: Item; destinationParent: Item | null; }) => boolean; export type DisableDragFn = (options: { item: Item; index: number; depth: number; }) => boolean; export type OnChange = (options: { items: Item[]; dragItem: Item; targetPath: number[]; }) => void; export type OnCollapseChange = (options: { openIds?: NestableState["collapsedItems"]; } | { closedIds?: NestableState["collapsedItems"]; }) => void; export type OnDragStart = (options: { dragItem: Item; }) => void; export type OnDragEnd = VoidFunction; export type RenderCollapseIcon = (options: { isCollapsed: boolean; item: Item; }) => ReactNode; export type RenderItem = (options: { item: Item; index: number; depth: number; isDraggable: boolean; collapseIcon: ReactNode; handler: ReactNode; }) => ReactNode; export type CollapseCondition = "NONE" | "ALL" | unknown[]; export type Collapse = (condition: CollapseCondition) => void; export interface NestableItemProps { item: Item; options: NestableItemOptions; isCopy?: boolean; index?: number; depth?: number; } export interface NestableItemOptions { dragItem: Item | null; idProp: NestableProps["idProp"]; childrenProp: NestableProps["childrenProp"]; disableCollapse: NestableProps["disableCollapse"]; disableDrag: NestableProps["disableDrag"]; renderItem: NestableProps["renderItem"]; renderCollapseIcon: NestableProps["renderCollapseIcon"]; handler: NestableProps["handler"]; checkIfCollapsed: (item: Item) => boolean; onDragStart: (e: MouseEvent, item: Item) => void; onMouseEnter: (e: MouseEvent, item: Item) => void; onToggleCollapse: (item: Item, isGetter?: true) => void; } export interface IconProps { children?: ReactNode; className?: string; isCollapsed?: boolean; }