'use client' import { Fab, Drawer, Box, Typography, TextField, Button, Paper, Avatar, Chip, IconButton, Divider, List, ListItem, ListItemText, useTheme, Slide, Grow, Zoom, } from '@mui/material' import { Chat, Send, Close, SmartToy, Person, ContentCopy, ThumbUp, ThumbDown, Minimize, Launch, } from '@mui/icons-material' import { useState, useRef, useEffect } from 'react' interface ChatMessage { id: string role: 'user' | 'assistant' content: string timestamp: Date } export default function FloatingChat() { const theme = useTheme() const [isOpen, setIsOpen] = useState(false) const [isMinimized, setIsMinimized] = useState(false) const [messages, setMessages] = useState([ { id: '1', role: 'assistant', content: 'Bună ziua! Sunt asistentul tău AI pentru întrebări biblice. Cum te pot ajuta astăzi să înțelegi mai bine Scriptura?', timestamp: new Date(), } ]) const [inputMessage, setInputMessage] = useState('') const [isLoading, setIsLoading] = useState(false) const messagesEndRef = useRef(null) const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }) } useEffect(() => { scrollToBottom() }, [messages]) const handleSendMessage = async () => { if (!inputMessage.trim() || isLoading) return const userMessage: ChatMessage = { id: Date.now().toString(), role: 'user', content: inputMessage, timestamp: new Date(), } setMessages(prev => [...prev, userMessage]) setInputMessage('') setIsLoading(true) try { const response = await fetch('/api/chat', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ message: inputMessage, history: messages.slice(-5), }), }) if (!response.ok) { throw new Error('Failed to get response') } const data = await response.json() const assistantMessage: ChatMessage = { id: (Date.now() + 1).toString(), role: 'assistant', content: data.response || 'Îmi pare rău, nu am putut procesa întrebarea ta. Te rog încearcă din nou.', timestamp: new Date(), } setMessages(prev => [...prev, assistantMessage]) } catch (error) { console.error('Error sending message:', error) const errorMessage: ChatMessage = { id: (Date.now() + 1).toString(), role: 'assistant', content: 'Îmi pare rău, a apărut o eroare. Te rog verifică conexiunea și încearcă din nou.', timestamp: new Date(), } setMessages(prev => [...prev, errorMessage]) } finally { setIsLoading(false) } } const handleKeyPress = (event: React.KeyboardEvent) => { if (event.key === 'Enter' && !event.shiftKey) { event.preventDefault() handleSendMessage() } } const copyToClipboard = (text: string) => { navigator.clipboard.writeText(text) } const suggestedQuestions = [ 'Ce spune Biblia despre iubire?', 'Explică-mi parabola semănătorului', 'Care sunt fructele Duhului?', 'Ce înseamnă să fii născut din nou?', 'Cum pot să mă rog mai bine?', ] const toggleChat = () => { setIsOpen(!isOpen) if (isMinimized) setIsMinimized(false) } const minimizeChat = () => { setIsMinimized(!isMinimized) } const openFullChat = () => { window.open('/chat', '_blank') } return ( <> {/* Floating Action Button */} {/* Chat Overlay */} {/* Header */} Chat AI Biblic Asistent pentru întrebări biblice {!isMinimized && ( <> {/* Suggested Questions */} Întrebări sugerate: {suggestedQuestions.slice(0, 3).map((question, index) => ( setInputMessage(question)} sx={{ fontSize: '0.75rem', cursor: 'pointer', '&:hover': { bgcolor: 'primary.light', color: 'white', }, }} /> ))} {/* Messages */} {messages.map((message) => ( {message.role === 'user' ? : } {message.content} {message.role === 'assistant' && ( copyToClipboard(message.content)} > )} {message.timestamp.toLocaleTimeString('ro-RO', { hour: '2-digit', minute: '2-digit', })} ))} {isLoading && ( Scriu răspunsul... )}
{/* Input */} setInputMessage(e.target.value)} onKeyPress={handleKeyPress} disabled={isLoading} variant="outlined" sx={{ '& .MuiOutlinedInput-root': { borderRadius: 2, } }} /> Enter pentru a trimite • Shift+Enter pentru linie nouă )} ) }