import React, { useRef, useState, useCallback } from 'react'; import clsx from 'clsx'; import { Sparkles, Maximize2, Minimize2, Minus, X } from 'lucide-react'; import { useWindowStore, type WindowState } from '@/store/windowStore'; import { AiChatPanel } from './AiChatPanel'; import { useTranslation } from 'react-i18next'; interface WindowProps { window: WindowState; } export function Window({ window: win }: WindowProps) { const { t } = useTranslation(); const { closeWindow, minimizeWindow, toggleFullscreen, toggleAiChat, setActiveWindow, updateWindowPosition, } = useWindowStore(); const headerRef = useRef(null); const [isDragging, setIsDragging] = useState(false); const dragStart = useRef({ x: 0, y: 0, posX: 0, posY: 0 }); const ContentComponent = win.component; const handleMouseDown = useCallback( (e: React.MouseEvent) => { if (win.state === 'fullscreen') return; // Only drag from header, not from buttons if ((e.target as HTMLElement).closest('button')) return; setIsDragging(true); dragStart.current = { x: e.clientX, y: e.clientY, posX: win.position.x, posY: win.position.y, }; setActiveWindow(win.id); }, [win.id, win.state, win.position, setActiveWindow] ); React.useEffect(() => { if (!isDragging) return; const handleMouseMove = (e: MouseEvent) => { const dx = e.clientX - dragStart.current.x; const dy = e.clientY - dragStart.current.y; const newX = dragStart.current.posX + dx; const newY = Math.max(0, dragStart.current.posY + dy); updateWindowPosition(win.id, { x: newX, y: newY }); }; const handleMouseUp = () => setIsDragging(false); document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); return () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); }; }, [isDragging, win.id, updateWindowPosition]); if (win.state === 'minimized') return null; const isFullscreen = win.state === 'fullscreen'; const containerClass = clsx( 'fixed flex flex-col bg-white shadow-2xl rounded-lg overflow-hidden', isFullscreen ? 'inset-2 rounded-lg' : 'rounded-lg', isDragging && 'cursor-grabbing' ); const containerStyle: React.CSSProperties = isFullscreen ? { zIndex: win.zIndex } : { left: win.position.x, top: win.position.y, width: win.size.width, height: win.size.height, zIndex: win.zIndex, }; return (
setActiveWindow(win.id)} role="dialog" aria-label={win.title} > {/* Header */}
{win.title}
{/* AI Chat Toggle */} {/* Fullscreen Toggle */} {/* Minimize */} {/* Close */}
{/* Content Area */}
{/* Main Content */}
{/* AI Chat Panel */} {win.aiChatVisible && (
)}
); }