import type { DragDropMonitor } from "dnd-core"; import type { RefObject, ElementType, ReactElement } from "react"; import type React from "react"; import type { XYCoord, DragSourceMonitor } from "react-dnd"; export type NodeModel = { id: number | string; parent: number | string; text: string; droppable?: boolean; data?: T; }; export type DragItem = NodeModel & { ref: RefObject; }; export type NativeDragItem = { dataTransfer: DataTransfer; text?: string; html?: string; files?: File[]; }; export type RenderParams = { depth: number; isOpen: boolean; isDragging: boolean; isDropTarget: boolean; draggable: boolean; hasChild: boolean; containerRef: RefObject; handleRef: RefObject; onToggle: () => void; }; export type NodeRender = (node: NodeModel, params: RenderParams) => ReactElement; export type ClickHandler = (data: NodeModel) => void; export type DropHandler = (dragSource: NodeModel | null, dropTargetId: NodeModel["id"], index: number) => void; export type CanDropHandler = (dragSourceId: NodeModel["id"] | null, dropTargetId: NodeModel["id"]) => boolean | void; export type CanDragHandler = (id: NodeModel["id"]) => boolean; export type Classes = { root?: string; container?: string; listItem?: string | ((node: NodeModel, params: RenderParams) => string); dropTarget?: string; draggingSource?: string; placeholder?: string; }; export type SortCallback = (a: NodeModel, b: NodeModel) => number; export type DragLayerMonitorProps = { item: DragItem; clientOffset: XYCoord | null; isDragging: boolean; }; export type DragPreviewRender = (monitorProps: DragLayerMonitorProps) => ReactElement; export type PlaceholderRenderParams = { depth: number; }; export type PlaceholderRender = (node: NodeModel, params: PlaceholderRenderParams) => ReactElement; export type DragOverProps = { onDragEnter: () => void; onDragLeave: () => void; onDrop: () => void; }; export type OpenHandler = (targetIds: NodeModel["id"] | NodeModel["id"][], callback?: ChangeOpenHandler) => void; export type CloseHandler = (targetIds: NodeModel["id"] | NodeModel["id"][], callback?: ChangeOpenHandler) => void; export type ToggleHandler = (id: NodeModel["id"], callback?: ChangeOpenHandler) => void; export type ChangeOpenHandler = (newOpenIds: NodeModel["id"][]) => void; export type InitialOpen = boolean | NodeModel["id"][]; export type DragSourceElement = EventTarget | null; export type DragControlState = { isLock: boolean; lock: () => void; unlock: () => void; }; export type PlaceholderState = { dropTargetId: NodeModel["id"] | undefined; index: number | undefined; showPlaceholder: (parentId: NodeModel["id"], index: number) => void; hidePlaceholder: () => void; }; export type RootProps = Omit, "ref" | "role">; export type TreeStateBase = { tree: NodeModel[]; rootId: NodeModel["id"]; classes?: Classes; rootProps?: RootProps; render: NodeRender; dragPreviewRender?: DragPreviewRender; placeholderRender?: PlaceholderRender; onDragStart?: (node: NodeModel, monitor: DragSourceMonitor) => void; onDragEnd?: (node: NodeModel, monitor: DragSourceMonitor) => void; }; export type TreeState = TreeStateBase & { extraAcceptTypes: string[]; listComponent: ElementType; listItemComponent: ElementType; placeholderComponent: ElementType; sort: SortCallback | boolean; insertDroppableFirst: boolean; enableAnimateExpand: boolean; dropTargetOffset: number; initialOpen: InitialOpen; openIds: NodeModel["id"][]; onDrop: DropHandler; canDrop?: CanDropHandler; canDrag?: CanDragHandler; onToggle: ToggleHandler; }; export type DropOptions = { dragSourceId?: NodeModel["id"]; dropTargetId: NodeModel["id"]; dragSource?: NodeModel; dropTarget?: NodeModel; destinationIndex?: number; relativeIndex?: number; monitor: DragDropMonitor; }; export type TreeProps = TreeStateBase & { extraAcceptTypes?: string[]; listComponent?: ElementType; listItemComponent?: ElementType; placeholderComponent?: ElementType; sort?: SortCallback | boolean; insertDroppableFirst?: boolean; enableAnimateExpand?: boolean; dropTargetOffset?: number; initialOpen?: InitialOpen; onChangeOpen?: ChangeOpenHandler; onDrop: (tree: NodeModel[], options: DropOptions) => void; canDrop?: (tree: NodeModel[], options: DropOptions) => boolean | void; canDrag?: (node: NodeModel | undefined) => boolean; }; export type TreeMethods = { open: OpenHandler; close: CloseHandler; openAll(): void; closeAll(): void; };