import React, { memo, UIEvent, useEffect, useState } from "react"; import { Caret } from "../Icon"; import { updateClassInReactElement } from "./Slider.utils"; interface SliderThumbnailProps { autoPlay: boolean; showThumbnails: boolean; thumbnailWidth: number; unit: "rem" | "px"; thumbnailElement: React.MutableRefObject; thumbnailGap: number; childrenArray: (React.ReactChild | React.ReactFragment | React.ReactPortal)[]; sliderHeight: number; moveToSelectedIndex: (index: number) => void; currentIndex: number; showPageIndicator: boolean; showThumbnailCaret: boolean; } const SliderThumbnail: React.FC = ({ thumbnailWidth, unit, thumbnailElement, thumbnailGap, childrenArray, sliderHeight, moveToSelectedIndex, currentIndex, showPageIndicator, showThumbnailCaret, }) => { const SCROLL_BUMPER_WIDTH_PX = 20; const [showThumbnailUpCaret, setShowThumbnailUpCaret] = useState( false ); const [showThumbnailDownCaret, setShowThumbnailDownCaret] = useState( false ); useEffect(() => { if (showThumbnailCaret && thumbnailElement.current) { const currentThumbnailElement = thumbnailElement.current as HTMLElement; setShowThumbnailDownCaret( currentThumbnailElement.offsetHeight < currentThumbnailElement.scrollHeight ); } }, [showThumbnailCaret, thumbnailElement]); const handleScroll = (caretType: "up" | "down", show: boolean) => { if (showThumbnailCaret) { if (caretType === "up") { setShowThumbnailUpCaret(show); } else { setShowThumbnailDownCaret(show); } } }; let thumbnailDivHeight = sliderHeight; if (showThumbnailUpCaret) { thumbnailDivHeight -= 2; } if (showThumbnailDownCaret) { thumbnailDivHeight -= 2; } return ( <> {showThumbnailUpCaret && (
)} {showThumbnailDownCaret && (
)}
) => { const thumbnailDivElement = event.target as HTMLElement; const scrollTop = thumbnailDivElement.scrollTop; const scrollHeight = thumbnailDivElement.scrollHeight; const offsetHeight = thumbnailDivElement.offsetHeight; handleScroll("up", scrollTop > SCROLL_BUMPER_WIDTH_PX); handleScroll( "down", scrollTop + offsetHeight < scrollHeight - SCROLL_BUMPER_WIDTH_PX ); }} >
{childrenArray.map((child, index) => { const clonedChild = updateClassInReactElement({ child, removalClassList: ["w-", "h-"], additionalClass: "w-full h-full rounded", }); return (
moveToSelectedIndex(index)} className={`border border-solid rounded cursor-pointer ${ currentIndex === index ? " border-black" : "border-gray-3" }`} style={{ width: `${thumbnailWidth}${unit}`, height: `${thumbnailWidth}${unit}`, }} > {clonedChild}
); })}
); }; export default memo(SliderThumbnail);