'use client'; import { useState, useRef, useEffect } from 'react'; import Image from 'next/image'; import { useIsMobile } from '@/hooks/use-mobile'; export default function DraggableWindow() { const isMobile = useIsMobile(); const [isVisible, setIsVisible] = useState(true); const [position, setPosition] = useState({ x: 100, y: 100 }); const [isDragging, setIsDragging] = useState(false); const [dragOffset, setDragOffset] = useState({ x: 0, y: 0 }); const [isNadaeVisible, setIsNadaeVisible] = useState(false); const windowRef = useRef(null); const audioRef = useRef(null); const nadaeTimeoutRef = useRef | null>(null); const handleMouseDown = (e: React.MouseEvent) => { setIsDragging(true); if (windowRef.current) { const rect = windowRef.current.getBoundingClientRect(); setDragOffset({ x: e.clientX - rect.left, y: e.clientY - rect.top, }); } }; const handleActivate = () => { if (!audioRef.current) { audioRef.current = new Audio('/audio.opus'); } audioRef.current.currentTime = 0; void audioRef.current.play(); setIsNadaeVisible(true); if (nadaeTimeoutRef.current) { clearTimeout(nadaeTimeoutRef.current); } nadaeTimeoutRef.current = setTimeout(() => { setIsNadaeVisible(false); nadaeTimeoutRef.current = null; }, 1000); }; useEffect(() => { const handleMouseMove = (e: MouseEvent) => { if (!isDragging) return; setPosition({ x: e.clientX - dragOffset.x, y: e.clientY - dragOffset.y, }); }; const handleMouseUp = () => { setIsDragging(false); }; if (isDragging) { document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); } return () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); }; }, [isDragging, dragOffset]); useEffect(() => { return () => { audioRef.current?.pause(); audioRef.current = null; if (nadaeTimeoutRef.current) { clearTimeout(nadaeTimeoutRef.current); } }; }, []); return ( isMobile ? (
) : ( isVisible && (
Draggable Window
) ) ); }