mirror of
https://github.com/aiclientproxy/proxycast.git
synced 2026-09-24 23:10:56 +08:00
3.3 KiB
3.3 KiB
组件系统
概述
React 组件层,使用 TailwindCSS 和 shadcn/ui。
目录结构
src/components/
├── ui/ # 基础 UI 组件 (shadcn/ui)
├── provider-pool/ # 凭证池管理
├── flow-monitor/ # 流量监控
├── general-chat/ # 兼容画布桥接(非对话主入口)
├── terminal/ # 已移除的历史终端页面路径(不要恢复)
├── mcp/ # MCP 服务器
├── settings/ # 设置页面
└── AppSidebar.tsx # 全局侧边栏
核心组件
AppSidebar
全局图标侧边栏,类似 cherry-studio 风格。
// src/components/AppSidebar.tsx
export function AppSidebar() {
return (
<aside className="w-14 bg-sidebar">
<nav className="flex flex-col items-center gap-2">
<SidebarItem icon={Home} to="/" />
<SidebarItem icon={MessageSquare} to="/chat" />
<SidebarItem icon={Settings} to="/settings" />
</nav>
</aside>
);
}
ProviderPool
凭证池管理组件。
// src/components/provider-pool/ProviderPoolPanel.tsx
export function ProviderPoolPanel() {
const { credentials, addCredential, removeCredential } = useProviderPool();
return (
<div className="space-y-4">
<CredentialList credentials={credentials} onRemove={removeCredential} />
<AddCredentialDialog onAdd={addCredential} />
</div>
);
}
FlowMonitor
流量监控组件。
// src/components/flow-monitor/FlowMonitorPanel.tsx
export function FlowMonitorPanel() {
const { records, stats, query } = useFlowMonitor();
return (
<div className="flex flex-col h-full">
<FlowStats stats={stats} />
<FlowTable records={records} />
<FlowPagination query={query} />
</div>
);
}
组件规范
文件命名
- 组件文件:
PascalCase.tsx - Hook 文件:
useCamelCase.ts - 工具文件:
camelCase.ts
组件结构
// 标准组件结构
interface Props {
// props 定义
}
export function ComponentName({ prop1, prop2 }: Props) {
// hooks
const [state, setState] = useState();
// handlers
const handleClick = () => {};
// render
return <div>{/* JSX */}</div>;
}
相关文档
输入组件统一规范(input-kit)
输入组件统一基座位于 src/components/input-kit/,目标是避免多处输入实现导致行为漂移。
分层原则
Hook层管理状态与持久化(会话、Provider、Model、输入内容)。input-kit层只负责渲染和交互编排(BaseComposer、ModelSelector)。- 业务页面通过
adapters做状态归一化,不允许 UI 组件直接写本地存储。
必须遵守
- UI 组件使用受控 props,不在组件内“偷偷”回写默认 Provider/Model。
- Provider/Model 的默认值与恢复逻辑统一放在 Hook 层。
- 新增输入入口优先复用
BaseComposer,而不是复制粘贴 textarea 逻辑。
迁移约定
- 先接
adapters,再替换页面中的旧输入实现。 - 保留兼容包装组件(如
ChatModelSelector)用于渐进迁移。 - 每次迁移至少补一个回归测试,覆盖 Enter 发送/停止和会话切换场景。