From 1c4065a26c7727cf2b4249f964f4ec5e51b3dc17 Mon Sep 17 00:00:00 2001 From: IK Date: Mon, 21 Sep 2026 20:08:45 +0700 Subject: [PATCH] feat: search fish catalog --- apps/web/src/pages/fish/index.astro | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/web/src/pages/fish/index.astro b/apps/web/src/pages/fish/index.astro index d4ff1d7..9401a8d 100644 --- a/apps/web/src/pages/fish/index.astro +++ b/apps/web/src/pages/fish/index.astro @@ -8,14 +8,17 @@ import Pagination from "../../components/Pagination.astro"; import { api, type DictionaryItem, type MediaAsset } from "../../lib/api"; import { findMediaByLabel } from "../../lib/media"; const params = Astro.url.searchParams; +const search = params.get("q")?.trim() ?? ""; const pageLimit = 48; const requestedOffset = Number(params.get("offset") ?? 0); let offset = Number.isInteger(requestedOffset) && requestedOffset >= 0 ? requestedOffset : 0; let fishes: DictionaryItem[] = [], allFishes: DictionaryItem[] = [], media: MediaAsset[] = [], unavailable = false; try { [allFishes, media] = await Promise.all([api("/api/v1/fishes?limit=500"), api("/api/v1/media/catalog?entity_type=fish")]); - if (allFishes.length > 0 && offset >= allFishes.length) offset = Math.floor((allFishes.length - 1) / pageLimit) * pageLimit; - fishes = allFishes.slice(offset, offset + pageLimit); + const matchingFishes = search ? allFishes.filter(item => item.name_ru.toLocaleLowerCase("ru-RU").includes(search.toLocaleLowerCase("ru-RU"))) : allFishes; + if (matchingFishes.length > 0 && offset >= matchingFishes.length) offset = Math.floor((matchingFishes.length - 1) / pageLimit) * pageLimit; + fishes = matchingFishes.slice(offset, offset + pageLimit); + allFishes = matchingFishes; } catch { unavailable = true; } if (unavailable) { Astro.response.status = 503; @@ -25,6 +28,7 @@ if (unavailable) { --- - {unavailable ? : } +
{search && Сбросить}
+ {unavailable ? : fishes.length ? : } {!unavailable && }