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 */}
{/* Search Results Header */}

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

Запрос: {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 Table */} {!isLoading && vehicles.length > 0 && !isRedirecting && (
{vehicles.map((vehicle, index) => { console.log('🔍 Отображаем автомобиль в таблице:', { index, vehicleid: vehicle.vehicleid, name: vehicle.name, brand: vehicle.brand, catalog: vehicle.catalog, model: vehicle.model, year: vehicle.year, engine: vehicle.engine, ssd: vehicle.ssd ? vehicle.ssd.substring(0, 30) + '...' : 'отсутствует' }); return ( handleVehicleSelect(vehicle)} className="hover:bg-gray-50 cursor-pointer transition-colors" > ); })}
Бренд Название Модель Год Двигатель КПП Рынок Дата выпуска Период производства Дополнительно
{vehicle.brand} {vehicle.name} {vehicle.model} {(() => { const year = vehicle.year || vehicle.manufactured || (vehicle.date ? vehicle.date.split('.').pop() : '') || ''; console.log(`🗓️ Год для автомобиля ${vehicle.vehicleid}:`, { year, original_year: vehicle.year, manufactured: vehicle.manufactured, date: vehicle.date }); return year || '-'; })()} {(() => { const engine = vehicle.engine || vehicle.engine_info || vehicle.engineno || ''; console.log(`🔧 Двигатель для автомобиля ${vehicle.vehicleid}:`, { engine, original_engine: vehicle.engine, engine_info: vehicle.engine_info, engineno: vehicle.engineno }); return engine || '-'; })()} {(() => { const transmission = vehicle.transmission || vehicle.bodytype || ''; console.log(`⚙️ КПП для автомобиля ${vehicle.vehicleid}:`, { transmission, original_transmission: vehicle.transmission, bodytype: vehicle.bodytype }); return transmission || '-'; })()} {(() => { const market = vehicle.market || vehicle.destinationregion || vehicle.creationregion || ''; console.log(`🌍 Рынок для автомобиля ${vehicle.vehicleid}:`, { market, original_market: vehicle.market, destinationregion: vehicle.destinationregion, creationregion: vehicle.creationregion }); return market || '-'; })()} {(() => { const releaseDate = vehicle.date || vehicle.manufactured || ''; console.log(`📅 Дата выпуска для автомобиля ${vehicle.vehicleid}:`, { releaseDate, date: vehicle.date, manufactured: vehicle.manufactured }); return releaseDate || '-'; })()} {(() => { let prodPeriod = ''; if (vehicle.prodRange) { prodPeriod = vehicle.prodRange; } else if (vehicle.prodPeriod) { prodPeriod = vehicle.prodPeriod; } else if (vehicle.datefrom && vehicle.dateto) { prodPeriod = `${vehicle.datefrom} - ${vehicle.dateto}`; } else if (vehicle.modelyearfrom && vehicle.modelyearto) { prodPeriod = `${vehicle.modelyearfrom} - ${vehicle.modelyearto}`; } console.log(`📈 Период производства для автомобиля ${vehicle.vehicleid}:`, { prodPeriod, prodRange: vehicle.prodRange, original_prodPeriod: vehicle.prodPeriod, datefrom: vehicle.datefrom, dateto: vehicle.dateto, modelyearfrom: vehicle.modelyearfrom, modelyearto: vehicle.modelyearto }); return prodPeriod || '-'; })()}
{vehicle.framecolor && (
Цвет кузова: {vehicle.framecolor}
)} {vehicle.trimcolor && (
Цвет салона: {vehicle.trimcolor}
)} {vehicle.engineno && (
Номер двигателя: {vehicle.engineno}
)} {vehicle.engine_info && (
Двигатель: {vehicle.engine_info}
)} {vehicle.options && (
Опции: {vehicle.options}
)} {vehicle.description && (
Описание: {vehicle.description}
)} {vehicle.modification && (
Модификация: {vehicle.modification}
)} {vehicle.grade && (
Класс: {vehicle.grade}
)}
)} {/* No Results */} {!isLoading && vehicles.length === 0 && searchQuery && (

{searchType === 'vin' ? 'VIN не найден' : 'Госномер не найден'}

{searchType === 'vin' ? `Автомобиль с VIN номером ${searchQuery} не найден в доступных каталогах` : `Автомобиль с государственным номером ${searchQuery} не найден в базе данных` }

Вернуться на главную
)} {/* Invalid Search Query */} {!isLoading && !searchQuery && (

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

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

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