// @ts-nocheck 'use client'; import { IconDotsVertical } from '@tabler/icons-react'; import { AnimatePresence, motion } from 'framer-motion'; import React, { useCallback, useEffect, useRef, useState } from 'react'; import { cn } from '../../lib/utils'; import { SparklesCore } from './sparkles'; 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);