import React, { useState, useRef, useEffect } from 'react'; import { MessageCircle, X, GripHorizontal } from 'lucide-react'; import ChatMessage from './ChatMessage'; import ChatInput from './ChatInput'; import useScreenSize from '../../hooks/useScreenSize'; import { useWebSocketContext } from '../../contexts/WebSocketContext'; import { api } from '../../services/api'; interface ChatWindowProps { className?: string; } const ChatWindow: React.FC = ({ className = '' }) => { const screenSize = useScreenSize(); const [chatOpen, setChatOpen] = useState(false); const [chatHeight, setChatHeight] = useState(400); const [chatWidth, setChatWidth] = useState(360); const [isDragging, setIsDragging] = useState(false); const [isLoading, setIsLoading] = useState(false); const messagesEndRef = useRef(null); const startHeightRef = useRef(0); const startWidthRef = useRef(0); const startPosRef = useRef<{ x: number, y: number }>({ x: 0, y: 0 }); const { messages = [], isConnected } = useWebSocketContext(); useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]); const handleResizeStart = (e: React.MouseEvent) => { e.preventDefault(); setIsDragging(true); startHeightRef.current = chatHeight; startWidthRef.current = chatWidth; startPosRef.current = { x: e.clientX, y: e.clientY }; }; useEffect(() => { const handleMouseMove = (e: MouseEvent) => { if (!isDragging) return; const deltaY = startPosRef.current.y - e.clientY; const deltaX = startPosRef.current.x - e.clientX; const newHeight = Math.max(300, startHeightRef.current + deltaY); const newWidth = Math.max(300, startWidthRef.current + deltaX); setChatHeight(newHeight); setChatWidth(newWidth); }; const handleMouseUp = () => { setIsDragging(false); }; if (isDragging) { document.addEventListener('mousemove', handleMouseMove); document.addEventListener('mouseup', handleMouseUp); } return () => { document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', handleMouseUp); }; }, [isDragging]); const handleSendMessage = async (content: string) => { try { setIsLoading(true); await api.addChatMessage({ message: content }); } catch (error) { console.error('Failed to send message:', error); } finally { setIsLoading(false); } }; const handleDeleteMessage = async (id: string) => { try { await api.deleteChatMessage(id); } catch (error) { console.error('Failed to delete message:', error); } }; if (screenSize === 'mobile') { return (

Chat

{messages.length === 0 ? (

No messages yet

) : ( messages.map((message) => ( )) )}
); } return ( <> {!chatOpen && ( )} {chatOpen && (

Chat

{messages.length === 0 ? (

No messages yet

) : ( messages.map((message) => ( )) )}
)} ); }; export default ChatWindow;