From ebc4b0e65c37c43f72abab8d1311b00b8d536236 Mon Sep 17 00:00:00 2001 From: IK Date: Mon, 21 Sep 2026 20:07:49 +0700 Subject: [PATCH] feat: paginate fish waterbody detail --- apps/web/src/pages/waterbodies/[slug]/[fish].astro | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/apps/web/src/pages/waterbodies/[slug]/[fish].astro b/apps/web/src/pages/waterbodies/[slug]/[fish].astro index afe8292..6a0c1f0 100644 --- a/apps/web/src/pages/waterbodies/[slug]/[fish].astro +++ b/apps/web/src/pages/waterbodies/[slug]/[fish].astro @@ -5,16 +5,20 @@ import AtlasBreadcrumbs from "../../../components/AtlasBreadcrumbs.astro"; import PageHero from "../../../components/PageHero.astro"; import StatePanel from "../../../components/StatePanel.astro"; import Layout from "../../../layouts/Layout.astro"; +import Pagination from "../../../components/Pagination.astro"; import { api, plural, type Activity, type DictionaryItem, type PaginatedActivity } from "../../../lib/api"; const { slug, fish: fishSlug } = Astro.params; 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]; -let water: DictionaryItem | undefined, fish: DictionaryItem | undefined, items: Activity[] = [], unavailable = false; +const requestedOffset = Number(Astro.url.searchParams.get("offset") ?? 0); +const offset = Number.isInteger(requestedOffset) && requestedOffset >= 0 ? requestedOffset : 0; +const activityLimit = 24; +let water: DictionaryItem | undefined, fish: DictionaryItem | undefined, items: Activity[] = [], totalItems = 0, unavailable = false; try { const [waters, fishes] = await Promise.all([api("/api/v1/waterbodies?limit=500"), api("/api/v1/fishes?limit=500")]); water = waters.find(item => item.slug === slug); fish = fishes.find(item => item.slug === fishSlug); - if (water && fish) { const paginated = await api(`/api/v1/activity?hours=${hours}&waterbody=${encodeURIComponent(water.slug)}&fish=${encodeURIComponent(fish.slug)}&limit=100`); items = paginated.items; } + if (water && fish) { const paginated = await api(`/api/v1/activity?hours=${hours}&waterbody=${encodeURIComponent(water.slug)}&fish=${encodeURIComponent(fish.slug)}&limit=${activityLimit}&offset=${offset}`); items = paginated.items; totalItems = paginated.total; } } catch { unavailable = true; } if (unavailable) { Astro.response.status = 503; @@ -27,7 +31,8 @@ const schema = valid ? { "@type":"CollectionPage", name:`${fish!.name_ru} на $ --- - + {valid && } {unavailable ? : !valid ? :
{items.length ? items.map(item => ) : }
} + {valid && }