aboutsummaryrefslogtreecommitdiff
path: root/web/frontend/sync.ts
diff options
context:
space:
mode:
Diffstat (limited to 'web/frontend/sync.ts')
-rw-r--r--web/frontend/sync.ts22
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;
}