feat: match settings card width to ops map and add backup download

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-08-02 09:23:08 +08:00
parent 667cee33fa
commit 352faf404c
6 changed files with 105 additions and 11 deletions
+30 -5
View File
@@ -2,6 +2,7 @@ import { FormEvent, useCallback, useEffect, useState } from "react";
import {
BackupInfo,
createBackup,
downloadBackup,
fetchAccountSettings,
fetchBackupInfo,
logout,
@@ -175,6 +176,24 @@ export default function SettingsPage() {
}
};
const runDownload = async () => {
if (!selectedBackup) {
setBackupErr("请选择要下载的备份");
return;
}
setBackupBusy(true);
setBackupErr(null);
setBackupMsg(null);
try {
await downloadBackup(selectedBackup);
setBackupMsg(`已开始下载:${selectedBackup}`);
} catch (ex) {
setBackupErr(String(ex));
} finally {
setBackupBusy(false);
}
};
if (!ready) {
return (
<div className="layout">
@@ -192,8 +211,7 @@ export default function SettingsPage() {
<div className="sub"></div>
<AppNav />
<div className="center-page">
<div className="tile settings-card">
<div className="tile settings-card">
<div className="settings-tabs">
<button
type="button"
@@ -212,7 +230,7 @@ export default function SettingsPage() {
</div>
{tab === "account" && (
<form onSubmit={submit}>
<form className="settings-form" onSubmit={submit}>
<div className="settings-title"></div>
{!authRequired && (
<p className="settings-hint">AUTH_SECRET=disabled .env </p>
@@ -275,7 +293,7 @@ export default function SettingsPage() {
)}
{tab === "backup" && (
<div>
<div className="settings-form">
<div className="settings-title"></div>
<p className="settings-hint">
<code>{backupInfo?.backup_dir || "/root/market_intel_backups"}</code>
@@ -366,6 +384,14 @@ export default function SettingsPage() {
>
{backupBusy ? "处理中…" : "立即备份"}
</button>
<button
type="button"
className="btn-primary"
disabled={backupBusy || !authRequired || !selectedBackup}
onClick={runDownload}
>
</button>
<button
type="button"
className="btn-danger"
@@ -379,7 +405,6 @@ export default function SettingsPage() {
</div>
</div>
)}
</div>
</div>
</div>
);