import React, { type PropsWithChildren, useState } from "react"; import Button from "./ui/Button"; import { useSwipeable } from "react-swipeable"; import { motion } from "motion/react"; import clsx from "clsx"; interface SliderItemProps { text: string; } function flattenChildren(children: React.ReactNode): React.ReactElement[] { const result: React.ReactElement[] = []; React.Children.forEach(children, (child) => { if (React.isValidElement(child)) { if (child.type === React.Fragment) { result.push( ...flattenChildren( (child.props as { children?: React.ReactNode }).children ) ); } else { result.push(child); } } }); return result; } function NewUnitSlider({ children }: PropsWithChildren) { const [currentSlide, setCurrentSlide] = useState(0); const flattenedChildren = flattenChildren(children); const slides = flattenedChildren.map((element, index) => { if ( React.isValidElement>(element) && element.props.text ) { return { index, element, text: element.props.text, child: element.props.children, }; } return { index, text: `Slide ${index + 1}`, element, }; }); const handlers = useSwipeable({ onSwipedLeft: () => { const slideText = slides[currentSlide]?.text; if (slideText !== "Interior") { setCurrentSlide(Math.min(currentSlide + 1, slides.length - 1)); } }, onSwipedRight: () => setCurrentSlide(Math.max(currentSlide - 1, 0)), preventScrollOnSwipe: true, touchEventOptions: { passive: false, }, trackMouse: true, }); return (
{slides.map((slide) => slide.element)}
{slides.map((slide, index) => ( ))}
{slides.map((_, index) => (
))}
); } export default NewUnitSlider;