diff --git a/apps/web/src/pages/waterbodies/[slug].astro b/apps/web/src/pages/waterbodies/[slug].astro index a3d9802..5aa95d5 100644 --- a/apps/web/src/pages/waterbodies/[slug].astro +++ b/apps/web/src/pages/waterbodies/[slug].astro @@ -17,14 +17,21 @@ const requestedHours = Astro.url.searchParams.get("hours") ?? "72"; const hours = ["24", "72", "168"].includes(requestedHours) ? requestedHours : "72"; const periodLabel = { "24": "24 часа", "72": "72 часа", "168": "7 дней" }[hours]; const requestedOffset = Number(Astro.url.searchParams.get("offset") ?? 0); -const offset = Number.isInteger(requestedOffset) && requestedOffset >= 0 ? requestedOffset : 0; +let offset = Number.isInteger(requestedOffset) && requestedOffset >= 0 ? requestedOffset : 0; const activityLimit = 24; let water: DictionaryItem | undefined, items: Activity[] = [], media: MediaAsset[] = [], totalItems = 0, unavailable = false; try { const [waters, waterMedia] = await Promise.all([api("/api/v1/waterbodies?limit=500"), api("/api/v1/media/catalog?entity_type=waterbody")]); media = waterMedia; water = waters.find(item => item.slug === slug); - if (water) { const paginated = await api(`/api/v1/activity?hours=${hours}&waterbody=${encodeURIComponent(water.slug)}&limit=${activityLimit}&offset=${offset}`); items = paginated.items; totalItems = paginated.total; } + if (water) { + let paginated = await api(`/api/v1/activity?hours=${hours}&waterbody=${encodeURIComponent(water.slug)}&limit=${activityLimit}&offset=${offset}`); + if (paginated.total > 0 && offset >= paginated.total) { + offset = Math.floor((paginated.total - 1) / activityLimit) * activityLimit; + paginated = await api(`/api/v1/activity?hours=${hours}&waterbody=${encodeURIComponent(water.slug)}&limit=${activityLimit}&offset=${offset}`); + } + items = paginated.items; totalItems = paginated.total; + } } catch { unavailable = true; } if (unavailable) { Astro.response.status = 503;