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;