fix(web): 强制同步运行中禁用按钮——列表/详情统一 sync_status=running 判定

- 列表行与监控详情页:sync_status=running 时按钮显示「同步中…」并禁用,
  防止与调度器并发触发导致 409;自有账号详情请求期间 loading 禁用
- conflictMessage:409/503 无 hint 时也透出后端分类 error 文案,
  兜住「请求失败」空白提示;回归见 TestCompetitorSyncClaimFailureClassification
This commit is contained in:
2026-09-30 12:55:41 +08:00
parent c6a4d20c03
commit d535f178d6
4 changed files with 18 additions and 7 deletions
+1
View File
@@ -137,6 +137,7 @@ export default function Page() {
<Space>
<Button onClick={() => history.push('/accounts')}>返回社媒账号</Button>
<Button
loading={actionBusy}
disabled={actionBusy || !account}
onClick={async () => {
// 强制同步:后端复用账号自身运行环境采集,需已登录+环境就绪(否则 409/503 提示原因)。
@@ -65,15 +65,19 @@ export default function Page() {
}, [loadCompetitor]);
const syncMeta = syncStatusMeta[competitor?.sync_status ?? ''] || { label: competitor?.sync_status || '—' };
// 同步进行中(调度器采集或手动同步):按钮禁用防止重复触发,后端抢锁失败也会返回 409 分类提示兜底。
const syncRunning = competitor?.sync_status === 'running';
// 页头 actions:返回/同步/暂停恢复,对齐账号详情页形态。
usePageActions(
<Space>
<Button onClick={() => history.push('/accounts/monitoring')}>返回监控账号</Button>
<Button
disabled={actionBusy || !competitor}
loading={actionBusy}
disabled={actionBusy || syncRunning || !competitor}
onClick={async () => {
// 强制同步:后端用临时匿名浏览器采集公开作品,无需自有账号身份。
// 强制同步:后端用临时匿名浏览器采集公开作品,无需自有账号身份;
// 409/503 直接展示后端分类文案(同步中/已停用/网关不可用)。
if (!competitor) return;
setActionBusy(true);
try {
@@ -87,7 +91,7 @@ export default function Page() {
}
}}
>
强制同步
{syncRunning ? '同步中…' : '强制同步'}
</Button>
<Button
type="primary"
@@ -111,7 +115,7 @@ export default function Page() {
{competitor ? (competitor.enabled ? '暂停监控' : '恢复监控') : '暂停监控'}
</Button>
</Space>,
[competitor?.id, competitor?.enabled],
[competitor?.id, competitor?.enabled, competitor?.sync_status],
);
if (pending) return <Card loading />;