import React, { useState } from 'react'; import { useRouter } from 'next/router'; import { useQuery } from '@apollo/client'; import { GET_LAXIMO_QUICK_GROUPS, GET_LAXIMO_QUICK_DETAIL } from '@/lib/graphql'; import { LaximoQuickGroup, LaximoQuickDetail, LaximoUnit } from '@/types/laximo'; import BrandSelectionModal from './BrandSelectionModal'; import UnitDetailsSection from './UnitDetailsSection'; interface QuickGroupsSectionProps { catalogCode: string; vehicleId: string; ssd?: string; } interface QuickGroupItemProps { group: LaximoQuickGroup; level: number; onGroupClick: (group: LaximoQuickGroup) => void; } const QuickGroupItem: React.FC = ({ group, level, onGroupClick }) => { const [isExpanded, setIsExpanded] = useState(false); const hasChildren = group.children && group.children.length > 0; const canShowDetails = group.link; // Только группы с link=true могут показывать детали const handleGroupClick = () => { if (canShowDetails) { // Если это конечная группа с поиском деталей - переходим к просмотру деталей onGroupClick(group); } else if (hasChildren) { // Если это родительская группа с подгруппами if (group.children?.some(child => child.link)) { // Есть подгруппы с активным поиском - показываем пользователю выбор setIsExpanded(!isExpanded); } else { // Все подгруппы неактивны - просто разворачиваем setIsExpanded(!isExpanded); } } }; return (
0 ? 'ml-4' : ''} `} >
{hasChildren && ( )}

{group.name}

ID: {group.quickgroupid} {canShowDetails && ( Доступен поиск )} {hasChildren && !canShowDetails && ( {group.children?.filter(child => child.link).length || 0} подгрупп )}

{canShowDetails && ( )}
{/* Дочерние группы */} {hasChildren && isExpanded && (
{group.children!.map((childGroup) => ( ))}
)}
); }; interface QuickDetailSectionProps { catalogCode: string; vehicleId: string; selectedGroup: LaximoQuickGroup; ssd: string; onBack: () => void; } const QuickDetailSection: React.FC = ({ catalogCode, vehicleId, selectedGroup, ssd, onBack }) => { console.log('🚀 QuickDetailSection рендерится с параметрами:', { catalogCode, vehicleId, selectedGroup, ssd }); const router = useRouter(); const [isBrandModalOpen, setIsBrandModalOpen] = useState(false); const [selectedDetail, setSelectedDetail] = useState(null); const [expandedUnits, setExpandedUnits] = useState>(new Set()); const [selectedUnit, setSelectedUnit] = useState(null); const handleDetailClick = (detail: any) => { const articleNumber = detail.oem; console.log('🔍 Клик по детали из QuickGroups для выбора бренда:', { articleNumber, name: detail.name }); setSelectedDetail(detail); setIsBrandModalOpen(true); }; const handleCloseBrandModal = () => { setIsBrandModalOpen(false); setSelectedDetail(null); }; const toggleUnitExpansion = (unitId: string) => { const newExpanded = new Set(expandedUnits); if (newExpanded.has(unitId)) { newExpanded.delete(unitId); } else { newExpanded.add(unitId); } setExpandedUnits(newExpanded); }; const handleUnitClick = (unit: LaximoUnit) => { // ИСПРАВЛЕНИЕ: Сохраняем SSD узла из API ответа console.log('🔍 handleUnitClick - сохраняем узел с SSD:', { unitId: unit.unitid, unitName: unit.name, unitSsd: unit.ssd ? `${unit.ssd.substring(0, 50)}...` : 'отсутствует', unitSsdLength: unit.ssd?.length }); setSelectedUnit(unit); // Сохраняем полный объект узла с его SSD }; const handleBackFromUnit = () => { setSelectedUnit(null); }; const { data: quickDetailData, loading: quickDetailLoading, error: quickDetailError } = useQuery<{ laximoQuickDetail: LaximoQuickDetail }>( GET_LAXIMO_QUICK_DETAIL, { variables: selectedGroup?.quickgroupid ? { catalogCode, vehicleId, quickGroupId: selectedGroup.quickgroupid, ssd } : undefined, skip: !catalogCode || vehicleId === undefined || vehicleId === null || !selectedGroup?.quickgroupid || !ssd || ssd.trim() === '', errorPolicy: 'all', fetchPolicy: 'cache-and-network' // Принудительно запрашиваем данные } ); const quickDetail = quickDetailData?.laximoQuickDetail; // Добавляем отладочную информацию console.log('🔍 QuickDetailSection Debug:', { catalogCode, vehicleId, vehicleIdType: typeof vehicleId, quickGroupId: selectedGroup?.quickgroupid, quickGroupIdType: typeof selectedGroup?.quickgroupid, ssd: ssd ? `${ssd.substring(0, 30)}...` : 'отсутствует', ssdType: typeof ssd, ssdLength: ssd?.length, hasData: !!quickDetailData, hasQuickDetail: !!quickDetail, unitsCount: quickDetail?.units?.length || 0, loading: quickDetailLoading, error: quickDetailError?.message, skipCondition: !catalogCode || vehicleId === undefined || vehicleId === null || !selectedGroup?.quickgroupid || !ssd, skipDetails: { noCatalogCode: !catalogCode, noVehicleId: vehicleId === undefined || vehicleId === null, noQuickGroupId: !selectedGroup?.quickgroupid, noSsd: !ssd } }); // Если выбран узел для детального просмотра, показываем UnitDetailsSection if (selectedUnit) { // ИСПРАВЛЕНИЕ: Используем SSD узла из API ответа, а не родительский SSD // API Laximo возвращает для каждого узла свой собственный SSD console.log('🔍 QuickDetailSection передает в UnitDetailsSection:', { parentSsd: ssd ? `${ssd.substring(0, 50)}...` : 'отсутствует', parentSsdLength: ssd?.length, selectedUnitSsd: selectedUnit.ssd ? `${selectedUnit.ssd.substring(0, 50)}...` : 'отсутствует', selectedUnitSsdLength: selectedUnit.ssd?.length, unitId: selectedUnit.unitid, unitName: selectedUnit.name, note: 'Используем SSD УЗЛА из API ответа' }); return ( ); } if (quickDetailLoading) { return (

Загружаем детали...

); } if (quickDetailError) { console.error('🚨 QuickDetailSection Error Details:', { message: quickDetailError.message, graphQLErrors: quickDetailError.graphQLErrors, networkError: quickDetailError.networkError, extraInfo: quickDetailError.extraInfo, selectedGroup: selectedGroup, variables: selectedGroup?.quickgroupid ? { catalogCode, vehicleId, quickGroupId: selectedGroup.quickgroupid, ssd } : 'undefined (no variables sent)' }); return (

Ошибка загрузки деталей

Не удалось загрузить детали для группы "{selectedGroup.name}"

Ошибка: {quickDetailError.message}

{/* Отладочная информация */}
🔧 Показать отладочную информацию
Catalog Code: {catalogCode}
Vehicle ID: {vehicleId} (type: {typeof vehicleId})
Quick Group ID: {selectedGroup?.quickgroupid} (type: {typeof selectedGroup?.quickgroupid})
SSD: {ssd ? `${ssd.substring(0, 100)}...` : 'отсутствует'} (length: {ssd?.length})
GraphQL Errors:
                  {JSON.stringify(quickDetailError.graphQLErrors, null, 2)}
                
{quickDetailError.networkError && (
Network Error:
                    {JSON.stringify(quickDetailError.networkError, null, 2)}
                  
)}
); } return (
{/* Навигация */}
Группа: {selectedGroup.quickgroupid}
{/* Заголовок */}

{selectedGroup.name}

Детали и узлы в группе быстрого поиска

{/* Детали */} {quickDetail && quickDetail.units ? (
{quickDetail.units.map((unit) => (
{/* Изображение узла */} {(unit.imageurl || unit.largeimageurl) && (() => { const finalImageUrl = unit.largeimageurl ? unit.largeimageurl.replace('%size%', '250') : unit.imageurl?.replace('%size%', '250') || ''; console.log('🖼️ Загружаем изображение:', finalImageUrl); console.log('🔍 Raw URLs:', { imageurl: unit.imageurl, largeimageurl: unit.largeimageurl }); return (
Debug: {finalImageUrl}
{unit.name} { console.log('✅ Изображение загружено успешно:', finalImageUrl); }} onError={(e) => { console.error('❌ Ошибка загрузки изображения:', finalImageUrl); console.error('❌ Event:', e); const img = e.target as HTMLImageElement; img.style.border = '2px solid red'; img.alt = 'Ошибка загрузки'; }} onClick={() => { // Открываем изображение в новой вкладке const imageUrl = unit.largeimageurl ? unit.largeimageurl.replace('%size%', '400') : unit.imageurl?.replace('%size%', '400') || ''; if (imageUrl) { window.open(imageUrl, '_blank'); } }} />
); })()}
{unit.details && unit.details.length > 0 && expandedUnits.has(unit.unitid) && (

Детали узла "{unit.name}":

{unit.details.map((detail) => (
{detail.name}

OEM: {detail.oem}

{detail.brand && (

Бренд: {detail.brand}

)} {detail.note && (

Примечание: {detail.note}

)}
{detail.attributes && detail.attributes.length > 0 && (
{detail.attributes.map((attr, index) => (

{attr.name || attr.key}: {attr.value}

))}
)}
{detail.detailid}
))}
)}
))} ) : (

Нет доступных деталей

В данной группе не найдено деталей или узлов.

)} {selectedDetail && ( )} ); }; const QuickGroupsSection: React.FC = ({ catalogCode, vehicleId, ssd }) => { const [selectedGroup, setSelectedGroup] = useState(null); // Получаем список групп быстрого поиска const { data: quickGroupsData, loading: quickGroupsLoading, error: quickGroupsError } = useQuery<{ laximoQuickGroups: LaximoQuickGroup[] }>( GET_LAXIMO_QUICK_GROUPS, { variables: { catalogCode, vehicleId, ...(ssd && ssd.trim() !== '' && { ssd }) }, skip: !catalogCode || vehicleId === undefined || vehicleId === null, errorPolicy: 'all' } ); const handleGroupClick = (group: LaximoQuickGroup) => { if (!ssd || ssd.trim() === '') { alert('Ошибка: Для поиска деталей необходимы данные автомобиля (SSD). Пожалуйста, выберите автомобиль заново.'); return; } console.log('🔍 Открываем детали группы быстрого поиска:', group.quickgroupid); setSelectedGroup(group); }; const handleBackToGroups = () => { setSelectedGroup(null); }; // Если выбрана группа для просмотра деталей if (selectedGroup && ssd) { return ( ); } if (quickGroupsLoading) { return (
); } if (quickGroupsError) { return (

Ошибка загрузки групп быстрого поиска

Не удалось загрузить группы быстрого поиска для данного автомобиля.

Ошибка: {quickGroupsError.message}

); } const quickGroups = quickGroupsData?.laximoQuickGroups || []; if (quickGroups.length === 0) { return (

Группы быстрого поиска недоступны

Для данного автомобиля не найдено групп быстрого поиска.

); } return (

Группы быстрого поиска

Выберите группу для поиска запчастей. Доступны только группы с активным поиском деталей.

{quickGroups.map((group) => ( ))}
{/* Информационная панель */}

Информация о группах быстрого поиска

  • Зеленая метка "Доступен поиск" указывает на возможность поиска деталей в группе
  • Группы без метки служат для организации структуры каталога
  • Нажмите на группу с активным поиском для просмотра деталей
); }; export default QuickGroupsSection;