/** * Composable для утилит поиска */ export function useSearchUtils() { /** * Форматирует цену в российских рублях * @param price - Цена для форматирования * @returns Отформатированная цена */ const formatPrice = (price: number) => { return new Intl.NumberFormat('ru-RU', { style: 'currency', currency: 'RUB', minimumFractionDigits: 0, maximumFractionDigits: 0, }).format(price / 100) } /** * Обработчик ошибки загрузки изображения * @param event - Событие ошибки */ const handleImageError = (event: Event) => { const img = event.target as HTMLImageElement // Можно установить placeholder изображение // img.src = '/placeholder-product.png' } /** * Создает debounce функцию * @param func - Функция для debounce * @param delay - Задержка в миллисекундах * @returns Debounced функция */ const createDebounce = any>( func: T, delay: number ) => { let timeoutId: ReturnType | null = null return (...args: Parameters) => { if (timeoutId) { clearTimeout(timeoutId) } timeoutId = setTimeout(() => { func(...args) }, delay) } } /** * Определяет источник товара для отслеживания * @param hasSearchResults - Есть ли результаты поиска * @param searchResults - Результаты поиска * @param product - Товар * @param searchQuery - Поисковый запрос * @returns Объект с источником, позицией и запросом */ const getProductSource = ( hasSearchResults: boolean, searchResults: any[], product: any, searchQuery: string ): { source: 'search' | 'popular_auto_products' | 'popular_manual_products' | 'similar_products' | 'up_sell_products' | 'cross_sell_products' | 'recently_watched_products' | 'recommended_products' | 'recommended_query_products' position?: number query?: string } => { let source: 'search' | 'popular_auto_products' | 'popular_manual_products' | 'similar_products' | 'up_sell_products' | 'cross_sell_products' | 'recently_watched_products' | 'recommended_products' | 'recommended_query_products' = 'popular_auto_products' let position = undefined let query = undefined // Если есть результаты поиска и товар найден в них, считаем что это результат поиска if (hasSearchResults && searchResults.length > 0) { const searchIndex = searchResults.findIndex((p: any) => p.id === product.id) if (searchIndex !== -1) { source = 'search' position = searchIndex query = searchQuery } } return { source, position, query } } return { formatPrice, handleImageError, createDebounce, getProductSource } }