cicy-desktop 2.1.201 → 2.1.202

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,7 +6,7 @@
6
6
  <link rel="icon" type="image/svg+xml" href="./favicon.svg" />
7
7
  <link rel="icon" type="image/png" sizes="256x256" href="./favicon-256.png" />
8
8
  <title>CiCy Desktop</title>
9
- <script type="module" crossorigin src="./assets/index-DTbVwDSc.js"></script>
9
+ <script type="module" crossorigin src="./assets/index-BjgNk0ef.js"></script>
10
10
  <link rel="stylesheet" crossorigin href="./assets/index-BShnCn32.css">
11
11
  </head>
12
12
  <body>
@@ -491,6 +491,10 @@
491
491
  "ready": "Update downloaded — restart to install",
492
492
  "error": "Update failed",
493
493
  "downloadBtn": "Download",
494
- "installBtn": "Install now"
494
+ "installBtn": "Install now",
495
+ "checkBtn": "Check for updates",
496
+ "checkingShort": "Checking…",
497
+ "checking": "Checking for updates…",
498
+ "upToDate": "Up to date (v{{v}})"
495
499
  }
496
500
  }
@@ -491,6 +491,10 @@
491
491
  "ready": "Téléchargé — redémarrez pour installer",
492
492
  "error": "Échec de la mise à jour",
493
493
  "downloadBtn": "Télécharger",
494
- "installBtn": "Installer"
494
+ "installBtn": "Installer",
495
+ "checkBtn": "Vérifier les mises à jour",
496
+ "checkingShort": "Vérification…",
497
+ "checking": "Vérification des mises à jour…",
498
+ "upToDate": "À jour (v{{v}})"
495
499
  }
496
500
  }
@@ -491,6 +491,10 @@
491
491
  "ready": "ダウンロード完了 — 再起動でインストール",
492
492
  "error": "アップデート失敗",
493
493
  "downloadBtn": "ダウンロード",
494
- "installBtn": "今すぐインストール"
494
+ "installBtn": "今すぐインストール",
495
+ "checkBtn": "アップデートを確認",
496
+ "checkingShort": "確認中…",
497
+ "checking": "アップデートを確認中…",
498
+ "upToDate": "最新です(v{{v}})"
495
499
  }
496
500
  }
@@ -491,6 +491,10 @@
491
491
  "ready": "新版本已下载,重启即可安装",
492
492
  "error": "更新失败",
493
493
  "downloadBtn": "下载",
494
- "installBtn": "立即安装"
494
+ "installBtn": "立即安装",
495
+ "checkBtn": "检查更新",
496
+ "checkingShort": "检查中…",
497
+ "checking": "正在检查更新…",
498
+ "upToDate": "已是最新版本 v{{v}}"
495
499
  }
496
500
  }
@@ -1311,6 +1311,7 @@ function Header({ me, welcome, onLogout, mitmTeam }) {
1311
1311
  const [trustOpen, setTrustOpen] = useState(false);
1312
1312
  const [auditOpen, setAuditOpen] = useState(false);
1313
1313
  const [termsOpen, setTermsOpen] = useState(false);
1314
+ const [checkingUpd, setCheckingUpd] = useState(false);
1314
1315
  const [appVer, setAppVer] = useState("");
1315
1316
  const wrap = useRef(null);
1316
1317
  // cicy-desktop's own version, shown at the very bottom of this menu.
@@ -1334,6 +1335,18 @@ function Header({ me, welcome, onLogout, mitmTeam }) {
1334
1335
  // Cloud dash pages: query-param routed, opened via a one-time handoff ticket
1335
1336
  // (no long-term token in the URL — see openCloudPage).
1336
1337
  const goDash = (query) => { openCloudPage(query); setOpen(false); };
1338
+ // 主动检查更新:有新版 → updater 广播 → 顶部 banner 出现;最新/出错 → toast 反馈。
1339
+ const checkUpdate = async () => {
1340
+ setOpen(false); setCheckingUpd(true);
1341
+ toast.show({ id: "app-update", message: tr("updateBanner.checking", "正在检查更新…"), status: "running" });
1342
+ try {
1343
+ const s = await window.cicy?.app?.checkUpdate?.();
1344
+ if (s?.status === "available") toast.show({ id: "app-update", message: tr("updateBanner.available", "发现新版本 v{{v}}", { v: s.version }), status: "done", ttl: 4000 });
1345
+ else if (s?.status === "up-to-date") toast.show({ id: "app-update", message: tr("updateBanner.upToDate", "已是最新版本 v{{v}}", { v: s.version || s.current }), status: "done", ttl: 3000 });
1346
+ else toast.show({ id: "app-update", message: tr("updateBanner.error", "更新失败") + (s?.error ? `:${s.error}` : ""), status: "error", ttl: 5000 });
1347
+ } catch (e) { toast.show({ id: "app-update", message: e.message, status: "error", ttl: 5000 }); }
1348
+ finally { setCheckingUpd(false); }
1349
+ };
1337
1350
  return (
1338
1351
  <>
1339
1352
  <header className="topbar">
@@ -1375,6 +1388,9 @@ function Header({ me, welcome, onLogout, mitmTeam }) {
1375
1388
  <button type="button" data-id="UserChip-terms" className="user-chip__menu-item" onClick={() => { setOpen(false); setTermsOpen(true); }}>
1376
1389
  {tr("firstRunTerms.menu", "用户协议")}
1377
1390
  </button>
1391
+ <button type="button" data-id="UserChip-check-update" className="user-chip__menu-item" disabled={checkingUpd} onClick={checkUpdate}>
1392
+ {checkingUpd ? tr("updateBanner.checkingShort", "检查中…") : tr("updateBanner.checkBtn", "检查更新")}
1393
+ </button>
1378
1394
  {/* HTTPS 审计入口暂时隐藏 */}
1379
1395
  {false && mitmTeam && (
1380
1396
  <div className="user-chip__menu-mitm" data-id="UserChip-mitm" onClick={(e) => e.stopPropagation()}>