- 单一 Key:API 与 MCP 共用一个 wmh_ Key,凭据迁移至 settings 表(0004 删除 api_credentials) - Markdown:入库时 HTML→Markdown(mailhook 同思路),webhook payload 新增 markdown 字段 - /emails 路由改为 /inboxs 并支持域名筛选;设置按钮移入头像下拉 - 主题切换按钮(头像左侧,亮/暗持久化);设置模态仅 全局 Webhook/账号密码 两 tab 且高度限屏 - 列表操作列按钮加 SVG 图标;mailboxes 去 Webhook 列;最近邮件加收件人列
70 lines
2.2 KiB
TypeScript
70 lines
2.2 KiB
TypeScript
/** 前端入口:antd v6 + react-router(Vite 构建);亮/暗主题状态在顶层持有 */
|
|
import React, { useEffect, useState } from "react";
|
|
import { createRoot } from "react-dom/client";
|
|
import { ConfigProvider, App as AntdApp } from "antd";
|
|
import zhCN from "antd/locale/zh_CN";
|
|
import { createBrowserRouter, RouterProvider } from "react-router-dom";
|
|
import { applyDarkMode, buildAntdTheme, loadDarkMode } from "./theme.ts";
|
|
import { ThemeContext } from "./theme-context.ts";
|
|
import "./styles.css";
|
|
import { App } from "./App.tsx";
|
|
import { LoginPage } from "./pages/Login.tsx";
|
|
import { OAuthSimPage } from "./pages/OAuthSim.tsx";
|
|
import { DashboardPage } from "./pages/Dashboard.tsx";
|
|
import { AccountsPage } from "./pages/Accounts.tsx";
|
|
import { DomainsPage } from "./pages/Domains.tsx";
|
|
import { MailboxesPage } from "./pages/Mailboxes.tsx";
|
|
import { InboxPage } from "./pages/Inbox.tsx";
|
|
import { setUnauthorizedHandler } from "./api.ts";
|
|
|
|
/** # 成员变量: 路由表(邮件页路由 /inboxs,v2.1.0) **/
|
|
const router = createBrowserRouter([
|
|
{ path: "/login", element: <LoginPage /> },
|
|
{ path: "/oauth/sim/authorize", element: <OAuthSimPage /> },
|
|
{
|
|
path: "/",
|
|
element: <App />,
|
|
children: [
|
|
{ index: true, element: <DashboardPage /> },
|
|
{ path: "accounts", element: <AccountsPage /> },
|
|
{ path: "domains", element: <DomainsPage /> },
|
|
{ path: "mailboxes", element: <MailboxesPage /> },
|
|
{ path: "inboxs", element: <InboxPage /> },
|
|
],
|
|
},
|
|
]);
|
|
|
|
/** # 函数
|
|
* 顶层壳:持有主题状态,注入 Context 与 ConfigProvider
|
|
*/
|
|
function Shell() {
|
|
const [dark, setDark] = useState(loadDarkMode);
|
|
|
|
useEffect(() => {
|
|
applyDarkMode(dark);
|
|
}, [dark]);
|
|
|
|
return (
|
|
<ThemeContext.Provider value={{ dark, toggle: () => setDark((v) => !v) }}>
|
|
<ConfigProvider locale={zhCN} theme={buildAntdTheme(dark)}>
|
|
<AntdApp>
|
|
<RouterProvider router={router} />
|
|
</AntdApp>
|
|
</ConfigProvider>
|
|
</ThemeContext.Provider>
|
|
);
|
|
}
|
|
|
|
/** 未登录统一跳登录页 */
|
|
setUnauthorizedHandler(() => {
|
|
if (!location.pathname.startsWith("/login")) {
|
|
location.href = "/login";
|
|
}
|
|
});
|
|
|
|
createRoot(document.getElementById("root")!).render(
|
|
<React.StrictMode>
|
|
<Shell />
|
|
</React.StrictMode>,
|
|
);
|