import type { TreeListData } from '../Tree';
import type { TreeAutocompleteProps } from '../TreeAutocomplete';
/**
 * Значение элемента дерева для TreeAsyncAutocomplete
 */
export type TreeAsyncAutocompleteValue = Omit<TreeListData, 'label' | 'note' | 'children'> & {
    /**
     * Заголовок элемента дерева
     */
    label: string;
    /**
     * Подзаголовок элемента дерева
     */
    note?: string;
    /**
     * Дочерние узлы дерева
     */
    children?: TreeAsyncAutocompleteValue[];
};
/**
 * Результат функции загрузки опций
 */
export type FetchOptionsResult = {
    /**
     * Элементы дерева
     */
    options: TreeAsyncAutocompleteValue[];
    /**
     * Метаданные результата загрузки
     */
    meta?: {
        /**
         * Флаг, указывающий, что все данные загружены
         */
        isAllDataLoaded: boolean;
    };
};
export type TreeAsyncAutocompleteProps = Omit<TreeAutocompleteProps, 'options' | 'isLoading' | 'isLoadingError' | 'value' | 'onChange' | 'filterOptions'> & {
    /**
     * Выбранное значения
     */
    value?: TreeAsyncAutocompleteValue | null;
    /**
     * Функция, которая запускается при выборе item
     */
    onChange?: (newValue?: TreeAsyncAutocompleteValue | null) => void;
    /**
     * Функция для асинхронной загрузки опций на основе поискового запроса
     * При возникновении ошибки запроса данных, компонент сам ее обработает.
     * Для обработки ошибок вручную используйте параметр `onDataLoadError`
     *
     * @param search - Строка поиска, введенная пользователем. На основе этой
     *   строки функция должна вернуть подходящие опции.
     * @param signal - Объект `AbortSignal`, который позволяет отменить запрос,
     *   если пользователь изменил поисковый запрос или закрыл компонент.
     *
     * @returns Promise<FetchResult> Промис, который разрешается объектом с массивом узлов дерева и метаданными.
     *
     * @example
     ```typescript
     * const fetchOptions = async (search: string, signal?: AbortSignal) => {
     *   const response = await fetch(`/api/options/search?query=${search}`, {
     *     signal
     *   });
     *   const data = await response.json();
     *
     *   return {
     *     options: data.items,
     *     meta: {
     *       isAllDataLoaded: data.isAllDataLoaded,
     *     }
     *   };
     * };
     *
     * <TreeAsyncAutocomplete fetchOptions={fetchOptions} />
     * ```
     */
    fetchOptions: (search: string, signal?: AbortSignal) => Promise<FetchOptionsResult>;
    /**
     * Задержка для fetchOptions
     */
    fetchDelayMs?: number;
    /**
     * Функция для обработки ошибок загрузки данных
     */
    onDataLoadError?: (error: Error) => void;
    /**
     * Минимальное количество символов для выполнения запроса
     */
    minSymbolsToFetch?: number;
    /**
     * Функция определения необходимости показа подсказки пользователю
     */
    onShowUserHint?: (options: TreeAsyncAutocompleteValue[]) => boolean;
};
