import React, { useState, useEffect, useRef } from 'react'; import { useQuery, useLazyQuery } from '@apollo/client'; import { GET_LAXIMO_CATEGORIES, GET_LAXIMO_QUICK_GROUPS, GET_LAXIMO_UNITS } from '@/lib/graphql/laximo'; interface VinCategoryProps { catalogCode: string; vehicleId: string; ssd: string; onNodeSelect?: (node: any) => void; activeTab: 'uzly' | 'manufacturer'; onQuickGroupSelect?: (group: any) => void; } const VinCategory: React.FC = ({ catalogCode, vehicleId, ssd, onNodeSelect, activeTab, onQuickGroupSelect }) => { const [selectedCategory, setSelectedCategory] = useState(null); const [unitsByCategory, setUnitsByCategory] = useState<{ [key: string]: any[] }>({}); const lastCategoryIdRef = useRef(null); // Сброс выбранной категории при смене вкладки useEffect(() => { setSelectedCategory(null); }, [activeTab]); // Запрос для "Узлы" const { data: categoriesData, loading: categoriesLoading, error: categoriesError } = useQuery(GET_LAXIMO_CATEGORIES, { variables: { catalogCode, vehicleId, ssd }, skip: !catalogCode || vehicleId === undefined || vehicleId === null || activeTab !== 'uzly', errorPolicy: 'all' }); // Запрос для получения units (подкатегорий) в режиме "Узлы" const [getUnits] = useLazyQuery(GET_LAXIMO_UNITS, { onCompleted: (data) => { console.log('Units loaded:', data); if (data && data.laximoUnits && lastCategoryIdRef.current) { console.log('Setting units for category:', lastCategoryIdRef.current, data.laximoUnits); setUnitsByCategory(prev => ({ ...prev, [lastCategoryIdRef.current!]: data.laximoUnits || [] })); } }, onError: (error) => { console.error('Error loading units:', error); } }); // Запрос для "От производителя" const { data: quickGroupsData, loading: quickGroupsLoading, error: quickGroupsError } = useQuery(GET_LAXIMO_QUICK_GROUPS, { variables: { catalogCode, vehicleId, ssd }, skip: !catalogCode || vehicleId === undefined || vehicleId === null || activeTab !== 'manufacturer', errorPolicy: 'all' }); const categories = activeTab === 'uzly' ? (categoriesData?.laximoCategories || []) : (quickGroupsData?.laximoQuickGroups || []); const loading = activeTab === 'uzly' ? categoriesLoading : quickGroupsLoading; const error = activeTab === 'uzly' ? categoriesError : quickGroupsError; const handleBack = () => { setSelectedCategory(null); }; const handleCategoryClick = (category: any) => { if (activeTab === 'manufacturer') { if (category.children && category.children.length > 0) { setSelectedCategory(category); } else if (category.link && onQuickGroupSelect) { onQuickGroupSelect(category); } else if (onNodeSelect) { onNodeSelect(category); } } else { // Логика для вкладки "Узлы" if (category.children && category.children.length > 0) { setSelectedCategory(category); } else { // Если нет children, грузим units (подкатегории) const categoryId = category.categoryid || category.quickgroupid || category.id; if (!unitsByCategory[categoryId]) { lastCategoryIdRef.current = categoryId; console.log('Loading units for category:', { categoryId, category }); getUnits({ variables: { catalogCode, vehicleId, ssd, categoryId } }); } setSelectedCategory(category); } } }; const handleSubcategoryClick = (subcat: any) => { if (activeTab === 'uzly' && onNodeSelect) { // Для режима "Узлы" при клике на подкатегорию открываем KnotIn onNodeSelect({ ...subcat, unitid: subcat.unitid || subcat.categoryid || subcat.quickgroupid || subcat.id }); } else { handleCategoryClick(subcat); } }; if (loading) return
Загрузка категорий...
; if (error) return
Ошибка: {error.message}
; // Определяем, какие подкатегории показывать let subcategories: any[] = []; if (selectedCategory) { if (activeTab === 'manufacturer') { // Для вкладки "От производителя" используем children subcategories = selectedCategory.children || []; } else { // Для вкладки "Узлы" используем либо children, либо units if (selectedCategory.children && selectedCategory.children.length > 0) { subcategories = selectedCategory.children; } else { const categoryId = selectedCategory.categoryid || selectedCategory.quickgroupid || selectedCategory.id; subcategories = unitsByCategory[categoryId] || []; } } } return (
{!selectedCategory ? ( // Список категорий categories.map((cat: any, idx: number) => (
handleCategoryClick(cat)} style={{ cursor: "pointer" }} >
{cat.name}
)) ) : ( // Список подкатегорий <>
← Назад
{subcategories.length === 0 &&
Нет подкатегорий
} {subcategories.map((subcat: any, idx: number) => (
handleSubcategoryClick(subcat)} style={{ cursor: "pointer" }} >
{subcat.name}
))} )}
); }; export default VinCategory;