import { useState, useRef, useEffect } from 'react' import { Typography, Input, Button, Space, Avatar, Spin, theme } from 'antd' import { SendOutlined, RobotOutlined, UserOutlined } from '@ant-design/icons' import { sendMessage } from '@/services/ai-chat' const { Title, Text } = Typography const { TextArea } = Input interface Message { id: string role: 'user' | 'assistant' content: string timestamp: number } export default function TaskAssistant() { const [messages, setMessages] = useState([]) const [input, setInput] = useState('') const [loading, setLoading] = useState(false) const messagesEndRef = useRef(null) const { token } = theme.useToken() useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }) }, [messages]) const handleSend = async () => { const text = input.trim() if (!text || loading) return const userMsg: Message = { id: Date.now().toString(), role: 'user', content: text, timestamp: Date.now(), } setMessages(prev => [...prev, userMsg]) setInput('') setLoading(true) try { const reply = await sendMessage([...messages, userMsg].map(m => ({ role: m.role, content: m.content, }))) const assistantMsg: Message = { id: (Date.now() + 1).toString(), role: 'assistant', content: reply, timestamp: Date.now(), } setMessages(prev => [...prev, assistantMsg]) } catch (err) { const errorMsg: Message = { id: (Date.now() + 1).toString(), role: 'assistant', content: '抱歉,请求失败:' + (err instanceof Error ? err.message : '未知错误'), timestamp: Date.now(), } setMessages(prev => [...prev, errorMsg]) } finally { setLoading(false) } } const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault() handleSend() } } return (
任务助理 AI 助手,随时为你提供帮助
{messages.length === 0 && (
有什么我可以帮助你的? 输入你的问题,AI 助手将为你解答
)} {messages.map(msg => (
: } style={{ backgroundColor: msg.role === 'user' ? token.colorPrimary : token.colorSuccess, flexShrink: 0, }} />
{msg.content}
))} {loading && (
} style={{ backgroundColor: token.colorSuccess, flexShrink: 0 }} />
思考中...
)}