fix(landing): Trade-In nav как внешний <a> на /trade-in/v2 (ChunkLoadError) (#2365)
All checks were successful
Deploy / changes (push) Successful in 10s
Deploy / build-backend (push) Has been skipped
Deploy / build-worker (push) Has been skipped
Deploy / build-frontend (push) Successful in 3m18s
Deploy / deploy (push) Successful in 1m20s

This commit is contained in:
bot-backend 2026-07-04 01:10:57 +00:00
parent d31fabd102
commit 38f703c8ec
2 changed files with 30 additions and 14 deletions

View file

@ -23,12 +23,21 @@ import { useMe } from "@/lib/useMe";
interface NavItem { interface NavItem {
href: string; href: string;
label: string; label: string;
/**
* true путь обслуживает ОТДЕЛЬНОЕ приложение за Caddy (не этот Next-фронт),
* рендерим plain `<a>` без prefetch/client-navigation. Иначе Next
* префетчит RSC для чужого маршрута «Failed to fetch RSC payload» +
* ChunkLoadError в консоли (Caddy отдаёт 307 стороннего приложения).
*/
external?: boolean;
} }
const NAV_ITEMS: NavItem[] = [ const NAV_ITEMS: NavItem[] = [
{ href: "/analytics", label: "Аналитика" }, { href: "/analytics", label: "Аналитика" },
{ href: "/site-finder", label: "Site Finder" }, { 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: "/concept", label: "Концепция" },
{ href: "/admin/scrape/all", label: "Админ" }, { href: "/admin/scrape/all", label: "Админ" },
]; ];
@ -81,19 +90,24 @@ export function TopNav({ rightSlot }: TopNavProps) {
GenDesign GenDesign
</Link> </Link>
<div style={{ display: "flex", gap: 24, alignItems: "center" }}> <div style={{ display: "flex", gap: 24, alignItems: "center" }}>
{items.map((item) => ( {items.map((item) => {
<Link const linkStyle = {
key={item.href} fontSize: 14,
href={item.href} color: "var(--fg-secondary)",
style={{ textDecoration: "none",
fontSize: 14, } as const;
color: "var(--fg-secondary)", // Внешний маршрут (за Caddy → другое приложение): plain <a>, без
textDecoration: "none", // Next prefetch/RSC — иначе ChunkLoadError в консоли лендинга.
}} return item.external ? (
> <a key={item.href} href={item.href} style={linkStyle}>
{item.label} {item.label}
</Link> </a>
))} ) : (
<Link key={item.href} href={item.href} style={linkStyle}>
{item.label}
</Link>
);
})}
{rightSlot} {rightSlot}
</div> </div>
</nav> </nav>

View file

@ -42,6 +42,8 @@ describe("isPathAllowed — pilot allowed paths (только trade-in)", () =>
const allowed: string[] = [ const allowed: string[] = [
"/trade-in", "/trade-in",
"/trade-in/", "/trade-in/",
// canonical prod-маршрут (TopNav nav-item href, обслуживается tradein-frontend)
"/trade-in/v2",
"/trade-in/123", "/trade-in/123",
"/trade-in/api/v1/search", "/trade-in/api/v1/search",
"/trade-in/api/v1/me", "/trade-in/api/v1/me",