import React, { useState, useEffect, useRef } from 'react'; import { useDispatch, useSelector } from 'react-redux'; import { fetchMessages, sendMessage } from '../../store/chat/chat.messages.thunks'; import { resetMessages, resetSendMessageStatus } from '../../store/chat/chat.slice'; import { showNotification } from '../../store/notification.slice'; import SvgIcon from '../../components/SvgIcon'; export default function ChatWindow({ chatId, knowledgeBaseId }) { const dispatch = useDispatch(); const [inputMessage, setInputMessage] = useState(''); const messagesEndRef = useRef(null); // 从 Redux store 获取数据 const { items: messages, status: messagesStatus, error: messagesError, } = useSelector((state) => state.chat.messages); const { status: sendStatus, error: sendError } = useSelector((state) => state.chat.sendMessage); const knowledgeBase = useSelector((state) => state.knowledgeBase.list.items.find((kb) => kb.id === knowledgeBaseId) ); // 获取聊天消息 useEffect(() => { if (chatId) { dispatch(fetchMessages(chatId)); } // 组件卸载时重置消息状态 return () => { dispatch(resetMessages()); }; }, [chatId, dispatch]); // 监听发送消息状态 useEffect(() => { if (sendStatus === 'failed' && sendError) { dispatch( showNotification({ message: `发送失败: ${sendError}`, type: 'danger', }) ); dispatch(resetSendMessageStatus()); } }, [sendStatus, sendError, dispatch]); // 滚动到底部 useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }, [messages]); const handleSendMessage = (e) => { e.preventDefault(); if (!inputMessage.trim() || sendStatus === 'loading') return; // 发送消息 dispatch(sendMessage({ chatId, content: inputMessage })); setInputMessage(''); }; // 渲染加载状态 const renderLoading = () => (