diff --git a/apps/web/src/pages/index.astro b/apps/web/src/pages/index.astro index e9fc387..ad2b697 100644 --- a/apps/web/src/pages/index.astro +++ b/apps/web/src/pages/index.astro @@ -16,7 +16,9 @@ const signalLimit = Number.isInteger(requestedSignalLimit) ? Math.min(48, Math.m let items: Activity[] = [], signals: PublicObservation[] = [], fishes: DictionaryItem[] = [], waterbodies: DictionaryItem[] = []; let hasMoreSignals = false, totalItems = 0; const filterError = !["6", "12", "24", "72"].includes(hours) || !["activity", "confidence", "freshness"].includes(sort); -let unavailable = false; +let unavailable = false, showNoIndex = false; +if (filterError) { showNoIndex = true; Astro.response.status = 422; } +if (unavailable) { showNoIndex = true; Astro.response.status = 503; Astro.response.headers.set("Retry-After", "60"); } try { let signalRows: PublicObservation[] = []; const signalParams = new URLSearchParams({ limit: String(signalLimit + 1) }); @@ -49,7 +51,7 @@ const datasetJsonLd = { creator: { "@type": "Organization", name: "RF4 Spotter" }, isAccessibleForFree: true, }; --- - +
RF4 Живая карта клёва

Выбирай место,
пока клюёт.

Свежие точки, рабочие приманки и честная оценка данных от игроков.

Туманное озеро на рассвете
Пульс водоёмов{items.length} {plural(items.length, ["точка показывает", "точки показывают", "точек показывают"])} активность
diff --git a/apps/web/src/pages/records.astro b/apps/web/src/pages/records.astro index fa7d7b0..b24cedf 100644 --- a/apps/web/src/pages/records.astro +++ b/apps/web/src/pages/records.astro @@ -5,11 +5,11 @@ import { api, kg, type DictionaryItem, type ImportRun, type OfficialRecord } fro const params = Astro.url.searchParams; const fish = params.get("fish") ?? ""; const waterbody = params.get("waterbody") ?? ""; -let records: OfficialRecord[] = [], runs: ImportRun[] = [], fishes: DictionaryItem[] = [], waterbodies: DictionaryItem[] = [], unavailable = false; -try { [records, runs, fishes, waterbodies] = await Promise.all([api(`/api/v1/records?${new URLSearchParams({ fish, waterbody })}`), api("/api/v1/imports?limit=1"), api("/api/v1/fishes"), api("/api/v1/waterbodies")]); } catch { unavailable = true; } +let records: OfficialRecord[] = [], runs: ImportRun[] = [], fishes: DictionaryItem[] = [], waterbodies: DictionaryItem[] = [], unavailable = false, showNoIndex = false; +try { [records, runs, fishes, waterbodies] = await Promise.all([api(`/api/v1/records?${new URLSearchParams({ fish, waterbody })}`), api("/api/v1/imports?limit=1"), api("/api/v1/fishes"), api("/api/v1/waterbodies")]); } catch { unavailable = true; showNoIndex = true; Astro.response.status = 503; Astro.response.headers.set("Retry-After", "60"); } const last = runs[0]; --- - +
Публичные данные RF4

Официальные
рекорды

{last ? `Импорт: ${last.status}` : "Импорт ещё не запускался"}{last?.finished_at && {new Date(last.finished_at).toLocaleString("ru-RU")} · {last.rows_seen} строк}
{(fish || waterbody) && Сбросить}
Официальный источник

Последние записи

{records.length} показано
diff --git a/apps/web/src/pages/report.astro b/apps/web/src/pages/report.astro index 88a2f9b..7c46263 100644 --- a/apps/web/src/pages/report.astro +++ b/apps/web/src/pages/report.astro @@ -24,7 +24,7 @@ const reportId = Astro.url.searchParams.get("report_id"); const form = document.querySelector(".report-form"); const key = "rf4-report-draft"; if (form && state === "create_error") { try { const draft = JSON.parse(sessionStorage.getItem(key) || "{}"); for (const [name, value] of Object.entries(draft)) { const field = form.elements.namedItem(name); if (field && "value" in field) field.value = value; } } catch {} document.querySelector("#form-error")?.focus(); } if (state === "sent") sessionStorage.removeItem(key); - form?.addEventListener("submit", (e) => { + form?.addEventListener("submit", () => { const btn = form.querySelector("button[type=submit]"); if (btn) { btn.disabled = true; btn.textContent = "Отправка..."; } const draft = {}; for (const [name, value] of new FormData(form)) if (typeof value === "string" && name !== "website") draft[name] = value;