From 92b5fbf5b5750e54162b7937ab1708be2e9ad7ce Mon Sep 17 00:00:00 2001 From: ShukeBta <272197458+ShukeBta@users.noreply.github.com> Date: Wed, 24 Jun 2026 23:41:36 +0800 Subject: [PATCH] refactor: split assistant chat sections --- web/src/pages/AssistantChatPage.tsx | 122 +++----------------- web/src/pages/AssistantChatSections.tsx | 143 ++++++++++++++++++++++++ 2 files changed, 160 insertions(+), 105 deletions(-) create mode 100644 web/src/pages/AssistantChatSections.tsx diff --git a/web/src/pages/AssistantChatPage.tsx b/web/src/pages/AssistantChatPage.tsx index 2cfe669..8dbfdc1 100644 --- a/web/src/pages/AssistantChatPage.tsx +++ b/web/src/pages/AssistantChatPage.tsx @@ -1,5 +1,4 @@ import { FormEvent, useEffect, useRef, useState } from 'react' -import { Loader2, MessageSquare, Plus, Send, Trash2 } from 'lucide-react' import toast from 'react-hot-toast' import { @@ -9,6 +8,7 @@ import { type SessionView, } from '../api/assistant' import { confirmAction } from '../components/confirmAction' +import { AssistantConversationPane, AssistantSessionsSidebar } from './AssistantChatSections' // AssistantChatPage is the multi-turn chat surface backed by the Go // AssistantService. It complements the older AIAssistantPage which is @@ -113,110 +113,22 @@ export function AssistantChatPage() { return (
- {/* Sessions sidebar */} - - - {/* Conversation pane */} -
- {!active && ( -
- -

选择或创建一个会话开始对话

-
- )} - {active && ( - <> -
-

- {active.session.title || '未命名'} -

-
-
- {active.messages.length === 0 && ( -

说点什么开始对话…

- )} - {active.messages.map((m) => ( - - ))} -
-
-
- setDraft(e.target.value)} - disabled={sending} - /> - -
- - )} -
-
- ) -} - -function Bubble({ message }: { message: AssistantMessage }) { - const mine = message.role === 'user' - return ( -
-
- {message.content} -
+ +
) } diff --git a/web/src/pages/AssistantChatSections.tsx b/web/src/pages/AssistantChatSections.tsx new file mode 100644 index 0000000..bb88e60 --- /dev/null +++ b/web/src/pages/AssistantChatSections.tsx @@ -0,0 +1,143 @@ +import type { FormEvent, RefObject } from 'react' +import { Loader2, MessageSquare, Plus, Send, Trash2 } from 'lucide-react' + +import type { AssistantMessage, AssistantSession, SessionView } from '../api/assistant' + +export function AssistantSessionsSidebar({ + sessions, + activeSessionId, + loading, + onNew, + onSelect, + onDelete, +}: { + sessions: AssistantSession[] + activeSessionId?: string + loading: boolean + onNew: () => void + onSelect: (id: string) => void + onDelete: (id: string) => void +}) { + return ( + + ) +} + +export function AssistantConversationPane({ + active, + draft, + sending, + messagesEndRef, + onDraftChange, + onSend, +}: { + active: SessionView | null + draft: string + sending: boolean + messagesEndRef: RefObject + onDraftChange: (value: string) => void + onSend: (event: FormEvent) => void +}) { + return ( +
+ {!active && ( +
+ +

选择或创建一个会话开始对话

+
+ )} + {active && ( + <> +
+

+ {active.session.title || '未命名'} +

+
+
+ {active.messages.length === 0 && ( +

说点什么开始对话…

+ )} + {active.messages.map((message) => ( + + ))} +
+
+
+ onDraftChange(event.target.value)} + disabled={sending} + /> + +
+ + )} +
+ ) +} + +function Bubble({ message }: { message: AssistantMessage }) { + const mine = message.role === 'user' + return ( +
+
+ {message.content} +
+
+ ) +}