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, addMessage } from '../../store/chat/chat.slice'; import { showNotification } from '../../store/notification.slice'; import SvgIcon from '../../components/SvgIcon'; import { fetchKnowledgeBases } from '../../store/knowledgeBase/knowledgeBase.thunks'; 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); // 使用新的Redux状态结构 const knowledgeBases = useSelector((state) => state.knowledgeBase.knowledgeBases || []); const knowledgeBase = knowledgeBases.find((kb) => kb.id === knowledgeBaseId); const isLoadingKnowledgeBases = useSelector((state) => state.knowledgeBase.loading); // 获取聊天消息 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]); // 从 Redux store 获取知识库信息 useEffect(() => { if (!knowledgeBase && !isLoadingKnowledgeBases) { dispatch(fetchKnowledgeBases({ page: 1, page_size: 50 })); } }, [dispatch, knowledgeBase, isLoadingKnowledgeBases]); const handleSendMessage = (e) => { e.preventDefault(); if (!inputMessage.trim() || sendStatus === 'loading') return; // 立即添加用户消息到界面 const userMessage = { id: Date.now(), content: inputMessage, sender: 'user', timestamp: new Date().toISOString(), }; dispatch(addMessage(userMessage)); // 清空输入框 setInputMessage(''); // 发送消息到服务器 dispatch(sendMessage({ chatId, content: inputMessage })); }; // 渲染加载状态 const renderLoading = () => (