parvki
This commit is contained in:
@ -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}
|
||||
/>
|
||||
)
|
||||
})}
|
||||
|
Reference in New Issue
Block a user