import { useState } from 'react'; import { useSecurityStore } from '../../store/securityStore'; import { Settings as SettingsIcon, BarChart3, Puzzle, MessageSquare, FolderOpen, Shield, Info, ArrowLeft, Coins, Cpu, Zap, HelpCircle, ClipboardList, Clock, Heart, Key, Database, Cloud, } from 'lucide-react'; import { silentErrorHandler } from '../../lib/error-utils'; import { General } from './General'; import { UsageStats } from './UsageStats'; import { ModelsAPI } from './ModelsAPI'; import { MCPServices } from './MCPServices'; import { Skills } from './Skills'; import { IMChannels } from './IMChannels'; import { Workspace } from './Workspace'; import { Privacy } from './Privacy'; import { About } from './About'; import { Credits } from './Credits'; import { AuditLogsPanel } from '../AuditLogsPanel'; import { SecurityStatus } from '../SecurityStatus'; import { SecurityLayersPanel } from '../SecurityLayersPanel'; import { TaskList } from '../TaskList'; import { HeartbeatConfig } from '../HeartbeatConfig'; import { SecureStorage } from './SecureStorage'; import { VikingPanel } from '../VikingPanel'; import { SaaSSettings } from '../SaaS/SaaSSettings'; interface SettingsLayoutProps { onBack: () => void; } type SettingsPage = | 'general' | 'usage' | 'credits' | 'models' | 'mcp' | 'skills' | 'im' | 'workspace' | 'privacy' | 'security' | 'storage' | 'saas' | 'viking' | 'audit' | 'tasks' | 'heartbeat' | 'feedback' | 'about'; const menuItems: { id: SettingsPage; label: string; icon: React.ReactNode }[] = [ { id: 'general', label: '通用', icon: }, { id: 'usage', label: '用量统计', icon: }, { id: 'credits', label: '积分详情', icon: }, { id: 'models', label: '模型与 API', icon: }, { id: 'mcp', label: 'MCP 服务', icon: }, { id: 'skills', label: '技能', icon: }, { id: 'im', label: 'IM 频道', icon: }, { id: 'workspace', label: '工作区', icon: }, { id: 'privacy', label: '数据与隐私', icon: }, { id: 'storage', label: '安全存储', icon: }, { id: 'saas', label: 'SaaS 平台', icon: }, { id: 'viking', label: '语义记忆', icon: }, { id: 'security', label: '安全状态', icon: }, { id: 'audit', label: '审计日志', icon: }, { id: 'tasks', label: '定时任务', icon: }, { id: 'heartbeat', label: '心跳配置', icon: }, { id: 'feedback', label: '提交反馈', icon: }, { id: 'about', label: '关于', icon: }, ]; export function SettingsLayout({ onBack }: SettingsLayoutProps) { const [activePage, setActivePage] = useState('general'); const securityStatus = useSecurityStore((s) => s.securityStatus); const renderPage = () => { switch (activePage) { case 'general': return ; case 'usage': return ; case 'credits': return ; case 'models': return ; case 'mcp': return ; case 'skills': return ; case 'im': return ; case 'workspace': return ; case 'privacy': return ; case 'storage': return ; case 'saas': return ; case 'security': return ( 安全状态 安全架构详情 ); case 'audit': return ; case 'tasks': return ( 定时任务 ); case 'heartbeat': return ( ); case 'viking': return ; case 'feedback': return ; case 'about': return ; default: return ; } }; return ( {/* Left navigation */} {/* Main content */} {renderPage()} ); } // Simple feedback page (inline) function Feedback() { const [text, setText] = useState(''); const [copied, setCopied] = useState(false); const handleCopy = async () => { await navigator.clipboard.writeText(text.trim()); setCopied(true); }; return ( 提交反馈 当前版本尚未接入在线反馈通道。你可以先复制下面的反馈内容,再连同截图和日志一起发给开发者。 { setText(e.target.value); if (copied) { setCopied(false); } }} placeholder="请尽量详细描述复现步骤、期望结果和实际结果" className="w-full h-40 border border-gray-300 rounded-lg p-3 text-sm resize-none focus:outline-none focus:border-orange-400" /> { handleCopy().catch(silentErrorHandler('SettingsLayout')); }} disabled={!text.trim()} className="mt-4 px-6 py-2 bg-orange-500 text-white text-sm rounded-lg hover:bg-orange-600 disabled:opacity-50 disabled:cursor-not-allowed transition-colors" > {copied ? '已复制' : '复制反馈内容'} ); }
当前版本尚未接入在线反馈通道。你可以先复制下面的反馈内容,再连同截图和日志一起发给开发者。