import React, { useState, useEffect, useCallback } from 'react'; import { useRouter } from 'next/router'; import { useLazyQuery } from '@apollo/client'; import Header from '@/components/Header'; import Footer from '@/components/Footer'; import { FIND_LAXIMO_VEHICLE, FIND_LAXIMO_VEHICLE_BY_PLATE_GLOBAL } from '@/lib/graphql'; import { LaximoVehicleSearchResult } from '@/types/laximo'; import Link from 'next/link'; interface VehicleSearchResultsPageProps {} const VehicleSearchResultsPage: React.FC = () => { const router = useRouter(); const { query: routerQuery } = router; const [vehicles, setVehicles] = useState([]); const [isLoading, setIsLoading] = useState(false); const [searchQuery, setSearchQuery] = useState(''); const [searchType, setSearchType] = useState<'vin' | 'plate' | ''>(''); const [isRedirecting, setIsRedirecting] = useState(false); // Query для поиска по VIN const [findVehicleByVin] = useLazyQuery(FIND_LAXIMO_VEHICLE, { onCompleted: (data) => { const results = data.laximoFindVehicle || []; setVehicles(results); setIsLoading(false); }, onError: (error) => { console.error('❌ Ошибка поиска по VIN:', error); setVehicles([]); setIsLoading(false); } }); // Query для поиска по госномеру const [findVehicleByPlate] = useLazyQuery(FIND_LAXIMO_VEHICLE_BY_PLATE_GLOBAL, { onCompleted: (data) => { const results = data.laximoFindVehicleByPlateGlobal || []; setVehicles(results); setIsLoading(false); }, onError: (error) => { console.error('❌ Ошибка поиска по госномеру:', error); setVehicles([]); setIsLoading(false); } }); // Проверяем тип поиска const isVinNumber = (query: string): boolean => { const cleanQuery = query.trim().toUpperCase(); return /^[A-HJ-NPR-Z0-9]{17}$/.test(cleanQuery); }; const isPlateNumber = (query: string): boolean => { const cleanQuery = query.trim().toUpperCase().replace(/\s+/g, ''); const platePatterns = [ /^[АВЕКМНОРСТУХ]\d{3}[АВЕКМНОРСТУХ]{2}\d{2,3}$/, /^[АВЕКМНОРСТУХ]{2}\d{3}[АВЕКМНОРСТУХ]\d{2,3}$/, /^[АВЕКМНОРСТУХ]\d{3}[АВЕКМНОРСТУХ]{2}\d{2,3}$/, ]; return platePatterns.some(pattern => pattern.test(cleanQuery)); }; // Выполняем поиск при загрузке страницы useEffect(() => { if (routerQuery.q && typeof routerQuery.q === 'string') { const query = routerQuery.q.trim(); setSearchQuery(query); setIsLoading(true); if (isVinNumber(query)) { setSearchType('vin'); findVehicleByVin({ variables: { catalogCode: '', // Глобальный поиск vin: query.toUpperCase() } }); } else if (isPlateNumber(query)) { setSearchType('plate'); findVehicleByPlate({ variables: { plateNumber: query.toUpperCase().replace(/\s+/g, '') } }); } else { setIsLoading(false); } } }, [routerQuery.q, findVehicleByVin, findVehicleByPlate]); const handleVehicleSelect = useCallback((vehicle: LaximoVehicleSearchResult, skipToCategories = false) => { console.log('🚗 handleVehicleSelect вызвана для автомобиля:', vehicle, 'skipToCategories:', skipToCategories); // Переходим к выбору групп запчастей для найденного автомобиля const catalogCode = vehicle.catalog || vehicle.brand?.toLowerCase() || ''; const vehicleId = vehicle.vehicleid || ''; const ssd = vehicle.ssd || ''; console.log('🔧 Выбранные параметры:', { catalogCode, vehicleId, ssd: ssd ? `${ssd.substring(0, 50)}...` : 'отсутствует', ssdLength: ssd.length }); // Создаем базовые параметры URL const urlParams = new URLSearchParams(); // Добавляем VIN-номер в URL, если он есть if (searchQuery && searchType === 'vin') { urlParams.set('vin', searchQuery); } // Если есть SSD, сохраняем его в localStorage для безопасной передачи if (ssd && ssd.trim() !== '') { const vehicleKey = `vehicle_ssd_${catalogCode}_${vehicleId}`; console.log('💾 Сохраняем SSD в localStorage, ключ:', vehicleKey); // Очищаем все предыдущие SSD для других автомобилей const keysToRemove = Object.keys(localStorage).filter(key => key.startsWith('vehicle_ssd_')); keysToRemove.forEach(key => { if (key !== vehicleKey) { console.log('🗑️ Удаляем старый SSD ключ:', key); localStorage.removeItem(key); } }); localStorage.setItem(vehicleKey, ssd); urlParams.set('use_storage', '1'); urlParams.set('ssd_length', ssd.length.toString()); } if (skipToCategories) { urlParams.set('searchType', 'categories'); } // Формируем URL с параметрами const baseUrl = `/vehicle-search/${catalogCode}/${vehicleId}`; const url = urlParams.toString() ? `${baseUrl}?${urlParams.toString()}` : baseUrl; console.log('🔗 Переходим на URL:', url); // Используем replace вместо push для моментального перехода router.replace(url); }, [router, searchQuery, searchType]); // Предзагрузка и автоматический переход при поиске по VIN, если найден только один автомобиль useEffect(() => { if (!isLoading && searchType === 'vin' && vehicles.length === 1 && !isRedirecting) { console.log('🚗 Найден один автомобиль по VIN, подготавливаем мгновенный переход'); const vehicle = vehicles[0]; const catalogCode = vehicle.catalog || vehicle.brand?.toLowerCase() || ''; const vehicleId = vehicle.vehicleid || ''; // Предзагружаем целевую страницу для ускорения перехода (сразу с категориями) const targetUrl = `/vehicle-search/${catalogCode}/${vehicleId}?searchType=categories`; router.prefetch(targetUrl); console.log('🔄 Предзагружаем страницу с категориями:', targetUrl); setIsRedirecting(true); // Мгновенный переход сразу к категориям handleVehicleSelect(vehicle, true); } }, [isLoading, searchType, vehicles, handleVehicleSelect, isRedirecting, router]); const handleCancelRedirect = () => { setIsRedirecting(false); }; return ( <>
{/* Breadcrumb (InfoSearch style) */}

{searchType === 'vin' ? 'Поиск по VIN номеру' : 'Поиск по государственному номеру'}

{/* Search Results Header */}
{/*

Запрос: {searchQuery}

{!isLoading && vehicles.length > 0 && !isRedirecting && (

Найдено {vehicles.length} автомобилей

)}
*/} {/* Loading State */} {isLoading && (

Поиск автомобилей...

)} {/* Auto-redirect notification for VIN search with single result */} {!isLoading && searchType === 'vin' && vehicles.length === 1 && isRedirecting && (

✅ Автомобиль найден!

{vehicles[0]?.brand} {vehicles[0]?.name} {vehicles[0]?.year && ` (${vehicles[0].year} г.)`} {vehicles[0]?.engine && `, двигатель: ${vehicles[0].engine}`}

🚀 Переходим сразу к категориям запчастей...

)} {/* Results List (Search-like style, not table) */} {!isLoading && vehicles.length > 0 && !isRedirecting && (
Бренд
Название
Модель
Год
Двигатель
КПП
Рынок
Дата выпуска
Период производства
{vehicles.map((vehicle, index) => (
handleVehicleSelect(vehicle)} style={{ minWidth: 0 }} >
{vehicle.brand}
{vehicle.name}
{vehicle.model}
{vehicle.year || '-'}
{vehicle.engine || '-'}
{vehicle.transmission || '-'}
{vehicle.market || '-'}
{vehicle.date || vehicle.manufactured || '-'}
{vehicle.prodRange || vehicle.prodPeriod || ((vehicle.datefrom && vehicle.dateto) ? `${vehicle.datefrom} - ${vehicle.dateto}` : (vehicle.modelyearfrom && vehicle.modelyearto) ? `${vehicle.modelyearfrom} - ${vehicle.modelyearto}` : '-')}
))}
)} {/* No Results */} {!isLoading && vehicles.length === 0 && searchQuery && (

Автомобили не найдены

По запросу {searchQuery} автомобили не найдены.

Попробуйте изменить запрос или проверьте правильность написания.

)} {/* Invalid Search Query */} {!isLoading && !searchQuery && (

Введите поисковый запрос

Используйте поле поиска в шапке сайта для поиска автомобилей по VIN номеру или государственному номеру

Вернуться на главную
)}