From 1b4812acae3c836d1a4a8e81052a5b494b60ea65 Mon Sep 17 00:00:00 2001 From: sp mac bookpro 2605 Date: Fri, 31 Jul 2026 16:14:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=BA=AF=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=EF=BC=8C=E7=8B=AC=E7=AB=8B=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=20/pure-chat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 ChatPagePure 组件:仅保留聊天主区域(section.chat-main),去掉全局 Sidebar 和 AgentSidebar - 复用原有的 ChatHeader、ChatBody、ChatInput、ChatOutline、ChatDrawers 组件,会话功能完全一致 - 独立路由 /pure-chat 和 /pure-chat/:id,绕过 layout-shell 全局布局,不显示侧边栏 - 新增样式文件 chat-page-pure.css,适配纯会话页面全屏布局 --- src/App.tsx | 9 +- src/pages/chat/ChatPagePure.tsx | 179 +++++++++++++++++++++++ src/pages/chat/styles/chat-page-pure.css | 16 ++ 3 files changed, 203 insertions(+), 1 deletion(-) create mode 100644 src/pages/chat/ChatPagePure.tsx create mode 100644 src/pages/chat/styles/chat-page-pure.css diff --git a/src/App.tsx b/src/App.tsx index 9bb3327..654f5f8 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -15,7 +15,8 @@ import PromptLibraryPage from './pages/PromptLibraryPage'; import StatsPage from './pages/StatsPage'; import ProfilePage from './pages/ProfilePage'; import PricingPage from './pages/PricingPage'; -import SharedSessionPage from './pages/SharedSessionPage'; +import SharedSessionPage from './pages/SharedSessionPage'; +import ChatPagePure from './pages/chat/ChatPagePure'; import WorkflowsPage from './pages/WorkflowsPage'; import KnowledgeBasePage from './pages/KnowledgeBase'; import { useAuth } from './store/auth'; @@ -83,6 +84,12 @@ export default function App() { } /> } /> + ) : location.pathname.startsWith('/pure-chat') ? ( + + {/* 纯会话页:无全局 Sidebar,无 AgentSidebar,仅保留聊天主区域 */} + } /> + } /> + ) : (
{/* 只有编辑器全屏显示,其他页面均保留侧边栏 */} diff --git a/src/pages/chat/ChatPagePure.tsx b/src/pages/chat/ChatPagePure.tsx new file mode 100644 index 0000000..af58cee --- /dev/null +++ b/src/pages/chat/ChatPagePure.tsx @@ -0,0 +1,179 @@ +import { useEffect, useState, useCallback, useRef } from 'react'; +import { App as AntApp, Empty } from 'antd'; +import type { ChatPageLogicOutput } from './ChatPageLogic'; +import { markdownToPlainText } from './utils/copy'; +import { useChatPageLogic } from './ChatPageLogic'; +import ChatBody from './components/ChatBody'; +import ChatDrawers from './components/ChatDrawers'; +import ChatHeader from './components/ChatHeader'; +import ChatInput from './components/ChatInput'; +import ChatOutline from './components/ChatOutline'; +import type { ModelOverrides } from '../../api'; +import './styles/chat-page-pure.css'; + +/** + * 纯会话页面组件 + * 仅保留聊天主区域(section.chat-main),去掉全局 Sidebar 和 AgentSidebar(chat-side) + * 会话功能与原聊天页面完全一致 + */ +export default function ChatPagePure() { + const logic = useChatPageLogic(); + const { message } = AntApp.useApp(); + const [outlineCollapsed, setOutlineCollapsed] = useState(true); + const isAutoScrolling = useRef(false); + + const { + id, + roomId, + highlightId, + historyDrawerOpen, + mcpDrawerOpen, + paramsDrawerOpen, + tplDrawerOpen, + agent, + agentList, + messages, + branches, + bodyRef, + sender, + navigate, + overrides, + setOverrides, + setRoomId, + setHighlightId, + setHistoryDrawerOpen, + setMcpDrawerOpen, + setParamsDrawerOpen, + setTplDrawerOpen, + handleNewSession, + } = logic; + + // 初始化时,如果有历史消息,激活最后一条 Agent 消息 + useEffect(() => { + if (messages.length > 0 && !highlightId) { + const agentMsgs = messages.filter(m => m.role === 'assistant' || m.role === 'agent' || m.speaker?.type === 'agent'); + if (agentMsgs.length > 0) { + setHighlightId(agentMsgs[agentMsgs.length - 1].id); + } + } + }, [messages.length]); + + const handleJump = useCallback((msgId: string) => { + isAutoScrolling.current = true; + setHighlightId(msgId); + const el = document.getElementById('msg-' + msgId); + if (el) { + el.scrollIntoView({ block: 'start', behavior: 'smooth' }); + setTimeout(() => { + isAutoScrolling.current = false; + }, 800); + } + }, [setHighlightId]); + + return ( +
+
+ {!agent ? ( +
+ +
+ ) : ( +
+
+ setHistoryDrawerOpen(true)} + onOpenParams={() => setParamsDrawerOpen(true)} + onOpenMcp={() => setMcpDrawerOpen(true)} + onManageAgent={() => navigate(`/agents/${id}`)} + onClear={sender.handleClear} + /> + + { + const content = mode === 'markdown' ? text : markdownToPlainText(text); + navigator.clipboard?.writeText(content).then(() => { + message.success(mode === 'markdown' ? '已复制(Markdown)' : '已复制(纯文本)'); + }); + }} + /> + + setTplDrawerOpen(true)} + modelOptions={sender.modelOptions} + activeModelValue={sender.activeModelValue} + onChangeModel={(modelId) => { + const picked = sender.modelOptions.find((o) => o.value === modelId); + setOverrides((o: ModelOverrides) => ({ + ...o, + model_id: modelId, + model: picked?.label ?? o.model + })); + }} + agentList={agentList} + onInsertMention={() => {}} + onOpenHistory={() => setHistoryDrawerOpen(true)} + onNewSession={handleNewSession} + /> +
+ + setOutlineCollapsed(!outlineCollapsed)} + onJump={handleJump} + /> +
+ )} +
+ + sender.setInput(updater)} + overrides={overrides} + setOverrides={setOverrides} + roomId={roomId} + setRoomId={setRoomId} + setHighlightId={setHighlightId} + sessionRefresh={sender.sessionRefresh} + mcpDrawerOpen={mcpDrawerOpen} + setMcpDrawerOpen={setMcpDrawerOpen} + tplDrawerOpen={tplDrawerOpen} + setTplDrawerOpen={setTplDrawerOpen} + paramsDrawerOpen={paramsDrawerOpen} + setParamsDrawerOpen={setParamsDrawerOpen} + historyDrawerOpen={historyDrawerOpen} + setHistoryDrawerOpen={setHistoryDrawerOpen} + notify={{ success: (t) => message.success(t) }} + /> +
+ ); +} diff --git a/src/pages/chat/styles/chat-page-pure.css b/src/pages/chat/styles/chat-page-pure.css new file mode 100644 index 0000000..b2d2cd9 --- /dev/null +++ b/src/pages/chat/styles/chat-page-pure.css @@ -0,0 +1,16 @@ +/* 纯会话页面样式 - 无侧边栏,仅保留聊天主区域 */ + +.chat-pure-shell { + width: 100%; + height: 100vh; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.chat-pure-shell .chat-main { + flex: 1; + height: 100vh; + overflow: hidden; + min-width: 0; +}