From 68ab6a2016d89d71e16ba3896a9ffafcc0f70547 Mon Sep 17 00:00:00 2001 From: kurihada Date: Fri, 12 Dec 2025 15:52:53 +0800 Subject: [PATCH] =?UTF-8?q?feat(ui):=20=E5=88=9B=E5=BB=BA=E5=85=B1?= =?UTF-8?q?=E4=BA=AB=20UI=20=E7=BB=84=E4=BB=B6=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 web 和 desktop 的重复代码抽取到 @ai-assistant/ui 包: - 添加可配置的 API 客户端 (configureApiClient) - 迁移共享组件: ChatMessage, ChatInput, Sidebar, FileBrowser, ConfigPanel - 迁移共享 hook: useChat - 添加 responsive prop 支持响应式布局 - 更新 web/desktop 依赖并删除重复代码 --- packages/desktop/package.json | 1 + packages/desktop/src/App.tsx | 12 +- packages/desktop/src/components/ChatInput.tsx | 85 ------ .../desktop/src/components/ChatMessage.tsx | 80 ------ .../desktop/src/components/ConfigPanel.tsx | 264 ------------------ .../desktop/src/components/FileBrowser.tsx | 236 ---------------- packages/desktop/src/components/Sidebar.tsx | 124 -------- packages/desktop/src/main.tsx | 9 + packages/desktop/src/pages/Chat.tsx | 10 +- packages/desktop/tailwind.config.js | 6 +- packages/ui/package.json | 33 +++ packages/{desktop => ui}/src/api/client.ts | 168 +++++------ packages/ui/src/api/types.ts | 92 ++++++ .../{web => ui}/src/components/ChatInput.tsx | 53 ++-- .../src/components/ChatMessage.tsx | 2 +- .../src/components/ConfigPanel.tsx | 144 +++++++--- .../src/components/FileBrowser.tsx | 2 +- .../{web => ui}/src/components/Sidebar.tsx | 88 +++++- packages/{desktop => ui}/src/hooks/useChat.ts | 2 +- packages/ui/src/index.ts | 47 ++++ packages/ui/src/styles/index.css | 115 ++++++++ packages/ui/tsconfig.json | 22 ++ packages/web/package.json | 1 + packages/web/src/App.tsx | 22 +- packages/web/src/api/client.ts | 181 ------------ packages/web/src/hooks/useChat.ts | 219 --------------- packages/web/src/main.tsx | 1 + packages/web/src/pages/Chat.tsx | 14 +- packages/web/tailwind.config.js | 6 +- pnpm-lock.yaml | 60 +++- 30 files changed, 711 insertions(+), 1388 deletions(-) delete mode 100644 packages/desktop/src/components/ChatInput.tsx delete mode 100644 packages/desktop/src/components/ChatMessage.tsx delete mode 100644 packages/desktop/src/components/ConfigPanel.tsx delete mode 100644 packages/desktop/src/components/FileBrowser.tsx delete mode 100644 packages/desktop/src/components/Sidebar.tsx create mode 100644 packages/ui/package.json rename packages/{desktop => ui}/src/api/client.ts (51%) create mode 100644 packages/ui/src/api/types.ts rename packages/{web => ui}/src/components/ChatInput.tsx (61%) rename packages/{web => ui}/src/components/ChatMessage.tsx (97%) rename packages/{web => ui}/src/components/ConfigPanel.tsx (57%) rename packages/{web => ui}/src/components/FileBrowser.tsx (99%) rename packages/{web => ui}/src/components/Sidebar.tsx (63%) rename packages/{desktop => ui}/src/hooks/useChat.ts (99%) create mode 100644 packages/ui/src/index.ts create mode 100644 packages/ui/src/styles/index.css create mode 100644 packages/ui/tsconfig.json delete mode 100644 packages/web/src/api/client.ts delete mode 100644 packages/web/src/hooks/useChat.ts diff --git a/packages/desktop/package.json b/packages/desktop/package.json index c670c13..9e94beb 100644 --- a/packages/desktop/package.json +++ b/packages/desktop/package.json @@ -13,6 +13,7 @@ "tauri": "tauri" }, "dependencies": { + "@ai-assistant/ui": "workspace:*", "@tauri-apps/api": "^2.1.1", "@tauri-apps/plugin-dialog": "^2.2.0", "@tauri-apps/plugin-fs": "^2.2.0", diff --git a/packages/desktop/src/App.tsx b/packages/desktop/src/App.tsx index 6530e4c..28d659b 100644 --- a/packages/desktop/src/App.tsx +++ b/packages/desktop/src/App.tsx @@ -3,11 +3,15 @@ */ import { useState, useEffect } from 'react'; -import { Sidebar } from './components/Sidebar'; +import { + Sidebar, + FileBrowser, + ConfigPanel, + listSessions, + createSession, + type Session, +} from '@ai-assistant/ui'; import { ChatPage } from './pages/Chat'; -import { FileBrowser } from './components/FileBrowser'; -import { ConfigPanel } from './components/ConfigPanel'; -import { listSessions, createSession, type Session } from './api/client'; export function App() { const [currentSessionId, setCurrentSessionId] = useState(null); diff --git a/packages/desktop/src/components/ChatInput.tsx b/packages/desktop/src/components/ChatInput.tsx deleted file mode 100644 index af2bf1e..0000000 --- a/packages/desktop/src/components/ChatInput.tsx +++ /dev/null @@ -1,85 +0,0 @@ -/** - * Chat Input Component - */ - -import { useState, useRef, useEffect } from 'react'; -import { Send, Square } from 'lucide-react'; -import clsx from 'clsx'; - -interface ChatInputProps { - onSend: (content: string) => void; - onCancel: () => void; - isLoading: boolean; - disabled?: boolean; -} - -export function ChatInput({ onSend, onCancel, isLoading, disabled }: ChatInputProps) { - const [input, setInput] = useState(''); - const textareaRef = useRef(null); - - // 自动调整高度 - useEffect(() => { - const textarea = textareaRef.current; - if (textarea) { - textarea.style.height = 'auto'; - textarea.style.height = `${Math.min(textarea.scrollHeight, 200)}px`; - } - }, [input]); - - const handleSubmit = () => { - const trimmed = input.trim(); - if (!trimmed || isLoading || disabled) return; - - onSend(trimmed); - setInput(''); - - // 重置高度 - if (textareaRef.current) { - textareaRef.current.style.height = 'auto'; - } - }; - - const handleKeyDown = (e: React.KeyboardEvent) => { - if (e.key === 'Enter' && !e.shiftKey) { - e.preventDefault(); - handleSubmit(); - } - }; - - return ( -
-
-
-