import React, { useState, useRef, useEffect } from 'react'; import { X, Send, Mic, Loader2 } from 'lucide-react'; interface Message { id: string; role: 'user' | 'assistant'; content: string; timestamp: number; } interface ChatDialogProps { isOpen: boolean; onClose: () => void; characterImageUrl?: string; onSendMessage: (message: string) => Promise; } export const ChatDialog: React.FC = ({ isOpen, onClose, characterImageUrl, onSendMessage }) => { const [messages, setMessages] = useState([ { id: '1', role: 'assistant', content: '你好呀~ 我在这里陪着你,有什么想聊的吗?', timestamp: Date.now() } ]); const [inputText, setInputText] = useState(''); const [isLoading, setIsLoading] = useState(false); const messagesEndRef = useRef(null); const inputRef = useRef(null); // 自动滚动到底部 useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]); // 打开时聚焦输入框 useEffect(() => { if (isOpen) { inputRef.current?.focus(); } }, [isOpen]); const handleSend = async () => { if (!inputText.trim() || isLoading) return; const userMessage: Message = { id: Date.now().toString(), role: 'user', content: inputText, timestamp: Date.now() }; setMessages(prev => [...prev, userMessage]); setInputText(''); setIsLoading(true); try { const response = await onSendMessage(inputText); const assistantMessage: Message = { id: (Date.now() + 1).toString(), role: 'assistant', content: response, timestamp: Date.now() }; setMessages(prev => [...prev, assistantMessage]); } catch (error) { const errorMessage: Message = { id: (Date.now() + 1).toString(), role: 'assistant', content: '抱歉,我现在有点累了,稍后再聊好吗?', timestamp: Date.now() }; setMessages(prev => [...prev, errorMessage]); } finally { setIsLoading(false); } }; const handleKeyPress = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSend(); } }; if (!isOpen) return null; return (
{/* 对话框容器 */}
{/* 头部 */}
{/* 角色头像 */} {characterImageUrl ? ( AI Companion ) : (
🐱
)}

小喵陪伴

在线 · 随时陪你聊天

{/* 消息列表 */}
{messages.map((message) => (
{/* 头像 */} {message.role === 'assistant' && (
🐱
)} {/* 消息气泡 */}

{message.content}

{/* 用户头像 */} {message.role === 'user' && (
👤
)}
))} {/* 加载指示器 */} {isLoading && (
🐱
思考中...
)}
{/* 输入区域 */}
setInputText(e.target.value)} onKeyPress={handleKeyPress} placeholder="说点什么吧..." disabled={isLoading} className=" flex-1 bg-transparent text-sm text-slate-700 placeholder:text-slate-400 outline-none disabled:opacity-50 " />

按 Enter 发送,Shift + Enter 换行

); };