import React, { Suspense, useRef, useState } from 'react'; import type { Feature } from '../../types.ts'; import { FEATURES_MAP } from '../features/index.ts'; import { LoadingIndicator } from '../../App.tsx'; import { MinimizeIcon, XMarkIcon } from '../icons/InterfaceIcons.tsx'; interface WindowState { id: string; position: { x: number; y: number }; size: { width: number; height: number }; zIndex: number; isMinimized: boolean; } interface WindowProps { feature: Feature; state: WindowState; isActive: boolean; onClose: (id: string) => void; onMinimize: (id: string) => void; onFocus: (id: string) => void; onUpdate: (id: string, updates: Partial) => void; } export const Window: React.FC = ({ feature, state, isActive, onClose, onMinimize, onFocus, onUpdate }) => { const dragStartPos = useRef<{ x: number; y: number } | null>(null); const initialPos = useRef<{ x: number; y: number } | null>(null); const FeatureComponent = FEATURES_MAP.get(feature.id)?.component; const handleDragStart = (e: React.MouseEvent) => { e.preventDefault(); onFocus(feature.id); dragStartPos.current = { x: e.clientX, y: e.clientY }; initialPos.current = { x: state.position.x, y: state.position.y }; window.addEventListener('mousemove', handleDragMove); window.addEventListener('mouseup', handleDragEnd); }; const handleDragMove = (e: MouseEvent) => { if (!dragStartPos.current || !initialPos.current) return; const dx = e.clientX - dragStartPos.current.x; const dy = e.clientY - dragStartPos.current.y; onUpdate(feature.id, { position: { x: initialPos.current.x + dx, y: initialPos.current.y + dy }}); }; const handleDragEnd = () => { dragStartPos.current = null; initialPos.current = null; window.removeEventListener('mousemove', handleDragMove); window.removeEventListener('mouseup', handleDragEnd); }; return (
onFocus(feature.id)} >
{feature.icon}
{feature.name}
{FeatureComponent ? ( }> ) : (
Error: Component not found for {feature.name}
)}
); };