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) => (
-
- ))}
-
-
-
- >
- )}
-
-
- )
-}
-
-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) => (
+
+ ))}
+
+
+
+ >
+ )}
+
+ )
+}
+
+function Bubble({ message }: { message: AssistantMessage }) {
+ const mine = message.role === 'user'
+ return (
+
+
+ {message.content}
+
+
+ )
+}