import type { ReactNode, RefObject } from 'react'; /** * Базовый тип элемента дерева для InfiniteTreeList */ export type InfiniteTreeListDataBase = { /** * Уникальный идентификатор элемента */ id: string; /** * Дополнительные поля */ [key: string]: unknown; }; /** * Тип элемента дерева с возможными дочерними элементами */ export type InfiniteTreeListData = InfiniteTreeListDataBase> = InfiniteTreeListDataBase & { children?: TData[]; }; export type InfiniteTreeListProps = InfiniteTreeListDataBase> = { /** * Список элементов дерева */ items: TData[]; /** * Если true, будет отображаться лоадер */ isLoading?: boolean; /** * Если `true`, компонент будет отображаться в состоянии ошибки */ isError?: boolean; /** * Текст ошибки */ errorMsg?: string; /** * Функция обработки нажатия на кнопку "Повторить запрос" */ onRetry: () => void; /** * Флаг достижения конца списка */ isEndReached?: boolean; /** * Обработчик подгрузки данных */ onLoadMore?: () => void; /** * Реф на контейнер, в котором должен быть скролл */ scrollRef: RefObject; /** * Рендер-функция элемента списка * * @example * renderItem={(item) => ( * }> * {item.avatarName} * {item.organization} * * )} */ renderItem: (item: TData & { meta: InfiniteTreeItemMeta; }) => ReactNode; /** * Уровень раскрытия дерева по умолчанию */ initialExpandedLevel?: number; /** * Сообщение, отображаемое при достижении конца списка */ endOfScrollMsg?: string; /** * Скелетон для элемента в состоянии загрузки */ itemSkeleton?: ReactNode; /** * Изображение при отсутствии данных * @default берется из ConfigProvider */ noDataImgSrc?: string; /** * Изображение при ошибке (используется в ContentState) */ errorImgSrc?: string; }; export type InfiniteTreeItemMeta = { /** * Уровень вложенности (начинается с 0) */ level: number; /** * Путь до элемента (массив id родителей) */ path: string[]; /** * ID родителя */ parentId?: string; /** * Индекс элемента среди siblings (для каскадной анимации) */ siblingIndex: number; /** * Флаг имеет ли элемент вложенных потомков */ hasNested: boolean; /** * Флаг раскрытия узла */ isExpanded: boolean; /** * Id Node элемента. Используется для анимации закрытия */ nodeId: string; }; export type FlattenTree> = TData & { meta: InfiniteTreeItemMeta; };