This commit is contained in:
54CHA
2025-07-29 18:55:22 +03:00
parent 1da9c6ac09
commit 72a9772934
19 changed files with 923 additions and 520 deletions

View File

@ -16,6 +16,7 @@ import MobileMenuBottomSection from '../components/MobileMenuBottomSection';
import { SEARCH_PRODUCT_OFFERS, GET_ANALOG_OFFERS } from "@/lib/graphql";
import { useArticleImage } from "@/hooks/useArticleImage";
import { usePartsIndexEntityInfo } from "@/hooks/usePartsIndex";
import { useCart } from "@/contexts/CartContext";
import MetaTags from "@/components/MetaTags";
import { createProductMeta } from "@/lib/meta-config";
@ -189,7 +190,28 @@ const getBestOffers = (offers: any[]) => {
// Убрано: функция сортировки теперь в CoreProductCard
const transformOffersForCard = (offers: any[]) => {
// Функция для проверки наличия товара на складе
const checkProductStock = (result: any): boolean => {
if (!result) return false;
// Используем новые данные stockCalculation если доступны
if (result.stockCalculation) {
return result.stockCalculation.hasAnyStock;
}
// Fallback к старой логике для обратной совместимости
const hasInternalStock = result.internalOffers?.some((offer: any) =>
offer.quantity > 0 && offer.available
);
const hasExternalStock = result.externalOffers?.some((offer: any) =>
offer.quantity > 0
);
return hasInternalStock || hasExternalStock;
};
const transformOffersForCard = (offers: any[], hasStock: boolean = true) => {
return offers.map(offer => {
const isExternal = offer.type === 'external';
const deliveryDays = isExternal ? offer.deliveryTime : offer.deliveryDays;
@ -207,6 +229,7 @@ const transformOffersForCard = (offers: any[]) => {
warehouse: offer.warehouse,
supplier: offer.supplier,
deliveryTime: deliveryDays,
hasStock, // Добавляем информацию о наличии
};
});
};
@ -214,6 +237,7 @@ const transformOffersForCard = (offers: any[]) => {
export default function SearchResult() {
const router = useRouter();
const { article, brand, q, artId } = router.query;
const { state: cartState } = useCart();
// Убрано: глобальная сортировка теперь не используется
const [showFiltersMobile, setShowFiltersMobile] = useState(false);
@ -241,10 +265,20 @@ export default function SearchResult() {
setVisibleAnalogsCount(ANALOGS_CHUNK_SIZE);
}, [article, brand]);
// Подготавливаем данные корзины для отправки на backend
const cartItems = cartState.items.map(item => ({
productId: item.productId,
offerKey: item.offerKey,
article: item.article || '',
brand: item.brand || '',
quantity: item.quantity
}));
const { data, loading, error } = useQuery(SEARCH_PRODUCT_OFFERS, {
variables: {
articleNumber: searchQuery,
brand: brandQuery || '' // Используем пустую строку если бренд не указан
brand: brandQuery || '', // Используем пустую строку если бренд не указан
cartItems: cartItems
},
skip: !searchQuery,
errorPolicy: 'all'
@ -668,8 +702,10 @@ export default function SearchResult() {
{/* Основной товар */}
<div className="w-layout-vflex flex-block-14-copy">
{hasOffers && result && (() => {
const hasMainProductStock = checkProductStock(result);
const mainProductOffers = transformOffersForCard(
filteredOffers.filter(o => !o.isAnalog)
filteredOffers.filter(o => !o.isAnalog),
hasMainProductStock
);
// Не показываем основной товар, если у него нет предложений
@ -690,6 +726,7 @@ export default function SearchResult() {
offers={mainProductOffers}
showMoreText={mainProductOffers.length < filteredOffers.filter(o => !o.isAnalog).length ? "Показать еще" : undefined}
partsIndexPowered={!!partsIndexImage}
hasStock={hasMainProductStock}
/>
</>
);
@ -795,9 +832,11 @@ export default function SearchResult() {
return true;
});
return transformOffersForCard(filteredAnalogOffers);
return transformOffersForCard(filteredAnalogOffers, checkProductStock(loadedAnalogData));
})() : [];
const hasAnalogStock = loadedAnalogData ? checkProductStock(loadedAnalogData) : true;
return (
<CoreProductCard
key={analogKey}
@ -807,6 +846,7 @@ export default function SearchResult() {
offers={analogOffers}
isAnalog
isLoadingOffers={!loadedAnalogData}
hasStock={hasAnalogStock}
/>
)
})}