import { nextTick } from 'vue' import type { SearchWidgetEmits, SearchProduct, SearchHint } from '../types' /** * Composable для обработки событий поиска */ export function useSearchEvents(emit: SearchWidgetEmits) { /** * Эмитит событие поиска * @param query - Поисковый запрос */ const emitSearch = (query: string) => { emit('search', query.trim()) } /** * Эмитит событие выбора товара * @param product - Выбранный товар * @param event - Событие мыши (опционально) */ const emitSelect = (product: SearchProduct, event?: MouseEvent) => { emit('select', product, event) } /** * Эмитит событие обновления модели * @param value - Новое значение */ const emitUpdateModel = (value: string) => { emit('update:modelValue', value) } /** * Эмитит событие результатов поиска * @param results - Результаты поиска */ const emitSearchResults = (results: any) => { emit('searchResults', results) } /** * Эмитит событие выбора из истории * @param query - Выбранный запрос */ const emitHistorySelect = (query: string) => { emit('historySelect', query) } /** * Эмитит событие выбора популярного запроса * @param query - Выбранный запрос */ const emitPopularQuerySelect = (query: string) => { emit('popularQuerySelect', query) } /** * Эмитит событие очистки истории */ const emitClearHistory = () => { emit('clearHistory') } /** * Эмитит событие фокуса */ const emitFocus = async () => { emit('focus') await nextTick() } /** * Эмитит событие потери фокуса */ const emitBlur = async () => { emit('blur') await nextTick() } /** * Эмитит событие загрузки * @param isLoading - Состояние загрузки */ const emitLoading = (isLoading: boolean) => { emit('loading', isLoading) } /** * Эмитит событие ошибки * @param error - Текст ошибки */ const emitError = (error: string) => { emit('error', error) } /** * Эмитит событие отсутствия результатов * @param query - Поисковый запрос */ const emitNoResults = (query: string) => { emit('noResults', query) } /** * Эмитит событие ввода * @param value - Введенное значение */ const emitInput = (value: string) => { emit('input', value) } /** * Эмитит событие глубокого поиска * @param query - Поисковый запрос */ const emitDeepSearch = (query: string) => { emit('deepSearch', query.trim()) } return { emitSearch, emitSelect, emitUpdateModel, emitSearchResults, emitHistorySelect, emitPopularQuerySelect, emitClearHistory, emitFocus, emitBlur, emitLoading, emitError, emitNoResults, emitInput, emitDeepSearch } }