diff --git a/frontend/src/components/auth/RouteGuard.tsx b/frontend/src/components/auth/RouteGuard.tsx index a4891e04..2d8ae184 100644 --- a/frontend/src/components/auth/RouteGuard.tsx +++ b/frontend/src/components/auth/RouteGuard.tsx @@ -61,6 +61,21 @@ export function RouteGuard({ children }: RouteGuardProps) { // Path-level guard на прямой URL. Backend всё равно 403 на /api/v1/admin/*, // но мы не хотим показать «битый admin UI» — лучше сразу stop. if (!isPathAllowed(data.allowed_paths, data.deny_paths, pathname)) { + // #799: pilot-only юзер (единственная доступная зона — trade-in) на + // запрещённом пути главного фронта (корень `/` и пр.) → авто-redirect в + // /trade-in/ вместо дед-энда «Доступа нет». Условия: + // - текущий путь НЕ под /trade-in (иначе цикл; /trade-in — отдельный + // bundle за Caddy, этот гард его не обслуживает, но guard на всякий); + // - у роли есть доступ к /trade-in/ (т.е. trade-in — её рабочая зона). + // admin / multi-scope с разрешённым `/` сюда не попадают (isPathAllowed=true). + if ( + typeof window !== "undefined" && + !pathname.startsWith("/trade-in") && + isPathAllowed(data.allowed_paths, data.deny_paths, "/trade-in/") + ) { + window.location.replace("/trade-in/"); + return null; + } return ; }