"use client"; import cx from "classnames"; import type { RefCallback } from "react"; import React, { useMemo } from "react"; import { useStatic } from "../../utils/hooks"; import { Accordion } from "../Accordion/Accordion"; import { Image } from "../Image"; import FeatureAccordionStatic from "./FeatureAccordion.static"; const CLASS_ROOT = "feature-accordion"; export interface FeatureAccordionImageSrc { src: string; srcSet?: string; } export interface FeatureAccordionImageResponsive { default: string; sm?: string; md?: string; lg?: string; xl?: string; xxl?: string; [key: string]: string | undefined; } export type FeatureAccordionImage = | FeatureAccordionImageSrc | FeatureAccordionImageResponsive; interface AccordionProps { /** Additional CSS classes */ className?: string; /** Additional CSS classes for preview area */ previewClassName?: string; } const getImageData = (props: Record) => ({ id: props.id, imageSrc: props.image || props.imageUrl, imageAlt: props.imageAlt, imageSrcSet: props.imageSrcSet, }); const FeatureAccordion = ( props: AccordionProps & { children: React.ReactNode }, ) => { const { className, previewClassName, children, ...other } = props; const [featureAccordionRef] = useStatic(FeatureAccordionStatic); const classes = cx(CLASS_ROOT, className); const childrenArray = useMemo( () => React.Children.toArray(children) as React.ReactElement[], [children], ); // Extract image data once to avoid duplication const childrenWithImageData = useMemo( () => childrenArray.map((child) => ({ child, ...getImageData(child.props) })), [childrenArray], ); return (
} {...other} >
{childrenWithImageData.map(({ child, imageSrc }) => { if (!imageSrc) return null; return child; })}
{childrenWithImageData.map( ({ id, imageSrc, imageAlt, imageSrcSet }, index) => { if (!imageSrc) return null; return ( {imageAlt} ); }, )}
); }; export { FeatureAccordion };