/* eslint-disable @typescript-eslint/no-unused-vars */ "use client"; import React, { useState, useEffect, useRef, useCallback } from "react"; import { SparklesCore } from "@/components/ui/sparkles"; import { AnimatePresence, motion } from "framer-motion"; import { cn } from "@/lib/utils"; import { IconDotsVertical } from "@tabler/icons-react"; import Image from "next/image"; interface CompareProps { firstImage?: string; secondImage?: string; className?: string; firstImageClassName?: string; secondImageClassname?: string; initialSliderPercentage?: number; slideMode?: "hover" | "drag"; showHandlebar?: boolean; autoplay?: boolean; autoplayDuration?: number; } export const Compare = ({ firstImage = "", secondImage = "", className, firstImageClassName, secondImageClassname, initialSliderPercentage = 50, slideMode = "hover", showHandlebar = true, autoplay = false, autoplayDuration = 5000, }: CompareProps) => { const [sliderXPercent, setSliderXPercent] = useState(initialSliderPercentage); const [isDragging, setIsDragging] = useState(false); const sliderRef = useRef(null); const [isMouseOver, setIsMouseOver] = useState(false); const autoplayRef = useRef(null); const startAutoplay = useCallback(() => { if (!autoplay) return; const startTime = Date.now(); const animate = () => { const elapsedTime = Date.now() - startTime; const progress = (elapsedTime % (autoplayDuration * 2)) / autoplayDuration; const percentage = progress <= 1 ? progress * 100 : (2 - progress) * 100; setSliderXPercent(percentage); autoplayRef.current = setTimeout(animate, 16); // ~60fps }; animate(); }, [autoplay, autoplayDuration]); const stopAutoplay = useCallback(() => { if (autoplayRef.current) { clearTimeout(autoplayRef.current); autoplayRef.current = null; } }, []); useEffect(() => { startAutoplay(); return () => stopAutoplay(); }, [startAutoplay, stopAutoplay]); function mouseEnterHandler() { setIsMouseOver(true); stopAutoplay(); } function mouseLeaveHandler() { setIsMouseOver(false); if (slideMode === "hover") { setSliderXPercent(initialSliderPercentage); } if (slideMode === "drag") { setIsDragging(false); } startAutoplay(); } const handleStart = useCallback( (clientX: number) => { if (slideMode === "drag") { setIsDragging(true); } }, [slideMode] ); const handleEnd = useCallback(() => { if (slideMode === "drag") { setIsDragging(false); } }, [slideMode]); const handleMove = useCallback( (clientX: number) => { if (!sliderRef.current) return; if (slideMode === "hover" || (slideMode === "drag" && isDragging)) { const rect = sliderRef.current.getBoundingClientRect(); const x = clientX - rect.left; const percent = (x / rect.width) * 100; requestAnimationFrame(() => { setSliderXPercent(Math.max(0, Math.min(100, percent))); }); } }, [slideMode, isDragging] ); const handleMouseDown = useCallback( (e: React.MouseEvent) => handleStart(e.clientX), [handleStart] ); const handleMouseUp = useCallback(() => handleEnd(), [handleEnd]); const handleMouseMove = useCallback( (e: React.MouseEvent) => handleMove(e.clientX), [handleMove] ); const handleTouchStart = useCallback( (e: React.TouchEvent) => { if (!autoplay) { handleStart(e.touches[0].clientX); } }, [handleStart, autoplay] ); const handleTouchEnd = useCallback(() => { if (!autoplay) { handleEnd(); } }, [handleEnd, autoplay]); const handleTouchMove = useCallback( (e: React.TouchEvent) => { if (!autoplay) { handleMove(e.touches[0].clientX); } }, [handleMove, autoplay] ); return (
{showHandlebar && (
)}
{firstImage ? ( first image ) : null}
{secondImage ? ( ) : null}
); }; const MemoizedSparklesCore = React.memo(SparklesCore);