"use client"; import { FC, ReactNode, useRef, useState, useCallback, useEffect } from "react"; import { FaChevronLeft, FaChevronRight } from "react-icons/fa"; type CarouselOptions = { itemsPerView?: number; itemsPerViewMobile?: number; itemsPerViewTablet?: number; }; type Props = { children: ReactNode[]; options?: CarouselOptions; className?: string; heading?: string; icon?: ReactNode; colors?: keyof typeof colorsMap; fluid?: boolean; }; export const Carousel: FC = ({ children, options = {}, className = "", heading, icon, colors = "yellow", fluid = false, }) => { const { itemsPerView = 4, itemsPerViewMobile = 1, itemsPerViewTablet = 2, } = options; const [perView, setPerView] = useState(itemsPerView); const [currentPage, setCurrentPage] = useState(0); const totalPages = Math.ceil(children.length / perView); useEffect(() => { const handleResize = () => { if (window.matchMedia("(min-width: 1024px)").matches) { setPerView(itemsPerView); } else if (window.matchMedia("(min-width: 768px)").matches) { setPerView(itemsPerViewTablet); } else { setPerView(itemsPerViewMobile); } }; handleResize(); window.addEventListener("resize", handleResize); return () => window.removeEventListener("resize", handleResize); }, []); const nextPage = () => { setCurrentPage((prev) => (prev + 1) % totalPages); }; const prevPage = () => { setCurrentPage((prev) => (prev - 1 + totalPages) % totalPages); }; const currentMovies = children.slice( currentPage * perView, (currentPage + 1) * perView ); return (
{heading && (
{icon && (
{icon}
)}

{heading}

)} {totalPages > 1 && (
)}
{currentMovies}
{totalPages > 1 && (
{Array.from({ length: totalPages }, (_, i) => (
)}
); }; const colorsMap = { yellow: "bg-gradient-to-r from-yellow-400 to-orange-400", blue: "bg-gradient-to-r from-blue-400 to-purple-400", green: "bg-gradient-to-r from-green-400 to-teal-400", red: "bg-gradient-to-r from-red-400 to-pink-400", purple: "bg-gradient-to-r from-purple-400 to-pink-400", orange: "bg-gradient-to-r from-orange-400 to-yellow-400", pink: "bg-gradient-to-r from-pink-400 to-purple-400", teal: "bg-gradient-to-r from-teal-400 to-green-400", gray: "bg-gradient-to-r from-gray-400 to-gray-400", };