--- import Layout from "../../layouts/Layout.astro"; import AtlasBreadcrumbs from "../../components/AtlasBreadcrumbs.astro"; import SourceBadge from "../../components/SourceBadge.astro"; import CoordinateRadar from "../../components/CoordinateRadar.astro"; import TackleGlyph from "../../components/TackleGlyph.astro"; import ActivityTimeline from "../../components/ActivityTimeline.astro"; import CatchList from "../../components/CatchList.astro"; import { activityLevel, api, ApiError, plural, type Activity, type Catch, type PaginatedActivity, type Spot } from "../../lib/api"; const { id } = Astro.params; let spot: Spot | null = null, catches: Catch[] = [], activity: Activity | null = null, unavailable = false; let timeline: { start: string; end: string; count: number }[] = []; try { const readable = id?.match(/^(.+)-(-?\d+)x(-?\d+)$/); const spotResult = readable ? await api(`/api/v1/spots/resolve?waterbody=${encodeURIComponent(readable[1])}&x=${readable[2]}&y=${readable[3]}`) : await api(`/api/v1/spots/${id}`); if (!readable) return Astro.redirect(`/spots/${spotResult.waterbody_slug}-${spotResult.x}x${spotResult.y}`, 301); const [catchResult, activityPaginated] = await Promise.all([api(`/api/v1/spots/${spotResult.id}/catches`), api(`/api/v1/activity?hours=24&waterbody=${encodeURIComponent(spotResult.waterbody_slug)}&limit=100`)]); spot = spotResult; catches = catchResult; activity = activityPaginated.items.find(item => item.spot_id === spotResult.id) ?? null; timeline = await api(`/api/v1/spots/${spotResult.id}/timeline`); } catch (error) { unavailable = true; Astro.response.status = error instanceof ApiError && [404, 422].includes(error.status) ? 404 : 503; if (Astro.response.status === 503) Astro.response.headers.set("Retry-After", "60"); } const level = activity ? activityLevel(activity.activity_score) : null; const spotDescription = spot ? `Свежие уловы и активность на точке ${spot.x}:${spot.y}, ${spot.waterbody}: рыба, вес, приманки и источники данных.` : "Данные точки ловли Russian Fishing 4."; const breadcrumbs = spot ? { "@context": "https://schema.org", "@type": "BreadcrumbList", itemListElement: [ { "@type": "ListItem", position: 1, name: "Сейчас клюёт", item: "https://rf4spotter.ru/" }, { "@type": "ListItem", position: 2, name: `${spot.waterbody} ${spot.x}:${spot.y}`, item: `https://rf4spotter.ru/spots/${spot.waterbody_slug}-${spot.x}x${spot.y}` }, ] } : null; --- {unavailable || !spot ?

Точка недоступна

API не ответил или такой точки нет.

: <>
{spot.waterbody}

Точка {spot.x}:{spot.y}

{spot.description}

{spot.catches_24h}за 24 часа
{spot.catches_3d}за 3 дня
{spot.catches_7d}за 7 дней
ТихоЕсть сигналыГорячо

Последние уловы

{catches.length ? :

Уловов пока нет

Для этой точки нет одобренных наблюдений.

}
}