// src/views/AgentChat/index.js
// 超炫酷的 AI 投研助手 - HeroUI v3 现代深色主题版本
// 使用 Framer Motion 物理动画引擎 + 毛玻璃效果
// 支持两种模式:单一聊天模式 & 投研会议室模式
import React, { useState } from 'react';
import { Box, Flex, useToast, HStack, Button, Tooltip, VStack, Text, Icon } from '@chakra-ui/react';
import { motion, AnimatePresence } from 'framer-motion';
import { MessageSquare, Users, Crown, Lock } from 'lucide-react';
import { useAuth } from '@contexts/AuthContext';
import { useSubscription } from '@hooks/useSubscription';
// 常量配置 - 从 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, isAuthenticated } = useAuth();
const toast = useToast();
const { hasSubscriptionLevel, openSubscriptionModal } = useSubscription();
// ==================== MAX 权限检查 ====================
const isMaxUser = user?.subscription_type === 'max' || hasSubscriptionLevel('max');
// ==================== 聊天模式状态 ====================
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);
// ==================== 渲染组件 ====================
// 非 MAX 用户显示升级提示
if (!isMaxUser) {
return (
{/* 背景装饰 */}
{/* 升级提示卡片 */}
{/* 图标 */}
{/* 标题 */}
价小前投研 AI
Max 旗舰版专属功能
{/* 描述 */}
AI 投研助手是 Max 旗舰版用户的专属功能,
提供智能股票分析、投研会议室、多模型对话等高级功能。
升级到 Max 版即可解锁全部 AI 能力。
{/* 功能列表 */}
{[
'智能投研助手:一对一 AI 对话分析',
'投研会议室:多 AI 角色协作讨论',
'多模型选择:DeepSeek、Kimi 等',
'专业工具:股票查询、新闻搜索、财务分析',
].map((feature, idx) => (
{feature}
))}
{/* 升级按钮 */}
}
onClick={openSubscriptionModal}
>
升级到 Max 旗舰版
{/* 当前订阅状态 */}
{isAuthenticated && user && (
当前订阅:{user.subscription_type === 'pro' ? 'Pro 专业版' : '免费版'}
)}
);
}
return (
{/* 模式切换栏 */}
}
variant={chatMode === ChatMode.SINGLE ? 'solid' : 'ghost'}
colorScheme={chatMode === ChatMode.SINGLE ? 'purple' : 'gray'}
onClick={() => setChatMode(ChatMode.SINGLE)}
bg={chatMode === ChatMode.SINGLE ? 'purple.500' : 'transparent'}
color={chatMode === ChatMode.SINGLE ? 'white' : 'gray.400'}
_hover={{
bg: chatMode === ChatMode.SINGLE ? 'purple.600' : 'whiteAlpha.100',
}}
>
智能助手
}
variant={chatMode === ChatMode.MEETING ? 'solid' : 'ghost'}
colorScheme={chatMode === ChatMode.MEETING ? 'orange' : 'gray'}
onClick={() => setChatMode(ChatMode.MEETING)}
bg={chatMode === ChatMode.MEETING ? 'orange.500' : 'transparent'}
color={chatMode === ChatMode.MEETING ? 'white' : 'gray.400'}
_hover={{
bg: chatMode === ChatMode.MEETING ? 'orange.600' : 'whiteAlpha.100',
}}
>
投研会议室
{/* 主内容区 */}
{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;