components/ 拆为三层:
- providers/ — 状态管理(App/Theme/SettingsProvider)
- shell/ — 应用外壳(Layout/NavBar/PageDispatcher)
- ui/ — 通用 UI 原子(FloatingPanel/LegalTextModal)
pages/ 重命名 + 重组:
- headers/ → panels/ NavBar 触发的面板页
- login/ → auth/ 认证模块(含注册/忘记密码)
- settings/blocks/ → sections/
- home/components/ → panels/ features/ controls/ hooks/
按职责分:panels(布局壳) + features(功能面板) + controls(表单控件) + hooks
其他清理:
- 删除空占位 Test3.tsx
- HomeContext 从 HomeContent 拆出独立文件
- uploadValidation 内联到 ImageInput
- 修复过时注释(useUI → controls)
54 lines
2.0 KiB
TypeScript
54 lines
2.0 KiB
TypeScript
import React from 'react';
|
||
import ReactDOM from 'react-dom/client';
|
||
import {App as AntdApp} from 'antd';
|
||
|
||
import App from './App';
|
||
import {ThemeProvider} from './components/providers/ThemeProvider';
|
||
import {AppProvider} from './components/providers/AppProvider';
|
||
import {SettingsProvider} from './components/providers/SettingsProvider';
|
||
// 全局样式(包含 Tailwind 指令 + 主题扩展 + 重置)
|
||
import './theme/globals.css';
|
||
|
||
ReactDOM.createRoot(document.getElementById('root')!).render(
|
||
<React.StrictMode>
|
||
{/* AppProvider — 全局应用状态(平台/版本/登录态) */}
|
||
<AppProvider>
|
||
{/* ThemeProvider 内部管理 ConfigProvider(亮色/暗色切换) */}
|
||
<ThemeProvider>
|
||
{/* SettingsProvider — 集中管理设置项(存储路径等) */}
|
||
<SettingsProvider>
|
||
{/* AntdApp 提供 message / notification / modal 的静态方法上下文 */}
|
||
<AntdApp>
|
||
<App />
|
||
</AntdApp>
|
||
</SettingsProvider>
|
||
</ThemeProvider>
|
||
</AppProvider>
|
||
</React.StrictMode>,
|
||
);
|
||
|
||
// 仅在 Electron 环境中监听主进程消息(浏览器预览时跳过)
|
||
import { safeIpcOn } from './utils/ipc';
|
||
safeIpcOn('main-process-message', (_event: unknown, message: unknown) => {
|
||
console.log('[Main Process Message]:', message);
|
||
});
|
||
|
||
// 渲染进程全局未捕获错误(兜底记录到日志文件)
|
||
import {logger} from './utils/logger';
|
||
|
||
window.addEventListener('error', (event) => {
|
||
logger.error('ui', 'Uncaught error (renderer)', event.error, {
|
||
filename: event.filename,
|
||
lineno: event.lineno,
|
||
colno: event.colno,
|
||
});
|
||
});
|
||
|
||
window.addEventListener('unhandledrejection', (event) => {
|
||
const error =
|
||
event.reason instanceof Error
|
||
? event.reason
|
||
: new Error(String(event.reason));
|
||
logger.error('ui', 'Unhandled promise rejection (renderer)', error);
|
||
});
|