barneo-search-widget-lib
Version:
Библиотека для поиска по каталогу Barneo на Vue 3
412 lines (370 loc) • 11.7 kB
text/typescript
/**
* Типы и интерфейсы общего состояния
*
* Этот модуль определяет основные структуры данных и интерфейсы для управления
* общим состоянием между всеми компонентами Barneo Search Library.
*
* @module sharedState
*
*/
import type { FullProduct } from "../../searchWidget/types/responses";
/**
* Полное состояние поиска, которое является общим для всех виджетов.
* Этот интерфейс определяет центральную структуру данных для поисковых операций,
* фильтров, пагинации и синхронизации компонентов.
*/
export interface SearchState {
/**
* Текущая строка поискового запроса.
* @defaultValue ""
*/
query: string;
/**
* Результаты поиска из API.
* @defaultValue []
*/
results: FullProduct[];
/**
* Общее количество доступных результатов поиска.
* @defaultValue 0
*/
totalResults: number;
/**
* Полные данные товаров для виджета товаров.
* @defaultValue []
*/
full_products: FullProduct[];
/**
* Общее количество доступных товаров.
* @defaultValue 0
*/
totalProducts: number;
/**
* Доступные фильтры из ответа API.
* @defaultValue []
*/
filters: any[]; // Доступные фильтры из API
/**
* Текущие активные фильтры.
* @defaultValue []
*/
activeFilters: FilterState[];
/**
* Продуктовые фильтры для API (checkbox и range фильтры).
* @defaultValue []
*/
products: ProductFilter[];
/**
* Текущие активные продуктовые фильтры.
* @defaultValue []
*/
activeProducts: ProductFilter[];
/**
* Текущая опция сортировки.
* @defaultValue "relevance"
*/
sort: string;
/**
* Состояние пагинации для всех типов данных.
*/
pagination: {
/**
* Количество товаров на странице.
* @defaultValue 20
*/
limit_products: number;
/**
* Количество категорий на странице.
* @defaultValue 10
*/
limit_categories: number;
/**
* Количество брендов на странице.
* @defaultValue 10
*/
limit_brands: number;
/**
* Текущее смещение для товаров.
* @defaultValue 0
*/
offset_products: number;
};
/**
* Выполняется ли поисковая операция в данный момент.
* @defaultValue false
*/
isLoading: boolean;
/**
* Сообщение об ошибке, если поиск не удался.
* @defaultValue null
*/
error: string | null;
/**
* Временная метка последней поисковой операции.
* @defaultValue 0
*/
searchTimestamp: number;
/**
* Является ли текущий поиск глубоким поиском.
* @defaultValue false
*/
isDeepSearch: boolean;
}
/**
* Структура состояния отдельного фильтра.
* Представляет отдельный фильтр с его значениями и состоянием выбора.
*/
export interface FilterState {
/**
* Уникальный идентификатор фильтра.
* @required
*/
id: string;
/**
* Отображаемое имя фильтра.
* @required
*/
name: string;
/**
* Код/идентификатор фильтра для API запросов.
* @required
*/
code: string;
/**
* Доступные значения для этого фильтра.
* @defaultValue []
*/
values: FilterValue[];
}
/**
* Структура отдельного значения фильтра.
* Представляет отдельное значение в рамках фильтра.
*/
export interface FilterValue {
/**
* Уникальный идентификатор значения фильтра.
* @required
*/
id: string;
/**
* Отображаемое имя значения фильтра.
* @required
*/
name: string;
/**
* Выбрано ли это значение фильтра в данный момент.
* @defaultValue false
*/
isSelected: boolean;
}
/**
* Продуктовый фильтр для API (checkbox и range фильтры).
* Используется для передачи фильтров в поле products API запроса.
*/
export interface ProductFilter {
/**
* Код фильтра.
* @required
*/
code: string;
/**
* ID значений для checkbox фильтра.
*/
value_ids?: string[];
/**
* Минимальное значение для range фильтра.
*/
value_gte?: string;
/**
* Максимальное значение для range фильтра.
*/
value_lte?: string;
}
/**
* Интерфейс событий для межвиджетного взаимодействия.
* Определяет функции обратного вызова для различных изменений состояния.
*/
export interface SharedStateEvents {
/**
* Вызывается при получении результатов поиска.
* @param {SearchState} state - Полное состояние поиска
*/
onSearchResults: (state: SearchState) => void;
/**
* Вызывается при возникновении ошибки поиска.
* @param {string} error - Сообщение об ошибке
*/
onSearchError: (error: string) => void;
/**
* Вызывается при изменении состояния загрузки поиска.
* @param {boolean} loading - Состояние загрузки
*/
onSearchLoading: (loading: boolean) => void;
/**
* Вызывается при изменении фильтров.
* @param {FilterState[]} filters - Обновленные фильтры
*/
onFiltersChanged: (filters: FilterState[]) => void;
/**
* Вызывается при применении фильтра.
* @param {FilterState} filter - Примененный фильтр
*/
onFilterApplied: (filter: FilterState) => void;
/**
* Вызывается при удалении фильтра.
* @param {string} filterId - ID удаленного фильтра
*/
onFilterRemoved: (filterId: string) => void;
/**
* Вызывается при обновлении товаров.
* @param {FullProduct[]} products - Обновленные товары
*/
onProductsUpdated: (products: FullProduct[]) => void;
/**
* Вызывается при выборе товара.
* @param {FullProduct} product - Выбранный товар
*/
onProductSelected: (product: FullProduct) => void;
}
/**
* Интерфейс конфигурации для управления общим состоянием.
* Определяет поведение и настройки для межвиджетного взаимодействия.
*/
export interface SharedStateConfig {
/**
* Автоматически обновлять результаты поиска при изменении фильтров.
* @defaultValue true
*/
autoUpdateOnFilterChange?: boolean;
/**
* Конфигурация API для операций общего состояния.
*/
api?: {
/**
* Базовый URL для API запросов.
*/
baseUrl?: string;
/**
* Токен аутентификации.
*/
token?: string;
/**
* Идентификатор клиента.
*/
customerId?: string;
/**
* Идентификатор локации.
*/
locationId?: string;
/**
* Версия API для использования.
* @defaultValue "v1"
*/
apiVersion?: string;
};
/**
* Специфичная конфигурация поискового виджета.
*/
searchWidget?: {
/**
* Текст-заполнитель для поля поиска.
* @defaultValue "Поиск товаров..."
*/
placeholder?: string;
/**
* Задержка для поля ввода поиска.
* @defaultValue 300
*/
debounceMs?: number;
/**
* Минимальные символы для поиска.
* @defaultValue 2
*/
minSearchLength?: number;
/**
* Включить темную тему.
* @defaultValue false
*/
darkMode?: boolean;
/**
* Включить стили режима фокуса.
* @defaultValue false
*/
focusMode?: boolean;
/**
* Показывать кнопку очистки.
* @defaultValue true
*/
showClearButton?: boolean;
};
/**
* Специфичная конфигурация виджета фильтров.
*/
filtersWidget?: {
/**
* Максимальное количество значений на фильтр для отображения.
* @defaultValue 5
*/
maxValuesPerFilter?: number;
/**
* Задержка для изменений фильтров.
* @defaultValue 300
*/
debounceMs?: number;
/**
* Включить темную тему.
* @defaultValue false
*/
darkMode?: boolean;
};
/**
* Специфичная конфигурация виджета товаров.
*/
productsWidget?: {
/**
* Количество товаров на странице.
* @defaultValue 20
*/
itemsPerPage?: number;
/**
* Ширина элемента сетки на мобильных устройствах.
* @defaultValue 140
*/
mobileItemWidth?: number;
/**
* Ширина элемента сетки на десктопе.
* @defaultValue 250
*/
desktopItemWidth?: number;
/**
* Включить темную тему.
* @defaultValue false
*/
darkMode?: boolean;
/**
* Показывать элементы управления пагинацией.
* @defaultValue true
*/
showPagination?: boolean;
/**
* Показывать общее количество.
* @defaultValue true
*/
showTotalCount?: boolean;
};
/**
* Специфичная конфигурация виджета сортировки.
*/
sortWidget?: {
/**
* Включить темную тему.
* @defaultValue false
*/
darkMode?: boolean;
/**
* Опция сортировки по умолчанию.
* @defaultValue "relevance"
*/
defaultSort?: string;
};
}