Добавлено получение баннеров для главного слайдера с использованием GraphQL. Обновлен компонент HeroSlider для отображения активных баннеров с сортировкой. Реализована логика отображения дефолтного баннера при отсутствии данных. Обновлены стили и структура компонента для улучшения пользовательского интерфейса.

This commit is contained in:
Bivekich
2025-07-15 09:03:32 +03:00
parent 9c152501db
commit 3e98f8fed6
19 changed files with 1109 additions and 342 deletions

View File

@ -21,11 +21,23 @@ import { createProductMeta } from "@/lib/meta-config";
const ANALOGS_CHUNK_SIZE = 5;
const sortOptions = [
"По цене",
"По рейтингу",
"По количеству"
];
// Функция для расчета даты доставки
const calculateDeliveryDate = (deliveryDays: number): string => {
const today = new Date();
const deliveryDate = new Date(today);
deliveryDate.setDate(today.getDate() + deliveryDays);
const months = [
'января', 'февраля', 'марта', 'апреля', 'мая', 'июня',
'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'
];
const day = deliveryDate.getDate();
const month = months[deliveryDate.getMonth()];
const year = deliveryDate.getFullYear();
return `${day} ${month} ${year}`;
};
// Функция для создания динамических фильтров
const createFilters = (result: any, loadedAnalogs: any): FilterConfig[] => {
@ -175,15 +187,18 @@ const getBestOffers = (offers: any[]) => {
return result;
};
// Убрано: функция сортировки теперь в CoreProductCard
const transformOffersForCard = (offers: any[]) => {
return offers.map(offer => {
const isExternal = offer.type === 'external';
const deliveryDays = isExternal ? offer.deliveryTime : offer.deliveryDays;
return {
id: offer.id,
productId: offer.productId,
offerKey: offer.offerKey,
pcs: `${offer.quantity} шт.`,
days: `${isExternal ? offer.deliveryTime : offer.deliveryDays} дн.`,
days: deliveryDays ? calculateDeliveryDate(deliveryDays) : 'Уточняйте',
recommended: !isExternal && offer.available,
price: `${offer.price.toLocaleString('ru-RU')}`,
count: "1",
@ -191,7 +206,7 @@ const transformOffersForCard = (offers: any[]) => {
currency: offer.currency || "RUB",
warehouse: offer.warehouse,
supplier: offer.supplier,
deliveryTime: isExternal ? offer.deliveryTime : offer.deliveryDays,
deliveryTime: deliveryDays,
};
});
};
@ -200,7 +215,7 @@ export default function SearchResult() {
const router = useRouter();
const { article, brand, q, artId } = router.query;
const [sortActive, setSortActive] = useState(0);
// Убрано: глобальная сортировка теперь не используется
const [showFiltersMobile, setShowFiltersMobile] = useState(false);
const [showSortMobile, setShowSortMobile] = useState(false);
const [searchQuery, setSearchQuery] = useState<string>("");
@ -542,7 +557,7 @@ export default function SearchResult() {
<section className="main mobile-only">
<div className="w-layout-blockcontainer container w-container">
<div className="w-layout-hflex flex-block-84">
{/* <CatalogSortDropdown active={sortActive} onChange={setSortActive} /> */}
{/* Глобальная сортировка убрана - теперь каждый товар сортируется индивидуально */}
<div className="w-layout-hflex flex-block-85" onClick={() => setShowFiltersMobile((v) => !v)}>
<span className="code-embed-9 w-embed">
<svg width="currentwidth" height="currentheight" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
@ -584,7 +599,7 @@ export default function SearchResult() {
title={`${offer.brand} ${offer.articleNumber}${offer.isAnalog ? ' (аналог)' : ''}`}
description={offer.name}
price={`${offer.price.toLocaleString()}`}
delivery={`${offer.deliveryDuration} ${offer.deliveryDuration === 1 ? 'день' : 'дней'}`}
delivery={offer.deliveryDuration ? calculateDeliveryDate(offer.deliveryDuration) : 'Уточняйте'}
stock={`${offer.quantity} шт.`}
offer={offer}
/>