import type { ReactNode, RefObject } from 'react';
/**
 * Базовый тип элемента дерева для InfiniteTreeList
 */
export type InfiniteTreeListDataBase = {
    /**
     * Уникальный идентификатор элемента
     */
    id: string;
    /**
     * Дополнительные  поля
     */
    [key: string]: unknown;
};
/**
 * Тип элемента дерева с возможными дочерними элементами
 */
export type InfiniteTreeListData<TData extends InfiniteTreeListData<TData> = InfiniteTreeListDataBase> = InfiniteTreeListDataBase & {
    children?: TData[];
};
export type InfiniteTreeListProps<TData extends InfiniteTreeListData<TData> = InfiniteTreeListDataBase> = {
    /**
     * Список элементов дерева
     */
    items: TData[];
    /**
     * Если true, будет отображаться лоадер
     */
    isLoading?: boolean;
    /**
     * Если `true`, компонент будет отображаться в состоянии ошибки
     */
    isError?: boolean;
    /**
     * Текст ошибки
     */
    errorMsg?: string;
    /**
     * Функция обработки нажатия на кнопку "Повторить запрос"
     */
    onRetry: () => void;
    /**
     * Флаг достижения конца списка
     */
    isEndReached?: boolean;
    /**
     * Обработчик подгрузки данных
     */
    onLoadMore?: () => void;
    /**
     * Реф на контейнер, в котором должен быть скролл
     */
    scrollRef: RefObject<HTMLElement | null>;
    /**
     * Рендер-функция элемента списка
     *
     * @example
     * renderItem={(item) => (
     *               <InfiniteTreeListItem actions={<Actions />}>
     *                 <Avatar>{item.avatarName}</Avatar>
     *                 <Typography>{item.organization}</Typography>
     *               </InfiniteTreeListItem>
     *             )}
     */
    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 extends InfiniteTreeListData<TData>> = TData & {
    meta: InfiniteTreeItemMeta;
};
