import React, { useRef } from "react"; import { useQuery } from '@apollo/client'; import ArticleCard from "../ArticleCard"; import CatalogProductCardSkeleton from "../CatalogProductCardSkeleton"; import { GET_NEW_ARRIVALS } from "@/lib/graphql"; import { PartsAPIArticle } from "@/types/partsapi"; const SCROLL_AMOUNT = 340; // px, ширина одной карточки + отступ // Интерфейс для товара из GraphQL interface Product { id: string; name: string; slug: string; article?: string; brand?: string; retailPrice?: number; wholesalePrice?: number; createdAt: string; images: Array<{ id: string; url: string; alt?: string; order: number; }>; categories: Array<{ id: string; name: string; slug: string; }>; } // Функция для преобразования Product в PartsAPIArticle const transformProductToArticle = (product: Product, index: number): PartsAPIArticle => { return { artId: product.id, artArticleNr: product.article || `PROD-${product.id}`, artSupBrand: product.brand || 'Unknown Brand', supBrand: product.brand || 'Unknown Brand', supId: index + 1, productGroup: product.categories?.[0]?.name || product.name, ptId: index + 1, }; }; const NewArrivalsSection: React.FC = () => { const scrollRef = useRef(null); // Получаем новые поступления через GraphQL const { data, loading, error } = useQuery(GET_NEW_ARRIVALS, { variables: { limit: 8 } }); const scrollLeft = () => { if (scrollRef.current) { scrollRef.current.scrollBy({ left: -SCROLL_AMOUNT, behavior: 'smooth' }); } }; const scrollRight = () => { if (scrollRef.current) { scrollRef.current.scrollBy({ left: SCROLL_AMOUNT, behavior: 'smooth' }); } }; // Преобразуем данные для ArticleCard const newArrivalsArticles = data?.newArrivals?.map((product: Product, index: number) => transformProductToArticle(product, index) ) || []; // Получаем изображения для товаров const getProductImage = (product: Product): string => { if (product.images && product.images.length > 0) { return product.images[0].url; } return "/images/162615.webp"; // fallback изображение }; return (

Новое поступление

{loading ? ( // Показываем скелетоны во время загрузки Array(8).fill(0).map((_, index) => ( )) ) : error ? ( // Показываем сообщение об ошибке

Не удалось загрузить новые поступления

{error.message}

) : newArrivalsArticles.length > 0 ? ( // Показываем товары newArrivalsArticles.map((article: PartsAPIArticle, index: number) => { const product = data.newArrivals[index]; const image = getProductImage(product); return ( ); }) ) : ( // Показываем сообщение о том, что товаров нет

Пока нет новых поступлений

)}
); }; export default NewArrivalsSection;