diff --git a/tradein-mvp/frontend/src/components/auth/NoAccessScreen.tsx b/tradein-mvp/frontend/src/components/auth/NoAccessScreen.tsx index 3afffb4f..06ef425d 100644 --- a/tradein-mvp/frontend/src/components/auth/NoAccessScreen.tsx +++ b/tradein-mvp/frontend/src/components/auth/NoAccessScreen.tsx @@ -10,15 +10,17 @@ */ interface NoAccessScreenProps { - variant: "user" | "path"; + variant: "user" | "path" | "session"; path?: string; } export function NoAccessScreen({ variant, path }: NoAccessScreenProps) { const subtitle = - variant === "user" - ? "Учётная запись не привязана к роли. Обратитесь к администратору GenDesign — kopylov." - : "У вашей роли нет доступа к этому разделу. Вернитесь на главную или обратитесь к администратору."; + variant === "session" + ? "Сессия истекла или вы не авторизованы. Обновите страницу, чтобы войти снова." + : variant === "user" + ? "Учётная запись не привязана к роли. Обратитесь к администратору GenDesign — kopylov." + : "У вашей роли нет доступа к этому разделу. Вернитесь на главную или обратитесь к администратору."; return (
- Доступа нет + {variant === "session" ? "Сессия истекла" : "Доступа нет"}

{children}; + // Dev without Caddy: 401 is normal, mount the app so local dev works. + // Prod: mounting children on 401 causes TanStack Query re-subscribe storm + // (each new observer on errored query triggers a refetch). Show session screen + // instead — prevents the subtree from mounting, kills the loop. + if (process.env.NODE_ENV !== "production") return <>{children}; + return ; } if (error instanceof HTTPError && error.status === 403) {