"use client" import type React from "react" import { useState, useRef, useCallback, useEffect } from "react" import Image from "next/image" import { useTranslations } from "next-intl" interface ImageComparisonProps { locale?: string } export default function ImageComparison({ locale }: ImageComparisonProps) { const [sliderPosition, setSliderPosition] = useState(50) const [isDragging, setIsDragging] = useState(false) const [isLoaded, setIsLoaded] = useState(false) const containerRef = useRef(null) const animationFrameRef = useRef(null) const t = useTranslations("demo") const handleMouseDown = useCallback(() => { setIsDragging(true) }, []) const handleMouseUp = useCallback(() => { setIsDragging(false) }, []) const updateSliderPosition = useCallback((clientX: number) => { if (!containerRef.current) return const rect = containerRef.current.getBoundingClientRect() const x = clientX - rect.left const percentage = Math.max(0, Math.min(100, (x / rect.width) * 100)) // 使用 requestAnimationFrame 来优化性能 if (animationFrameRef.current) { cancelAnimationFrame(animationFrameRef.current) } animationFrameRef.current = requestAnimationFrame(() => { setSliderPosition(percentage) }) }, []) const handleMouseMove = useCallback( (e: React.MouseEvent) => { if (!isDragging) return e.preventDefault() updateSliderPosition(e.clientX) }, [isDragging, updateSliderPosition], ) const handleTouchMove = useCallback( (e: React.TouchEvent) => { if (!isDragging) return e.preventDefault() updateSliderPosition(e.touches[0].clientX) }, [isDragging, updateSliderPosition], ) // 清理动画帧 useEffect(() => { return () => { if (animationFrameRef.current) { cancelAnimationFrame(animationFrameRef.current) } } }, []) // 图片加载完成后设置状态 useEffect(() => { const timer = setTimeout(() => { setIsLoaded(true) }, 100) return () => clearTimeout(timer) }, []) return (
{/* Before Image */}
Original cityscape during daytime setIsLoaded(true)} sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw" />
Original
{/* After Image */}
AI-transformed cyberpunk cityscape at night
AI Enhanced
{/* Slider */}
{/* Loading overlay */} {!isLoaded && (
Loading...
)}
{/* Instructions */}
{t("sliderInstruction")}
) }