ActivityDetail: fetch timeseries in parallel with detail JSON to cut load time

This commit is contained in:
Davide Scaini
2026-05-14 18:22:05 +02:00
parent c36b95e041
commit 16965a7645
+15 -3
View File
@@ -52,15 +52,27 @@
.then(d => { segmentEfforts = d; })
.catch(() => {});
// Start timeseries fetch immediately in parallel with detail — the URL is
// predictable from detail_url, saving a full sequential round-trip.
const detailUrl = activity.detail_url ?? '';
const earlyTsPromise: Promise<Timeseries | null> = detailUrl && !detailUrl.startsWith('idb:')
? loadTimeseries(
detailUrl.replace(/\.json$/, '.timeseries.json').replace(/^.*activities\//, 'activities/'),
detailUrl,
base,
).catch(() => null)
: Promise.resolve(null);
try {
detail = await loadActivity(activity.id, activity.detail_url ?? '', base);
detail = await loadActivity(activity.id, detailUrl, base);
if (!detail) throw new Error('Activity not found');
// Use embedded timeseries (IDB activities) or lazy-fetch from URL
// Use embedded timeseries (IDB activities) or the already-in-flight fetch
if (detail.timeseries) {
timeseries = detail.timeseries;
} else if (detail.timeseries_url) {
timeseriesLoading = true;
timeseries = await loadTimeseries(detail.timeseries_url, activity.detail_url ?? '', base);
timeseries = await earlyTsPromise ??
await loadTimeseries(detail.timeseries_url, detailUrl, base);
timeseriesLoading = false;
}
} catch (e: any) {