Spaces:
Build error
Build error
import React from "react"; | |
import { ChevronLeft } from "#/assets/chevron-left"; | |
import { ChevronRight } from "#/assets/chevron-right"; | |
import { ImagePreview } from "./image-preview"; | |
import { cn } from "#/utils/utils"; | |
interface ImageCarouselProps { | |
size: "small" | "large"; | |
images: string[]; | |
onRemove?: (index: number) => void; | |
} | |
export function ImageCarousel({ | |
size = "small", | |
images, | |
onRemove, | |
}: ImageCarouselProps) { | |
const scrollContainerRef = React.useRef<HTMLDivElement>(null); | |
const [isScrollable, setIsScrollable] = React.useState(false); | |
const [isAtStart, setIsAtStart] = React.useState(true); | |
const [isAtEnd, setIsAtEnd] = React.useState(false); | |
React.useEffect(() => { | |
const scrollContainer = scrollContainerRef.current; | |
if (scrollContainer) { | |
const hasScroll = | |
scrollContainer.scrollWidth > scrollContainer.clientWidth; | |
setIsScrollable(hasScroll); | |
} | |
}, [images]); | |
const handleScroll = (event: React.UIEvent<HTMLDivElement>) => { | |
const scrollContainer = event.currentTarget; | |
setIsAtStart(scrollContainer.scrollLeft === 0); | |
setIsAtEnd( | |
scrollContainer.scrollLeft + scrollContainer.clientWidth === | |
scrollContainer.scrollWidth, | |
); | |
}; | |
return ( | |
<div data-testid="image-carousel" className="relative"> | |
{isScrollable && ( | |
<div className="absolute right-full transform top-1/2 -translate-y-1/2"> | |
<ChevronLeft active={!isAtStart} /> | |
</div> | |
)} | |
<div | |
ref={scrollContainerRef} | |
onScroll={handleScroll} | |
className={cn( | |
"flex overflow-x-auto", | |
size === "small" && "gap-2", | |
size === "large" && "gap-4", | |
)} | |
> | |
{images.map((src, index) => ( | |
<ImagePreview | |
key={index} | |
size={size} | |
src={src} | |
onRemove={onRemove && (() => onRemove(index))} | |
/> | |
))} | |
</div> | |
{isScrollable && ( | |
<div className="absolute left-full transform top-1/2 -translate-y-1/2"> | |
<ChevronRight active={!isAtEnd} /> | |
</div> | |
)} | |
</div> | |
); | |
} | |