import React from 'react' import { BrowserRouter as Router, Routes, Route, NavLink, Navigate } from 'react-router-dom' import Dashboard from './pages/Dashboard' import EmbeddedSku from './pages/EmbeddedSku' import ProductManagement from './pages/ProductManagement' import SupplierManagement from './pages/SupplierManagement' import CustomerManagement from './pages/CustomerManagement' import OrderManagement from './pages/OrderManagement' import ProspectManagement from './pages/ProspectManagement' import QuoteManagement from './pages/QuoteManagement' import PiContractManagement from './pages/PiContractManagement' import PurchaseOrderManagement from './pages/PurchaseOrderManagement' import Settings from './components/Settings' import GlobalHeader from './components/GlobalHeader' import AIAssistant from './components/AIAssistant' import { readPreference } from './preferences' import { DashboardIcon, FactoryIcon, PackageIcon, UsersIcon, TargetIcon, ClipboardIcon, DownloadIcon, QuoteIcon, ContractIcon, PurchaseIcon, ChevronDownIcon, TuneIcon, SunIcon, MoonIcon, SidebarLayoutIcon } from './components/Icons' /* 侧边栏分组配置:工作台独立置顶,不归属任何分组 */ const NAV_GROUPS = [ { id: 'business', title: '业务管理', items: [ { to: '/quotes', label: '客户报价单管理', icon: QuoteIcon }, { to: '/pi-contracts', label: 'PI合同管理', icon: ContractIcon }, { to: '/purchase-orders', label: '采购单管理', icon: PurchaseIcon } ] }, { id: 'customer', title: '客户管理', items: [ { to: '/customers', label: '客户管理', icon: UsersIcon }, { to: '/prospects', label: '新客开发', icon: TargetIcon }, { to: '/orders', label: '订单管理', icon: ClipboardIcon } ] }, { id: 'procurement', title: '采购管理', items: [ { to: '/products', label: '产品管理', icon: PackageIcon }, { to: '/suppliers', label: '供应商管理', icon: FactoryIcon }, { to: '/procurement/import', label: '合同导入', icon: DownloadIcon } ] } ] function App() { const [collapsed, setCollapsed] = React.useState(false) const [collapsedGroups, setCollapsedGroups] = React.useState([]) const [settingsOpen, setSettingsOpen] = React.useState(false) const [assistantOpen, setAssistantOpen] = React.useState(false) const [theme, setTheme] = React.useState(() => readPreference('tms-theme', ['dark', 'light'], 'dark')) const [reducedMotion, setReducedMotion] = React.useState(() => readPreference('tms-motion', ['full', 'reduced'], 'full') === 'reduced') const closeSettings = React.useCallback(() => setSettingsOpen(false), []) const closeAssistant = React.useCallback(() => setAssistantOpen(false), []) React.useEffect(() => { document.documentElement.dataset.theme = theme document.documentElement.style.colorScheme = theme try { localStorage.setItem('tms-theme', theme) } catch { /* Session-only when storage is unavailable. */ } }, [theme]) React.useEffect(() => { document.documentElement.dataset.motion = reducedMotion ? 'reduced' : 'full' try { localStorage.setItem('tms-motion', reducedMotion ? 'reduced' : 'full') } catch { /* Session-only. */ } }, [reducedMotion]) const navClass = ({ isActive }) => `nav-item${isActive ? ' active' : ''}` const toggleGroup = React.useCallback((id) => { setCollapsedGroups(current => current.includes(id) ? current.filter(x => x !== id) : [...current, id]) }, []) return (
setAssistantOpen(true)} />
} /> } /> } /> } /> } /> } /> } /> } /> } /> } /> } />
) } export default App