feat: v2.1.0 界面与凭据改进 —— 单一 API/MCP Key、邮件 Markdown 正文、/inboxs 域名筛选、暗色主题
- 单一 Key:API 与 MCP 共用一个 wmh_ Key,凭据迁移至 settings 表(0004 删除 api_credentials) - Markdown:入库时 HTML→Markdown(mailhook 同思路),webhook payload 新增 markdown 字段 - /emails 路由改为 /inboxs 并支持域名筛选;设置按钮移入头像下拉 - 主题切换按钮(头像左侧,亮/暗持久化);设置模态仅 全局 Webhook/账号密码 两 tab 且高度限屏 - 列表操作列按钮加 SVG 图标;mailboxes 去 Webhook 列;最近邮件加收件人列
This commit is contained in:
+22
-21
@@ -99,7 +99,14 @@ export const stats = () =>
|
||||
deliveries_pending: number;
|
||||
oauth_connections: number;
|
||||
worker_credentials: number;
|
||||
recent_emails: { id: string; subject: string; from_address: string; received_at: string; size: number }[];
|
||||
recent_emails: {
|
||||
id: string;
|
||||
subject: string;
|
||||
from_address: string;
|
||||
to_addresses: string;
|
||||
received_at: string;
|
||||
size: number;
|
||||
}[];
|
||||
}>("/api/admin/stats");
|
||||
|
||||
/** 手动触发 Cron */
|
||||
@@ -243,8 +250,13 @@ export interface EmailRow {
|
||||
attachment_count: number;
|
||||
}
|
||||
|
||||
export const listEmails = (params: { mailbox_id?: string; q?: string; limit?: number; offset?: number }) =>
|
||||
api<{ items: EmailRow[]; total: number }>(`/api/emails${qs(params)}`);
|
||||
export const listEmails = (params: {
|
||||
domain_id?: string;
|
||||
mailbox_id?: string;
|
||||
q?: string;
|
||||
limit?: number;
|
||||
offset?: number;
|
||||
}) => api<{ items: EmailRow[]; total: number }>(`/api/emails${qs(params)}`);
|
||||
|
||||
export interface EmailDetail {
|
||||
email: EmailRow & { text_body: string | null; html_body: string | null; raw_storage_key: string; cc_addresses: string };
|
||||
@@ -260,6 +272,7 @@ export const deleteEmail = (id: string) => api(`/api/emails/${id}`, "DELETE");
|
||||
export interface SettingsInfo {
|
||||
username: string;
|
||||
webhook: { url: string; headers: Record<string, string>; has_key: boolean; key_last4: string };
|
||||
api_key: { has_key: boolean; key_last4: string; created_at: string | null };
|
||||
}
|
||||
|
||||
export const getSettings = () => api<SettingsInfo>("/api/settings");
|
||||
@@ -272,23 +285,11 @@ export const putSettings = (body: {
|
||||
export const changePassword = (old_password: string, new_password: string) =>
|
||||
api("/api/settings/password", "PUT", { old_password, new_password });
|
||||
|
||||
/* ---- API/MCP Keys(设置模态窗口内使用) ---- */
|
||||
/* ---- API/MCP Key(单一 Key,设置模态窗口内使用;API 与 MCP 共用) ---- */
|
||||
|
||||
export interface KeyRow {
|
||||
id: string;
|
||||
kind: "api" | "mcp";
|
||||
name: string;
|
||||
key_last4: string;
|
||||
created_at: string;
|
||||
revoked_at: string | null;
|
||||
last_used_at: string | null;
|
||||
}
|
||||
/** 生成(轮换)Key:明文仅本次返回 */
|
||||
export const createApiKey = () =>
|
||||
api<{ ok: boolean; key: string; created_at: string }>("/api/settings/api-key", "POST");
|
||||
|
||||
export const listKeys = () => api<{ items: KeyRow[] }>("/api/keys");
|
||||
|
||||
export const createKey = (kind: "api" | "mcp", name?: string) =>
|
||||
api<{ ok: boolean; id: string; kind: string; key: string }>("/api/keys", "POST", { kind, name });
|
||||
|
||||
export const revokeKey = (id: string) => api(`/api/keys/${id}/revoke`, "POST");
|
||||
|
||||
export const deleteKey = (id: string) => api(`/api/keys/${id}`, "DELETE");
|
||||
/** 撤销并删除 Key */
|
||||
export const deleteApiKey = () => api("/api/settings/api-key", "DELETE");
|
||||
|
||||
Reference in New Issue
Block a user