diff options
Diffstat (limited to 'web/frontend/sync.ts')
| -rw-r--r-- | web/frontend/sync.ts | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/web/frontend/sync.ts b/web/frontend/sync.ts index 000dcfc..f58d224 100644 --- a/web/frontend/sync.ts +++ b/web/frontend/sync.ts @@ -1,4 +1,4 @@ -import type { SyncErrorEvent, SyncProgress } from "./types.js"; +import type { RateLimitSnapshot, SyncErrorEvent, SyncProgress } from "./types.js"; import { requireElement } from "./dom.js"; const isSyncProgress = (data: SyncProgress | SyncErrorEvent): data is SyncProgress => "total" in data; @@ -18,12 +18,28 @@ export const mountSync = (): void => { error.textContent = message; error.hidden = false; }; + const getRateLimit = (data: SyncProgress | SyncErrorEvent): RateLimitSnapshot | undefined => { + if ("rateLimit" in data && data.rateLimit) return data.rateLimit; + if ("progress" in data && data.progress?.rateLimit) return data.progress.rateLimit; + return undefined; + }; + + const formatRateLimit = (data: SyncProgress | SyncErrorEvent): string => { + const rl = getRateLimit(data); + if (!rl) return ""; + const parts: string[] = []; + if (rl.read?.limitDaily) parts.push(`Read ${rl.read.usageDaily}/${rl.read.limitDaily} daily`); + if (rl.read?.limit15) parts.push(`${rl.read.usage15}/${rl.read.limit15} (15-min)`); + if (parts.length === 0 && rl.overall?.limitDaily) parts.push(`Overall ${rl.overall.usageDaily}/${rl.overall.limitDaily} daily`); + return parts.length ? ` · ${parts.join(" · ")}` : ""; + }; + const updateProgress = (progress: SyncProgress): void => { progressPanel.hidden = false; progressBar.max = Math.max(progress.total, 1); progressBar.value = progress.completed; progressCount.textContent = `${progress.completed} / ${progress.total}`; - progressDetails.textContent = `${progress.imported} imported · ${progress.skipped} skipped`; + progressDetails.textContent = `${progress.imported} imported · ${progress.skipped} skipped${formatRateLimit(progress)}`; }; const handleEvent = (eventName: string, data: SyncProgress | SyncErrorEvent): boolean => { if (eventName === "progress") { @@ -34,7 +50,7 @@ export const mountSync = (): void => { if (eventName === "complete") { if (!isSyncProgress(data)) throw new Error("Invalid Strava sync completion event"); updateProgress(data); - notice.textContent = `Sync complete: ${data.imported} imported, ${data.skipped} skipped.`; + notice.textContent = `Sync complete: ${data.imported} imported, ${data.skipped} skipped.${formatRateLimit(data)}`; notice.hidden = false; return true; } |
