import React, { useState, useRef, useEffect } from 'react'; import axios from 'axios'; import API_BASE_URL from '../apiConfig'; export const ChatBot = ({ isOpen, onClose }) => { const [messages, setMessages] = useState([]); const [input, setInput] = useState(''); const [isLoading, setIsLoading] = useState(false); const messagesEndRef = useRef(null); // Dragging state const [position, setPosition] = useState({ x: typeof window !== 'undefined' ? window.innerWidth - 400 : 0, y: typeof window !== 'undefined' ? window.innerHeight - 650 : 0 }); const [isDragging, setIsDragging] = useState(false); const dragRef = useRef({ startX: 0, startY: 0, initialX: 0, initialY: 0 }); const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }; useEffect(() => { scrollToBottom(); }, [messages]); // Handle Dragging const handlePointerDown = (e) => { // Don't drag if clicking the close button if (e.target.tagName.toLowerCase() === 'button') return; setIsDragging(true); dragRef.current = { startX: e.clientX, startY: e.clientY, initialX: position.x, initialY: position.y }; e.currentTarget.setPointerCapture(e.pointerId); }; const handlePointerMove = (e) => { if (!isDragging) return; const dx = e.clientX - dragRef.current.startX; const dy = e.clientY - dragRef.current.startY; setPosition({ x: dragRef.current.initialX + dx, y: dragRef.current.initialY + dy }); }; const handlePointerUp = (e) => { setIsDragging(false); e.currentTarget.releasePointerCapture(e.pointerId); }; const handleSend = async (e) => { e.preventDefault(); if (!input.trim()) return; const userMessage = { role: 'user', content: input }; setMessages(prev => [...prev, userMessage]); setInput(''); setIsLoading(true); try { const response = await axios.post(`${API_BASE_URL}/api/chat`, { messages: [...messages, userMessage].map(m => ({ role: m.role, content: m.content })) }); if (response.data.response) { setMessages(prev => [...prev, { role: 'model', content: response.data.response }]); } else if (response.data.error) { setMessages(prev => [...prev, { role: 'model', content: `Error: ${response.data.error}` }]); } } catch (error) { console.error('Chat error:', error); setMessages(prev => [...prev, { role: 'model', content: "GRRR... I couldn't reach the server. Is it running?" }]); } finally { setIsLoading(false); } }; if (!isOpen) return null; return (