diff --git a/apps/web/src/pages/media.astro b/apps/web/src/pages/media.astro index 23d2721..a3c1d34 100644 --- a/apps/web/src/pages/media.astro +++ b/apps/web/src/pages/media.astro @@ -8,10 +8,11 @@ const allowed = new Set(["fish", "waterbody", "tackle", "reference"]); const requested = Astro.url.searchParams.get("type") ?? "fish"; const type = allowed.has(requested) ? requested : "fish"; const requestedRole = Astro.url.searchParams.get("role") ?? ""; +const search = Astro.url.searchParams.get("q")?.trim() ?? ""; const roleOptions: Record> = { waterbody: [["waterbody_cover", "Заставки"], ["waterbody_map", "Карты"], ["waterbody_depth_map", "Карты глубин"], ["waterbody_screenshot", "Скриншоты"]], tackle: [["tackle_card", "Карточки снастей"], ["tackle_detail", "Детали снастей"], ["rig_diagram", "Схемы сборок"], ["tackle_screenshot", "Скриншоты снастей"]] }; const selectedRole = (roleOptions[type] ?? []).some(([value]) => value === requestedRole) ? requestedRole : ""; let assets: MediaAsset[] = [], unavailable = false; -try { const query = new URLSearchParams({ entity_type: type }); if (selectedRole) query.set("media_role", selectedRole); assets = await api(`/api/v1/media/catalog?${query}`); } catch { unavailable = true; } +try { const query = new URLSearchParams({ entity_type: type }); if (selectedRole) query.set("media_role", selectedRole); assets = await api(`/api/v1/media/catalog?${query}`); if (search) { const needle = search.toLocaleLowerCase("ru-RU"); assets = assets.filter(asset => (asset.label ?? "").toLocaleLowerCase("ru-RU").includes(needle)); } } catch { unavailable = true; } if (unavailable) { Astro.response.status = 503; Astro.response.headers.set("Retry-After", "60"); @@ -23,7 +24,7 @@ const labels: Record = {fish:"Рыбы",waterbody:"Водоёмы
- {roleOptions[type]?.length > 0 &&
{selectedRole && Сбросить}
} +
{roleOptions[type]?.length > 0 && }{(selectedRole || search) && Сбросить}
{unavailable ? : assets.length ?
{assets.map(asset =>

{asset.label ?? "Без подписи"}

{labels[asset.entity_type]}
)}
: }