Исправлены расчеты цен в корзине и добавлена логика загрузки единиц для категорий. Обновлены компоненты CartInfo, CartList, CartSummary, VinCategory и VinLeftbar для корректного отображения итоговых цен и улучшения взаимодействия с пользователем.
This commit is contained in:
@ -32,7 +32,7 @@ const CartInfo: React.FC = () => {
|
|||||||
<h1 className="heading">Корзина</h1>
|
<h1 className="heading">Корзина</h1>
|
||||||
<div className="text-block-4">
|
<div className="text-block-4">
|
||||||
{summary.totalItems > 0 ? (
|
{summary.totalItems > 0 ? (
|
||||||
<>В вашей корзине {summary.totalItems} товара на <strong>{formatPrice(summary.finalPrice)}</strong></>
|
<>В вашей корзине {summary.totalItems} товара на <strong>{formatPrice(summary.totalPrice - summary.totalDiscount)}</strong></>
|
||||||
) : (
|
) : (
|
||||||
'Ваша корзина пуста'
|
'Ваша корзина пуста'
|
||||||
)}
|
)}
|
||||||
|
@ -170,7 +170,7 @@ const CartList: React.FC<CartListProps> = ({ isSummaryStep = false }) => {
|
|||||||
description={item.description}
|
description={item.description}
|
||||||
delivery={item.deliveryTime || 'Уточняется'}
|
delivery={item.deliveryTime || 'Уточняется'}
|
||||||
deliveryDate={item.deliveryDate || ''}
|
deliveryDate={item.deliveryDate || ''}
|
||||||
price={formatPrice(item.price, item.currency)}
|
price={formatPrice(item.price * item.quantity, item.currency)}
|
||||||
pricePerItem={`${formatPrice(item.price, item.currency)}/шт`}
|
pricePerItem={`${formatPrice(item.price, item.currency)}/шт`}
|
||||||
count={item.quantity}
|
count={item.quantity}
|
||||||
comment={item.comment || ''}
|
comment={item.comment || ''}
|
||||||
|
@ -657,9 +657,7 @@ const CartSummary: React.FC<CartSummaryProps> = ({ step, setStep }) => {
|
|||||||
<div className="w-layout-hflex flex-block-59">
|
<div className="w-layout-hflex flex-block-59">
|
||||||
<div className="text-block-32">Итого</div>
|
<div className="text-block-32">Итого</div>
|
||||||
<h4 className="heading-9-copy-copy">
|
<h4 className="heading-9-copy-copy">
|
||||||
{formatPrice(
|
{formatPrice(summary.totalPrice - summary.totalDiscount)}
|
||||||
summary.totalPrice - summary.totalDiscount + (selectedDeliveryAddress ? 0 : summary.deliveryPrice)
|
|
||||||
)}
|
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -835,9 +833,7 @@ const CartSummary: React.FC<CartSummaryProps> = ({ step, setStep }) => {
|
|||||||
<div className="w-layout-hflex flex-block-59">
|
<div className="w-layout-hflex flex-block-59">
|
||||||
<div className="text-block-32">Итого</div>
|
<div className="text-block-32">Итого</div>
|
||||||
<h4 className="heading-9-copy-copy">
|
<h4 className="heading-9-copy-copy">
|
||||||
{formatPrice(
|
{formatPrice(summary.totalPrice - summary.totalDiscount)}
|
||||||
summary.totalPrice - summary.totalDiscount + (selectedDeliveryAddress ? 0 : summary.deliveryPrice)
|
|
||||||
)}
|
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -65,8 +65,31 @@ const VinCategory: React.FC<VinCategoryProps> = ({ catalogCode, vehicleId, ssd,
|
|||||||
const loading = activeTab === 'uzly' ? quickGroupsLoading : categoriesLoading;
|
const loading = activeTab === 'uzly' ? quickGroupsLoading : categoriesLoading;
|
||||||
const error = activeTab === 'uzly' ? quickGroupsError : categoriesError;
|
const error = activeTab === 'uzly' ? quickGroupsError : categoriesError;
|
||||||
|
|
||||||
|
// Загружаем units для категории если нет children (аналогично VinLeftbar)
|
||||||
|
useEffect(() => {
|
||||||
|
if (selectedCategory && activeTab === 'manufacturer') {
|
||||||
|
const categoryId = selectedCategory.categoryid || selectedCategory.quickgroupid || selectedCategory.id;
|
||||||
|
|
||||||
|
// Если нет children и нет загруженных units - загружаем units
|
||||||
|
if ((!selectedCategory.children || selectedCategory.children.length === 0) &&
|
||||||
|
!unitsByCategory[categoryId]) {
|
||||||
|
console.log('🔄 VinCategory: Загружаем units для категории', categoryId);
|
||||||
|
lastCategoryIdRef.current = categoryId;
|
||||||
|
getUnits({
|
||||||
|
variables: {
|
||||||
|
catalogCode,
|
||||||
|
vehicleId,
|
||||||
|
ssd,
|
||||||
|
categoryId
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [selectedCategory, activeTab, catalogCode, vehicleId, ssd, getUnits, unitsByCategory]);
|
||||||
|
|
||||||
// Функция для обновления openedPath и catpath в URL
|
// Функция для обновления openedPath и catpath в URL
|
||||||
const updatePath = (newPath: string[]) => {
|
const updatePath = (newPath: string[]) => {
|
||||||
|
console.log('🔄 VinCategory: updatePath вызван с newPath:', newPath);
|
||||||
setOpenedPath(newPath);
|
setOpenedPath(newPath);
|
||||||
if (router) {
|
if (router) {
|
||||||
router.push(
|
router.push(
|
||||||
@ -86,16 +109,45 @@ const VinCategory: React.FC<VinCategoryProps> = ({ catalogCode, vehicleId, ssd,
|
|||||||
onCategoryClick();
|
onCategoryClick();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (category.children && category.children.length > 0) {
|
|
||||||
if (openedPath[level] === (category.quickgroupid || category.categoryid || category.id)) {
|
const categoryId = category.quickgroupid || category.categoryid || category.id;
|
||||||
|
|
||||||
|
// Если это режим "От производителя", всегда пытаемся войти в категорию
|
||||||
|
if (activeTab === 'manufacturer') {
|
||||||
|
// Проверяем, открыта ли уже эта категория
|
||||||
|
if (openedPath[level] === categoryId) {
|
||||||
|
// Если уже открыта - закрываем
|
||||||
updatePath(openedPath.slice(0, level));
|
updatePath(openedPath.slice(0, level));
|
||||||
} else {
|
} else {
|
||||||
updatePath([...openedPath.slice(0, level), (category.quickgroupid || category.categoryid || category.id)]);
|
// Если не открыта - открываем (добавляем в path)
|
||||||
|
updatePath([...openedPath.slice(0, level), categoryId]);
|
||||||
|
|
||||||
|
// Если у категории нет children, загружаем units
|
||||||
|
if ((!category.children || category.children.length === 0) && !unitsByCategory[categoryId]) {
|
||||||
|
console.log('🔄 VinCategory: handleCategoryClick загружает units для категории', categoryId);
|
||||||
|
lastCategoryIdRef.current = categoryId;
|
||||||
|
getUnits({
|
||||||
|
variables: {
|
||||||
|
catalogCode,
|
||||||
|
vehicleId,
|
||||||
|
ssd,
|
||||||
|
categoryId
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Режим "Общие" - используем старую логику
|
||||||
|
if (category.children && category.children.length > 0) {
|
||||||
|
if (openedPath[level] === categoryId) {
|
||||||
|
updatePath(openedPath.slice(0, level));
|
||||||
|
} else {
|
||||||
|
updatePath([...openedPath.slice(0, level), categoryId]);
|
||||||
|
}
|
||||||
|
} else if (category.link && onQuickGroupSelect) {
|
||||||
|
// Для вкладки "Общие" с link=true используем QuickGroup
|
||||||
|
onQuickGroupSelect(category);
|
||||||
}
|
}
|
||||||
} else if (category.link && onQuickGroupSelect) {
|
|
||||||
onQuickGroupSelect(category);
|
|
||||||
} else if (onNodeSelect) {
|
|
||||||
onNodeSelect(category);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -177,14 +229,35 @@ const VinCategory: React.FC<VinCategoryProps> = ({ catalogCode, vehicleId, ssd,
|
|||||||
list = found.children || [];
|
list = found.children || [];
|
||||||
level++;
|
level++;
|
||||||
}
|
}
|
||||||
// Теперь level - это уровень selectedCategory, подкатегории будут на level+1
|
|
||||||
const subcategories = selectedCategory.children || [];
|
// Показываем либо children, либо units
|
||||||
if (subcategories.length === 0) return <div style={{ color: "#888", padding: 8 }}>Нет подкатегорий</div>;
|
if (subcategories.length === 0) {
|
||||||
|
// Если загружаются units для категории без children
|
||||||
|
const categoryId = selectedCategory.categoryid || selectedCategory.quickgroupid || selectedCategory.id;
|
||||||
|
if (activeTab === 'manufacturer' &&
|
||||||
|
(!selectedCategory.children || selectedCategory.children.length === 0) &&
|
||||||
|
!unitsByCategory[categoryId]) {
|
||||||
|
return <div style={{ color: "#888", padding: 8 }}>Загружаем узлы...</div>;
|
||||||
|
}
|
||||||
|
return <div style={{ color: "#888", padding: 8 }}>Нет подкатегорий</div>;
|
||||||
|
}
|
||||||
|
|
||||||
return subcategories.map((subcat: any, idx: number) => (
|
return subcategories.map((subcat: any, idx: number) => (
|
||||||
<div
|
<div
|
||||||
className="div-block-131"
|
className="div-block-131"
|
||||||
key={subcat.quickgroupid || subcat.categoryid || subcat.unitid || subcat.id || idx}
|
key={subcat.quickgroupid || subcat.categoryid || subcat.unitid || subcat.id || idx}
|
||||||
onClick={() => handleCategoryClick(subcat, level + 1)}
|
onClick={() => {
|
||||||
|
// Для узлов (units) из режима "От производителя" сразу открываем KnotIn
|
||||||
|
if (activeTab === 'manufacturer' && subcat.unitid && onNodeSelect) {
|
||||||
|
console.log('🔍 VinCategory: Открываем узел напрямую:', subcat);
|
||||||
|
onNodeSelect({
|
||||||
|
...subcat,
|
||||||
|
unitid: subcat.unitid || subcat.quickgroupid || subcat.categoryid || subcat.id
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
handleCategoryClick(subcat, level + 1);
|
||||||
|
}
|
||||||
|
}}
|
||||||
style={{ cursor: "pointer" }}
|
style={{ cursor: "pointer" }}
|
||||||
>
|
>
|
||||||
<div className="text-block-57">{subcat.name}</div>
|
<div className="text-block-57">{subcat.name}</div>
|
||||||
|
@ -90,13 +90,20 @@ const VinLeftbar: React.FC<VinLeftbarProps> = ({ vehicleInfo, onSearchResults, o
|
|||||||
}, [router.query.catpath]);
|
}, [router.query.catpath]);
|
||||||
|
|
||||||
const handleToggle = (categoryId: string, level: number) => {
|
const handleToggle = (categoryId: string, level: number) => {
|
||||||
|
console.log('🔄 VinLeftbar: handleToggle вызван для categoryId:', categoryId, 'level:', level, 'текущий openedPath:', openedPath);
|
||||||
|
|
||||||
if (openedPath[level] === categoryId) {
|
if (openedPath[level] === categoryId) {
|
||||||
setOpenedPathAndUrl(openedPath.slice(0, level));
|
const newPath = openedPath.slice(0, level);
|
||||||
|
console.log('🔄 VinLeftbar: Закрываем категорию, новый path:', newPath);
|
||||||
|
setOpenedPathAndUrl(newPath);
|
||||||
} else {
|
} else {
|
||||||
setOpenedPathAndUrl([...openedPath.slice(0, level), categoryId]);
|
const newPath = [...openedPath.slice(0, level), categoryId];
|
||||||
|
console.log('🔄 VinLeftbar: Открываем категорию, новый path:', newPath);
|
||||||
|
setOpenedPathAndUrl(newPath);
|
||||||
|
|
||||||
// Загружаем units для категории, если они еще не загружены
|
// Загружаем units для категории, если они еще не загружены
|
||||||
if (activeTabProp === 'manufacturer' && !unitsByCategory[categoryId]) {
|
if (activeTabProp === 'manufacturer' && !unitsByCategory[categoryId]) {
|
||||||
|
console.log('🔄 VinLeftbar: Загружаем units для categoryId:', categoryId);
|
||||||
lastCategoryIdRef.current = categoryId;
|
lastCategoryIdRef.current = categoryId;
|
||||||
getUnits({
|
getUnits({
|
||||||
variables: {
|
variables: {
|
||||||
@ -330,7 +337,8 @@ const VinLeftbar: React.FC<VinLeftbarProps> = ({ vehicleInfo, onSearchResults, o
|
|||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
if (searchQuery) setSearchQuery('');
|
if (searchQuery) setSearchQuery('');
|
||||||
if (onActiveTabChange) onActiveTabChange('manufacturer');
|
if (onActiveTabChange) onActiveTabChange('manufacturer');
|
||||||
if (onQuickGroupSelect) onQuickGroupSelect(null);
|
// Не вызываем onQuickGroupSelect с null - это вызывает ошибку
|
||||||
|
// Просто переключаем вкладку, а обработка отображения происходит через activeTab
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
От производителя
|
От производителя
|
||||||
@ -472,13 +480,15 @@ const VinLeftbar: React.FC<VinLeftbarProps> = ({ vehicleInfo, onSearchResults, o
|
|||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
{categories.map((category: any, idx: number) => {
|
{categories.map((category: any, idx: number) => {
|
||||||
const isOpen = openedPath.includes(category.quickgroupid);
|
// ИСПРАВЛЕНИЕ: Используем тот же приоритет ID, что и в VinCategory
|
||||||
|
const categoryId = category.quickgroupid || category.categoryid || category.id;
|
||||||
|
const isOpen = openedPath.includes(categoryId);
|
||||||
const subcategories = category.children && category.children.length > 0
|
const subcategories = category.children && category.children.length > 0
|
||||||
? category.children
|
? category.children
|
||||||
: unitsByCategory[category.quickgroupid] || [];
|
: unitsByCategory[categoryId] || [];
|
||||||
return (
|
return (
|
||||||
<div
|
<div
|
||||||
key={category.quickgroupid}
|
key={categoryId}
|
||||||
data-hover="false"
|
data-hover="false"
|
||||||
data-delay="0"
|
data-delay="0"
|
||||||
className={`dropdown-4 w-dropdown${isOpen ? " w--open" : ""}`}
|
className={`dropdown-4 w-dropdown${isOpen ? " w--open" : ""}`}
|
||||||
@ -487,7 +497,7 @@ const VinLeftbar: React.FC<VinLeftbarProps> = ({ vehicleInfo, onSearchResults, o
|
|||||||
className={`dropdown-toggle-3 w-dropdown-toggle${isOpen ? " w--open" : ""}`}
|
className={`dropdown-toggle-3 w-dropdown-toggle${isOpen ? " w--open" : ""}`}
|
||||||
onClick={(e) => {
|
onClick={(e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
handleToggle(category.quickgroupid, 0);
|
handleToggle(categoryId, 0);
|
||||||
}}
|
}}
|
||||||
style={{ cursor: "pointer" }}
|
style={{ cursor: "pointer" }}
|
||||||
>
|
>
|
||||||
@ -503,14 +513,23 @@ const VinLeftbar: React.FC<VinLeftbarProps> = ({ vehicleInfo, onSearchResults, o
|
|||||||
className="dropdown-link-3 w-dropdown-link pl-0"
|
className="dropdown-link-3 w-dropdown-link pl-0"
|
||||||
onClick={e => {
|
onClick={e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
// Если это конечная категория с link=true, открываем QuickGroup
|
// Для вкладки "От производителя" всегда открываем узел, не используем QuickGroup
|
||||||
if (subcat.link && onQuickGroupSelect) {
|
if (onNodeSelect) {
|
||||||
onQuickGroupSelect(subcat);
|
const nodeToSelect = {
|
||||||
} else if (onNodeSelect) {
|
|
||||||
onNodeSelect({
|
|
||||||
...subcat,
|
...subcat,
|
||||||
unitid: subcat.unitid || subcat.quickgroupid || subcat.id
|
unitid: subcat.unitid || subcat.quickgroupid || subcat.id
|
||||||
|
};
|
||||||
|
|
||||||
|
// ОТЛАДКА: Логируем передачу узла
|
||||||
|
console.log('🔍 VinLeftbar передает узел:', {
|
||||||
|
unitId: nodeToSelect.unitid,
|
||||||
|
unitName: nodeToSelect.name,
|
||||||
|
hasOriginalSsd: !!subcat.ssd,
|
||||||
|
originalSsd: subcat.ssd ? `${subcat.ssd.substring(0, 50)}...` : 'отсутствует',
|
||||||
|
finalSsd: nodeToSelect.ssd ? `${nodeToSelect.ssd.substring(0, 50)}...` : 'отсутствует'
|
||||||
});
|
});
|
||||||
|
|
||||||
|
onNodeSelect(nodeToSelect);
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
|
@ -65,7 +65,8 @@ const calculateSummary = (items: CartItem[], deliveryPrice: number) => {
|
|||||||
const discount = item.originalPrice ? (item.originalPrice - item.price) * item.quantity : 0
|
const discount = item.originalPrice ? (item.originalPrice - item.price) * item.quantity : 0
|
||||||
return sum + discount
|
return sum + discount
|
||||||
}, 0)
|
}, 0)
|
||||||
const finalPrice = totalPrice + deliveryPrice
|
// Доставка включена в стоимость товаров, поэтому добавляем её только если есть товары
|
||||||
|
const finalPrice = totalPrice + (totalPrice > 0 ? 0 : 0) // Доставка всегда включена в цену товаров
|
||||||
|
|
||||||
return {
|
return {
|
||||||
totalItems,
|
totalItems,
|
||||||
|
@ -74,32 +74,7 @@ const VehicleDetailsPage = () => {
|
|||||||
});
|
});
|
||||||
const [selectedNode, setSelectedNode] = useState<any | null>(null);
|
const [selectedNode, setSelectedNode] = useState<any | null>(null);
|
||||||
const [selectedQuickGroup, setSelectedQuickGroup] = useState<any | null>(null);
|
const [selectedQuickGroup, setSelectedQuickGroup] = useState<any | null>(null);
|
||||||
const handleCategoryClick = (e?: React.MouseEvent) => {
|
|
||||||
if (e) e.preventDefault();
|
|
||||||
setShowKnot(true);
|
|
||||||
};
|
|
||||||
useEffect(() => {
|
|
||||||
const handler = (e: Event) => {
|
|
||||||
const target = e.target as HTMLElement;
|
|
||||||
if (target.classList.contains('link-2')) {
|
|
||||||
e.preventDefault();
|
|
||||||
setShowKnot(true);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
document.addEventListener('click', handler);
|
|
||||||
return () => document.removeEventListener('click', handler);
|
|
||||||
}, []);
|
|
||||||
// ====== КОНЕЦ ХУКОВ ======
|
|
||||||
|
|
||||||
// Получаем информацию о каталоге
|
|
||||||
const { data: catalogData } = useQuery<{ laximoCatalogInfo: LaximoCatalogInfo }>(
|
|
||||||
GET_LAXIMO_CATALOG_INFO,
|
|
||||||
{
|
|
||||||
variables: { catalogCode: brand },
|
|
||||||
skip: !brand
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
// Получаем информацию о выбранном автомобиле
|
// Получаем информацию о выбранном автомобиле
|
||||||
const ssdFromQuery = Array.isArray(router.query.ssd) ? router.query.ssd[0] : router.query.ssd;
|
const ssdFromQuery = Array.isArray(router.query.ssd) ? router.query.ssd[0] : router.query.ssd;
|
||||||
const useStorage = router.query.use_storage === '1';
|
const useStorage = router.query.use_storage === '1';
|
||||||
@ -118,9 +93,16 @@ const VehicleDetailsPage = () => {
|
|||||||
} else if (ssdFromQuery && ssdFromQuery.trim() !== '') {
|
} else if (ssdFromQuery && ssdFromQuery.trim() !== '') {
|
||||||
finalSsd = ssdFromQuery;
|
finalSsd = ssdFromQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Получаем информацию о каталоге
|
||||||
|
const { data: catalogData } = useQuery<{ laximoCatalogInfo: LaximoCatalogInfo }>(
|
||||||
|
GET_LAXIMO_CATALOG_INFO,
|
||||||
|
{
|
||||||
|
variables: { catalogCode: brand },
|
||||||
|
skip: !brand
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
const { data: vehicleData, loading: vehicleLoading, error: vehicleError } = useQuery<{ laximoVehicleInfo: LaximoVehicleInfo }>(
|
const { data: vehicleData, loading: vehicleLoading, error: vehicleError } = useQuery<{ laximoVehicleInfo: LaximoVehicleInfo }>(
|
||||||
GET_LAXIMO_VEHICLE_INFO,
|
GET_LAXIMO_VEHICLE_INFO,
|
||||||
{
|
{
|
||||||
@ -155,6 +137,27 @@ const VehicleDetailsPage = () => {
|
|||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Получаем детали выбранного узла, если он выбран
|
||||||
|
const {
|
||||||
|
data: unitDetailsData,
|
||||||
|
loading: unitDetailsLoading,
|
||||||
|
error: unitDetailsError
|
||||||
|
} = useQuery(
|
||||||
|
GET_LAXIMO_UNIT_DETAILS,
|
||||||
|
{
|
||||||
|
variables: selectedNode
|
||||||
|
? {
|
||||||
|
catalogCode: selectedNode.catalogCode || selectedNode.catalog || brand,
|
||||||
|
vehicleId: selectedNode.vehicleId || vehicleId,
|
||||||
|
unitId: selectedNode.unitid || selectedNode.unitId,
|
||||||
|
ssd: selectedNode.ssd || finalSsd || '',
|
||||||
|
}
|
||||||
|
: { catalogCode: '', vehicleId: '', unitId: '', ssd: '' },
|
||||||
|
skip: !selectedNode,
|
||||||
|
errorPolicy: 'all',
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
// Автоматическое перенаправление на правильный vehicleId если API вернул другой ID
|
// Автоматическое перенаправление на правильный vehicleId если API вернул другой ID
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (vehicleData?.laximoVehicleInfo && vehicleData.laximoVehicleInfo.vehicleid !== vehicleId) {
|
if (vehicleData?.laximoVehicleInfo && vehicleData.laximoVehicleInfo.vehicleid !== vehicleId) {
|
||||||
@ -181,27 +184,54 @@ const VehicleDetailsPage = () => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}, [vehicleData, vehicleId, brand, finalSsd, router]);
|
}, [vehicleData, vehicleId, brand, finalSsd, router]);
|
||||||
|
|
||||||
// Получаем детали выбранного узла, если он выбран
|
// Следим за изменением quickgroup в URL и обновляем selectedQuickGroup
|
||||||
const {
|
useEffect(() => {
|
||||||
data: unitDetailsData,
|
const quickgroupId = router.query.quickgroup as string;
|
||||||
loading: unitDetailsLoading,
|
if (quickgroupId) {
|
||||||
error: unitDetailsError
|
// Используем функциональное обновление состояния для избежания dependency
|
||||||
} = useQuery(
|
setSelectedQuickGroup((prev: any) => {
|
||||||
GET_LAXIMO_UNIT_DETAILS,
|
if (prev && prev.quickgroupid === quickgroupId) return prev;
|
||||||
{
|
return { quickgroupid: quickgroupId };
|
||||||
variables: selectedNode
|
});
|
||||||
? {
|
} else {
|
||||||
catalogCode: selectedNode.catalogCode || selectedNode.catalog || brand,
|
setSelectedQuickGroup(null);
|
||||||
vehicleId: selectedNode.vehicleId || vehicleId,
|
|
||||||
unitId: selectedNode.unitid || selectedNode.unitId,
|
|
||||||
ssd: selectedNode.ssd || finalSsd || '',
|
|
||||||
}
|
|
||||||
: { catalogCode: '', vehicleId: '', unitId: '', ssd: '' },
|
|
||||||
skip: !selectedNode,
|
|
||||||
errorPolicy: 'all',
|
|
||||||
}
|
}
|
||||||
);
|
}, [router.query.quickgroup]);
|
||||||
|
|
||||||
|
// Следить за изменением unitid в URL и обновлять selectedNode
|
||||||
|
useEffect(() => {
|
||||||
|
const unitid = router.query.unitid as string;
|
||||||
|
if (unitid) {
|
||||||
|
// Используем функциональное обновление состояния для избежания dependency
|
||||||
|
setSelectedNode((prev: any) => {
|
||||||
|
if (prev && (prev.unitid === unitid || prev.id === unitid)) return prev;
|
||||||
|
return { unitid };
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
setSelectedNode(null);
|
||||||
|
}
|
||||||
|
}, [router.query.unitid]);
|
||||||
|
|
||||||
|
const handleCategoryClick = (e?: React.MouseEvent) => {
|
||||||
|
if (e) e.preventDefault();
|
||||||
|
setShowKnot(true);
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const handler = (e: Event) => {
|
||||||
|
const target = e.target as HTMLElement;
|
||||||
|
if (target.classList.contains('link-2')) {
|
||||||
|
e.preventDefault();
|
||||||
|
setShowKnot(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
document.addEventListener('click', handler);
|
||||||
|
return () => document.removeEventListener('click', handler);
|
||||||
|
}, []);
|
||||||
|
// ====== КОНЕЦ ХУКОВ ======
|
||||||
|
|
||||||
|
|
||||||
const unitDetails = unitDetailsData?.laximoUnitDetails || [];
|
const unitDetails = unitDetailsData?.laximoUnitDetails || [];
|
||||||
|
|
||||||
// Логируем ошибки
|
// Логируем ошибки
|
||||||
@ -312,6 +342,12 @@ const VehicleDetailsPage = () => {
|
|||||||
// --- Синхронизация selectedQuickGroup с URL ---
|
// --- Синхронизация selectedQuickGroup с URL ---
|
||||||
// Функция для открытия VinQuick и добавления quickgroup в URL
|
// Функция для открытия VinQuick и добавления quickgroup в URL
|
||||||
const openQuickGroup = (group: any) => {
|
const openQuickGroup = (group: any) => {
|
||||||
|
// Проверяем что group не null и имеет quickgroupid
|
||||||
|
if (!group || !group.quickgroupid) {
|
||||||
|
console.warn('⚠️ openQuickGroup: получен null или группа без quickgroupid:', group);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
setSelectedQuickGroup(group);
|
setSelectedQuickGroup(group);
|
||||||
router.push(
|
router.push(
|
||||||
{ pathname: router.pathname, query: { ...router.query, quickgroup: group.quickgroupid } },
|
{ pathname: router.pathname, query: { ...router.query, quickgroup: group.quickgroupid } },
|
||||||
@ -329,24 +365,20 @@ const VehicleDetailsPage = () => {
|
|||||||
{ shallow: true }
|
{ shallow: true }
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
// Следим за изменением quickgroup в URL и обновляем selectedQuickGroup
|
|
||||||
useEffect(() => {
|
|
||||||
const quickgroupId = router.query.quickgroup as string;
|
|
||||||
if (quickgroupId) {
|
|
||||||
// Найти группу по id (в openedPath или где-то ещё)
|
|
||||||
// Для простоты: если есть selectedQuickGroup и id совпадает — ничего не делаем
|
|
||||||
if (selectedQuickGroup && selectedQuickGroup.quickgroupid === quickgroupId) return;
|
|
||||||
// Иначе ищем в openedPath или в категориях (можно доработать)
|
|
||||||
// Пока просто создаём объект-заглушку
|
|
||||||
setSelectedQuickGroup({ quickgroupid: quickgroupId });
|
|
||||||
} else {
|
|
||||||
setSelectedQuickGroup(null);
|
|
||||||
}
|
|
||||||
}, [router.query.quickgroup]);
|
|
||||||
|
|
||||||
// --- Синхронизация selectedNode (KnotIn) с URL ---
|
// --- Синхронизация selectedNode (KnotIn) с URL ---
|
||||||
// Открыть KnotIn и добавить unitid в URL
|
// Открыть KnotIn и добавить unitid в URL
|
||||||
const openKnot = (node: any) => {
|
const openKnot = (node: any) => {
|
||||||
|
// ОТЛАДКА: Логируем узел который получили
|
||||||
|
console.log('🔍 [vehicleId].tsx openKnot получил узел:', {
|
||||||
|
unitId: node.unitid,
|
||||||
|
unitName: node.name,
|
||||||
|
hasSsd: !!node.ssd,
|
||||||
|
nodeSsd: node.ssd ? `${node.ssd.substring(0, 50)}...` : 'отсутствует',
|
||||||
|
vehicleSsd: vehicleInfo.ssd ? `${vehicleInfo.ssd.substring(0, 50)}...` : 'отсутствует',
|
||||||
|
ssdLength: node.ssd?.length || 0
|
||||||
|
});
|
||||||
|
|
||||||
setSelectedNode(node);
|
setSelectedNode(node);
|
||||||
router.push(
|
router.push(
|
||||||
{ pathname: router.pathname, query: { ...router.query, unitid: node.unitid || node.id } },
|
{ pathname: router.pathname, query: { ...router.query, unitid: node.unitid || node.id } },
|
||||||
@ -364,17 +396,6 @@ const VehicleDetailsPage = () => {
|
|||||||
{ shallow: true }
|
{ shallow: true }
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
// Следить за изменением unitid в URL и обновлять selectedNode
|
|
||||||
useEffect(() => {
|
|
||||||
const unitid = router.query.unitid as string;
|
|
||||||
if (unitid) {
|
|
||||||
if (selectedNode && (selectedNode.unitid === unitid || selectedNode.id === unitid)) return;
|
|
||||||
// Можно доработать: искать node по unitid в категориях/группах
|
|
||||||
setSelectedNode({ unitid });
|
|
||||||
} else {
|
|
||||||
setSelectedNode(null);
|
|
||||||
}
|
|
||||||
}, [router.query.unitid]);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
@ -407,7 +428,22 @@ const VehicleDetailsPage = () => {
|
|||||||
setSearchState({ loading, error, query, isSearching: isSearching || false });
|
setSearchState({ loading, error, query, isSearching: isSearching || false });
|
||||||
}}
|
}}
|
||||||
onNodeSelect={openKnot}
|
onNodeSelect={openKnot}
|
||||||
onActiveTabChange={(tab) => setActiveTab(tab)}
|
onActiveTabChange={(tab) => {
|
||||||
|
setActiveTab(tab);
|
||||||
|
// Сбрасываем состояние при смене вкладки
|
||||||
|
setSelectedQuickGroup(null);
|
||||||
|
setSelectedNode(null);
|
||||||
|
setOpenedPath([]);
|
||||||
|
// Очищаем URL от параметров quickgroup и unitid
|
||||||
|
const { quickgroup, unitid, ...rest } = router.query;
|
||||||
|
if (quickgroup || unitid) {
|
||||||
|
router.push(
|
||||||
|
{ pathname: router.pathname, query: rest },
|
||||||
|
undefined,
|
||||||
|
{ shallow: true }
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}}
|
||||||
onQuickGroupSelect={openQuickGroup}
|
onQuickGroupSelect={openQuickGroup}
|
||||||
activeTab={activeTab}
|
activeTab={activeTab}
|
||||||
openedPath={openedPath}
|
openedPath={openedPath}
|
||||||
@ -512,7 +548,6 @@ const VehicleDetailsPage = () => {
|
|||||||
unitId={selectedNode.unitid}
|
unitId={selectedNode.unitid}
|
||||||
unitName={selectedNode.name}
|
unitName={selectedNode.name}
|
||||||
parts={unitDetails}
|
parts={unitDetails}
|
||||||
onBack={closeKnot}
|
|
||||||
/>
|
/>
|
||||||
{unitDetailsLoading ? (
|
{unitDetailsLoading ? (
|
||||||
<div style={{ padding: 24, textAlign: 'center' }}>Загружаем детали узла...</div>
|
<div style={{ padding: 24, textAlign: 'center' }}>Загружаем детали узла...</div>
|
||||||
|
Reference in New Issue
Block a user