import { Swiper, SwiperSlide } from 'swiper/react'; import { Autoplay, Pagination, Navigation } from 'swiper/modules'; import { Link } from 'react-router-dom'; import type { EditorialCarouselSectionPayload } from '@homaroma/types'; import { useTranslation } from 'react-i18next'; import { getLocalizedField } from '../utils/localization'; // Import Swiper styles import 'swiper/css'; import 'swiper/css/pagination'; import 'swiper/css/navigation'; interface DynamicEditorialCarouselProps { payload: EditorialCarouselSectionPayload; } export default function DynamicEditorialCarousel({ payload }: DynamicEditorialCarouselProps) { const { i18n } = useTranslation(); const lang = i18n.language; const title = getLocalizedField(payload.title, lang); const slides = (payload.slides || []).map((slide) => ({ ...slide, title: getLocalizedField(slide.title, lang), description: getLocalizedField(slide.description, lang), buttonText: getLocalizedField(slide.buttonText, lang), category: getLocalizedField(slide.category, lang) })); if (slides.length === 0) return null; const renderTitle = (text: string) => { if (!text) return null; return text.split('[').map((part, i) => { if (part.includes(']')) { const [accent, rest] = part.split(']'); return ( {accent} {rest} ); } return {part}; }); }; const bgMap: Record = { bg: 'bg-pop-bg', black: 'bg-pop-black', pink: 'bg-pop-pink', yellow: 'bg-pop-yellow', orange: 'bg-pop-orange', red: 'bg-pop-red', cyan: 'bg-pop-cyan', green: 'bg-pop-green', purple: 'bg-pop-purple', }; const textMap: Record = { bg: 'text-pop-bg', black: 'text-pop-black', pink: 'text-pop-pink', yellow: 'text-pop-yellow', orange: 'text-pop-orange', red: 'text-pop-red', cyan: 'text-pop-cyan', green: 'text-pop-green', purple: 'text-pop-purple', }; const bgClass = payload.backgroundColor && bgMap[payload.backgroundColor] ? bgMap[payload.backgroundColor] : 'bg-pop-bg'; const textClass = payload.textColor && textMap[payload.textColor] ? textMap[payload.textColor] : 'text-pop-black'; const isSplitScreen = payload.layout === 'split_screen'; const imagePosition = payload.imagePosition || 'left'; return (

{renderTitle(title) || title}

{slides.map((slide, idx) => ( {isSplitScreen ? (
{slide.title} { (e.target as HTMLImageElement).style.display = 'none'; }} />
{slide.category}

{renderTitle(slide.title) || slide.title}

{slide.description}

{slide.buttonText && slide.buttonLink && (
{slide.buttonText} →
)}
) : (
{slide.title} { (e.target as HTMLImageElement).style.display = 'none'; }} />
{slide.category}

{renderTitle(slide.title) || slide.title}

{slide.description}

{slide.buttonText && slide.buttonLink && (
{slide.buttonText} →
)}
)}
))}
); }