fix(sf-fe): decode cad URL param in Server Component (B5 400 regression)

Backend /api/v1/parcels/{cad}/analyze rejects URL-encoded cad with HTTP 400.
PR #351 originally fixed by decoding params.cad in the Client Component. A7
split (PR #356) refactored into Server Component + AnalysisPageContent and
forgot to carry the decode forward — every analysis page request through cad
URL bar (e.g. /site-finder/analysis/66%3A41%3A0204016%3A10) now passes the
encoded form to the hooks, which encodeURIComponent again, producing %253A,
which FastAPI decodes once to %3A, which the regex rejects.

Fix: decodeURIComponent(cadRaw) at the Server Component boundary (page.tsx)
in both generateMetadata and the page export. Downstream sees canonical
'66:41:0204016:10' and re-encodes exactly once when building API URLs.
This commit is contained in:
lekss361 2026-05-18 07:01:44 +03:00
parent 91026dcc6f
commit bc2133e84e

View file

@ -9,10 +9,17 @@ interface PageProps {
params: Promise<{ cad: string }>;
}
// Next.js delivers `cad` URL-encoded (":" -> "%3A"); decode once at the page
// boundary so downstream hooks/components see canonical "66:41:0204016:10"
// and re-encode exactly once when building API URLs / hrefs (prevents the
// double-encode that made backend regex reject the cad with HTTP 400).
// Regression history: PR #351 added this in Client Component; A7 split into
// Server Component (PR #356) dropped it; this restores in Server boundary.
export async function generateMetadata({
params,
}: PageProps): Promise<Metadata> {
const { cad } = await params;
const { cad: cadRaw } = await params;
const cad = decodeURIComponent(cadRaw);
return {
title: `Анализ ${cad} — Site Finder`,
description: `Анализ инвестиционного участка ${cad}`,
@ -22,7 +29,8 @@ export async function generateMetadata({
// ── Page ──────────────────────────────────────────────────────────────────────
export default async function AnalysisPage({ params }: PageProps) {
const { cad } = await params;
const { cad: cadRaw } = await params;
const cad = decodeURIComponent(cadRaw);
return (
<Suspense