diff --git a/frontend/src/components/landing/TopNav.tsx b/frontend/src/components/landing/TopNav.tsx index 070a9f13..658df01c 100644 --- a/frontend/src/components/landing/TopNav.tsx +++ b/frontend/src/components/landing/TopNav.tsx @@ -23,12 +23,21 @@ import { useMe } from "@/lib/useMe"; interface NavItem { href: string; label: string; + /** + * true → путь обслуживает ОТДЕЛЬНОЕ приложение за Caddy (не этот Next-фронт), + * рендерим plain `` без prefetch/client-navigation. Иначе Next + * префетчит RSC для чужого маршрута → «Failed to fetch RSC payload» + + * ChunkLoadError в консоли (Caddy отдаёт 307 стороннего приложения). + */ + external?: boolean; } const NAV_ITEMS: NavItem[] = [ { href: "/analytics", label: "Аналитика" }, { href: "/site-finder", label: "Site Finder" }, - { href: "/trade-in/", label: "Trade-In" }, + // /trade-in/** проксируется Caddy в отдельный tradein-frontend (basePath + // /trade-in, canonical /trade-in/v2). Для ЭТОГО приложения — внешняя ссылка. + { href: "/trade-in/v2", label: "Trade-In", external: true }, { href: "/concept", label: "Концепция" }, { href: "/admin/scrape/all", label: "Админ" }, ]; @@ -81,19 +90,24 @@ export function TopNav({ rightSlot }: TopNavProps) { GenDesign
- {items.map((item) => ( - - {item.label} - - ))} + {items.map((item) => { + const linkStyle = { + fontSize: 14, + color: "var(--fg-secondary)", + textDecoration: "none", + } as const; + // Внешний маршрут (за Caddy → другое приложение): plain , без + // Next prefetch/RSC — иначе ChunkLoadError в консоли лендинга. + return item.external ? ( + + {item.label} + + ) : ( + + {item.label} + + ); + })} {rightSlot}
diff --git a/frontend/src/lib/__tests__/isPathAllowed.test.ts b/frontend/src/lib/__tests__/isPathAllowed.test.ts index 344b0b16..702d50b7 100644 --- a/frontend/src/lib/__tests__/isPathAllowed.test.ts +++ b/frontend/src/lib/__tests__/isPathAllowed.test.ts @@ -42,6 +42,8 @@ describe("isPathAllowed — pilot allowed paths (только trade-in)", () => const allowed: string[] = [ "/trade-in", "/trade-in/", + // canonical prod-маршрут (TopNav nav-item href, обслуживается tradein-frontend) + "/trade-in/v2", "/trade-in/123", "/trade-in/api/v1/search", "/trade-in/api/v1/me",