"use client"; import React, { useState, useEffect, useMemo } from 'react'; import Link from 'next/link'; import { ProductCard } from '../components/ProductCard'; import { ArrowRight } from 'lucide-react'; import { Swiper, SwiperSlide } from 'swiper/react'; import { Autoplay, Pagination, A11y } from 'swiper/modules'; import { Product } from '../types'; import { getImageUrl } from '../lib/utils'; import { getSectionMeta, getSectionTitle } from '../lib/homepageDefaults'; import 'swiper/css'; import 'swiper/css/pagination'; const DEFAULT_BANNER_IMAGE = 'https://images.unsplash.com/photo-1585790050230-5dd28404ccb9?w=600&auto=format&fit=crop&q=80'; const BANNER_BG = ['#F8EDE6', '#E8F1F8', '#F3EDE8', '#EEF6EC']; type BannerSlide = { id: string; title: string; subtitle: string; image: string; link: string; cta: string; bg: string; }; interface UltimateTechSectionProps { config?: any; products?: Product[]; loading?: boolean; error?: boolean; } function buildBannerSlides(meta: Record): BannerSlide[] { const raw = Array.isArray(meta.banners) ? meta.banners : []; const fromList = raw .filter((b: any) => b && (b.title || b.image || b.image_url)) .map((b: any, idx: number) => ({ id: String(b.id || `banner-${idx + 1}`), title: String(b.title || 'Featured'), subtitle: String(b.subtitle || b.description || 'Smooth in Performance'), image: getImageUrl(b.image || b.image_url) || DEFAULT_BANNER_IMAGE, link: String( b.buttonUrl || b.button_url || b.link || b.href || '/shop' ), cta: String(b.buttonText || b.button_text || b.cta || 'Shop Now'), bg: String(b.bgColor || b.bg || BANNER_BG[idx % BANNER_BG.length]), })); if (fromList.length > 0) return fromList; // Legacy single-banner fields if (meta.banner_title || meta.banner_image) { return [ { id: 'banner-legacy', title: String(meta.banner_title || 'Active Laptop'), subtitle: String(meta.banner_subtitle || 'Smooth in Performance'), image: getImageUrl(meta.banner_image) || DEFAULT_BANNER_IMAGE, link: String(meta.banner_link || '/shop'), cta: String(meta.banner_cta || 'Shop Now'), bg: BANNER_BG[0], }, ]; } return [ { id: 'banner-default', title: 'Smart Watches', subtitle: 'Smooth in Performance', image: DEFAULT_BANNER_IMAGE, link: '/shop?category=smart-watches', cta: 'Shop Now', bg: BANNER_BG[0], }, ]; } /** Full-card promo tile (slides as one unit — not content inside a frame). */ function BannerCard({ slide }: { slide: BannerSlide }) { return (

{slide.title}

{slide.subtitle ? (

{slide.subtitle}

) : (
)} {slide.cta}
{/* eslint-disable-next-line @next/next/no-img-element */} {slide.title}
); } export const UltimateTechSection: React.FC = ({ config, products, error, }) => { const [techGadgets, setTechGadgets] = useState([]); const meta = getSectionMeta(config); const banners = useMemo(() => buildBannerSlides(meta), [config]); useEffect(() => { const pinnedSlugs: string[] = meta.pinned_product_slugs || []; if (pinnedSlugs.length > 0 && products && products.length > 0) { const pinned = pinnedSlugs .map((slug) => products.find((p) => p.slug === slug || p.id === slug)) .filter(Boolean) as Product[]; if (pinned.length > 0) { setTechGadgets(pinned.slice(0, 4)); return; } } const rawItems = meta.items; if (rawItems && rawItems.length > 0) { setTechGadgets( rawItems.slice(0, 4).map((it: any) => ({ id: it.id || String(Math.random()), name: it.title || it.name, price: it.price || 0, oldPrice: it.oldPrice || it.originalPrice, discount: it.discount, image: getImageUrl(it.image), rating: it.rating || 5.0, reviewsCount: it.reviewsCount || 8, category: 'Tech Gadgets', brand: 'SmartTech', slug: it.slug || it.id, })) ); } else if (products && products.length > 0) { const gadgets = products.filter((p) => p.isTechGadget); setTechGadgets( (gadgets.length > 0 ? gadgets : products).slice(0, 4) ); } else { setTechGadgets([]); } }, [config, products, error]); const title = getSectionTitle(config, 'ultimate_tech'); const multiBanner = banners.length > 1; if (techGadgets.length === 0) { return (

{title}

Tech gadgets will appear here once products are available.
); } return (

{title}

View All
{techGadgets.map((product, idx) => (
))}
{/* Side banners: whole-card slide when more than one */}
{multiBanner ? ( {banners.map((slide) => ( ))} ) : ( )}