diff --git a/tradein-mvp/frontend/src/components/auth/NoAccessScreen.tsx b/tradein-mvp/frontend/src/components/auth/NoAccessScreen.tsx index b0f94ffa..7d13b55a 100644 --- a/tradein-mvp/frontend/src/components/auth/NoAccessScreen.tsx +++ b/tradein-mvp/frontend/src/components/auth/NoAccessScreen.tsx @@ -12,7 +12,7 @@ import { logout } from "@/lib/logout"; interface NoAccessScreenProps { - variant: "user" | "path" | "session" | "trial"; + variant: "user" | "path" | "session" | "trial" | "error"; path?: string; } @@ -22,16 +22,20 @@ export function NoAccessScreen({ variant, path }: NoAccessScreenProps) { ? "Сессия истекла" : variant === "trial" ? "Пробный доступ закончился" - : "Доступа нет"; + : variant === "error" + ? "Не удалось проверить доступ" + : "Доступа нет"; const subtitle = variant === "session" - ? "Сессия истекла или вы не авторизованы. Обновите страницу, чтобы войти снова." - : variant === "user" - ? "Учётная запись не привязана к роли. Обратитесь к администратору GenDesign — kopylov." - : variant === "path" - ? "У вашей роли нет доступа к этому разделу. Вернитесь на главную или обратитесь к администратору." - : null; + ? "Сессия истекла или вы не авторизованы. Нажмите «Войти снова», чтобы пройти авторизацию заново." + : variant === "error" + ? "Возникла техническая проблема при проверке доступа. Проверьте подключение к интернету и обновите страницу. Если ошибка повторяется — обратитесь к администратору GenDesign." + : variant === "user" + ? "Учётная запись не привязана к роли. Обратитесь к администратору GenDesign — kopylov." + : variant === "path" + ? "У вашей роли нет доступа к этому разделу. Вернитесь на главную или обратитесь к администратору." + : null; return (
) : null} - {/* Always-available logout — иначе locked/no-access юзер заперт: - UserMenu (где обычно «Выйти») на этом экране не рендерится. */} - + {/* Always-available primary action — иначе locked/no-access юзер заперт: + UserMenu (где обычно «Выйти») на этом экране не рендерится. + session/error — сбой временный (истёкшая сессия / сетевой сбой), + поэтому CTA — повторить попытку через reload, а не logout. + basic_auth Caddy: reload на top-level navigation триггерит + повторный auth-challenge браузера при отклонённых creds. */} + {variant === "session" || variant === "error" ? ( + + ) : ( + + )}
); diff --git a/tradein-mvp/frontend/src/components/auth/RouteGuard.tsx b/tradein-mvp/frontend/src/components/auth/RouteGuard.tsx index 6b0f20b8..c99f0cdb 100644 --- a/tradein-mvp/frontend/src/components/auth/RouteGuard.tsx +++ b/tradein-mvp/frontend/src/components/auth/RouteGuard.tsx @@ -58,7 +58,10 @@ export function RouteGuard({ children }: RouteGuardProps) { } if (error) { - return ; + // Не 401/403 — 500 / сетевой сбой / таймаут. НЕ переиспользуем variant="user" + // (текст «аккаунт не привязан к роли» вводит в заблуждение при техническом + // сбое) — отдельный экран с честной формулировкой + reload CTA. + return ; } if (!data) return null;