// src/views/AgentChat/index.js // 超炫酷的 AI 投研助手 - HeroUI v3 现代深色主题版本 // 使用 Framer Motion 物理动画引擎 + 毛玻璃效果 // 支持两种模式:单一聊天模式 & 投研会议室模式 import React, { useState } from 'react'; import { Box, Flex, useToast, HStack, Button, Tooltip } from '@chakra-ui/react'; import { motion, AnimatePresence } from 'framer-motion'; import { MessageSquare, Users } from 'lucide-react'; import { useAuth } from '@contexts/AuthContext'; // 常量配置 - 从 TypeScript 模块导入 import { DEFAULT_MODEL_ID } from './constants/models'; import { DEFAULT_SELECTED_TOOLS } from './constants/tools'; // 拆分后的子组件 import LeftSidebar from './components/LeftSidebar'; import ChatArea from './components/ChatArea'; import RightSidebar from './components/RightSidebar'; import MeetingRoom from './components/MeetingRoom'; // 自定义 Hooks import { useAgentSessions, useAgentChat, useFileUpload } from './hooks'; /** * 聊天模式枚举 */ const ChatMode = { SINGLE: 'single', // 单一聊天模式 MEETING: 'meeting', // 投研会议室模式 }; /** * Agent Chat - 主组件(HeroUI v3 深色主题) * * 架构说明: * - Phase 1: 常量配置已提取到 constants/ 目录(TypeScript) * - Phase 2: UI 组件已拆分到 components/ 目录 * - Phase 3: 业务逻辑已提取到 hooks/ 目录(TypeScript) * * 主组件职责: * 1. 组合各个自定义 Hooks * 2. 管理 UI 状态(侧边栏开关、模型选择、工具选择、聊天模式) * 3. 组合渲染子组件 * * 新增功能(2024-11): * - 投研会议室模式:多 AI 角色协作讨论投资议题 */ const AgentChat = () => { const { user } = useAuth(); const toast = useToast(); // ==================== 聊天模式状态 ==================== const [chatMode, setChatMode] = useState(ChatMode.SINGLE); // ==================== UI 状态(主组件管理)==================== const [selectedModel, setSelectedModel] = useState(DEFAULT_MODEL_ID); const [selectedTools, setSelectedTools] = useState(DEFAULT_SELECTED_TOOLS); const [isLeftSidebarOpen, setIsLeftSidebarOpen] = useState(true); const [isRightSidebarOpen, setIsRightSidebarOpen] = useState(true); // ==================== 自定义 Hooks ==================== // 文件上传 Hook const { uploadedFiles, fileInputRef, handleFileSelect, removeFile, clearFiles } = useFileUpload(); // 会话管理 Hook(需要先创建 messages state) const [messages, setMessages] = useState([]); const { sessions, currentSessionId, setCurrentSessionId, isLoadingSessions, loadSessions, switchSession, createNewSession, } = useAgentSessions({ user, setMessages, }); // 消息处理 Hook const { inputValue, setInputValue, isProcessing, handleSendMessage, handleKeyPress, } = useAgentChat({ user, currentSessionId, setCurrentSessionId, selectedModel, selectedTools, uploadedFiles, clearFiles, toast, loadSessions, messages, setMessages, }); // ==================== 输入框引用(保留在主组件)==================== const inputRef = React.useRef(null); // ==================== 渲染组件 ==================== return ( {/* 模式切换栏 */} {/* 主内容区 */} {chatMode === ChatMode.SINGLE ? ( {/* 左侧栏 */} setIsLeftSidebarOpen(false)} sessions={sessions} currentSessionId={currentSessionId} onSessionSwitch={switchSession} onNewSession={createNewSession} isLoadingSessions={isLoadingSessions} user={user} /> {/* 中间聊天区 */} setIsLeftSidebarOpen(true)} onToggleRightSidebar={() => setIsRightSidebarOpen(true)} onNewSession={createNewSession} userAvatar={user?.avatar} inputRef={inputRef} fileInputRef={fileInputRef} /> {/* 右侧栏 */} setIsRightSidebarOpen(false)} selectedModel={selectedModel} onModelChange={setSelectedModel} selectedTools={selectedTools} onToolsChange={setSelectedTools} sessionsCount={sessions.length} messagesCount={messages.length} /> ) : ( {/* 投研会议室 */} )} ); }; export default AgentChat;