fix(tradein/auth): RouteGuard session/error screens with retry CTA (#2516)
Some checks failed
Deploy Trade-In / test (push) Blocked by required conditions
Deploy Trade-In / build-backend (push) Blocked by required conditions
Deploy Trade-In / build-frontend (push) Blocked by required conditions
Deploy Trade-In / build-browser (push) Blocked by required conditions
Deploy Trade-In / deploy (push) Blocked by required conditions
Deploy Trade-In / changes (push) Has been cancelled

Co-authored-by: bot-frontend <bot-frontend@gendsgn.local>
Co-committed-by: bot-frontend <bot-frontend@gendsgn.local>
This commit is contained in:
bot-frontend 2026-07-13 20:19:12 +00:00 committed by lekss361
parent d530602fbd
commit 2c5b30f8c9
2 changed files with 61 additions and 29 deletions

View file

@ -12,7 +12,7 @@
import { logout } from "@/lib/logout"; import { logout } from "@/lib/logout";
interface NoAccessScreenProps { interface NoAccessScreenProps {
variant: "user" | "path" | "session" | "trial"; variant: "user" | "path" | "session" | "trial" | "error";
path?: string; path?: string;
} }
@ -22,16 +22,20 @@ export function NoAccessScreen({ variant, path }: NoAccessScreenProps) {
? "Сессия истекла" ? "Сессия истекла"
: variant === "trial" : variant === "trial"
? "Пробный доступ закончился" ? "Пробный доступ закончился"
: "Доступа нет"; : variant === "error"
? "Не удалось проверить доступ"
: "Доступа нет";
const subtitle = const subtitle =
variant === "session" variant === "session"
? "Сессия истекла или вы не авторизованы. Обновите страницу, чтобы войти снова." ? "Сессия истекла или вы не авторизованы. Нажмите «Войти снова», чтобы пройти авторизацию заново."
: variant === "user" : variant === "error"
? "Учётная запись не привязана к роли. Обратитесь к администратору GenDesign — kopylov." ? "Возникла техническая проблема при проверке доступа. Проверьте подключение к интернету и обновите страницу. Если ошибка повторяется — обратитесь к администратору GenDesign."
: variant === "path" : variant === "user"
? "У вашей роли нет доступа к этому разделу. Вернитесь на главную или обратитесь к администратору." ? "Учётная запись не привязана к роли. Обратитесь к администратору GenDesign — kopylov."
: null; : variant === "path"
? "У вашей роли нет доступа к этому разделу. Вернитесь на главную или обратитесь к администратору."
: null;
return ( return (
<main <main
@ -118,26 +122,51 @@ export function NoAccessScreen({ variant, path }: NoAccessScreenProps) {
{path} {path}
</p> </p>
) : null} ) : null}
{/* Always-available logout иначе locked/no-access юзер заперт: {/* Always-available primary action иначе locked/no-access юзер заперт:
UserMenu (где обычно «Выйти») на этом экране не рендерится. */} UserMenu (где обычно «Выйти») на этом экране не рендерится.
<button session/error сбой временный (истёкшая сессия / сетевой сбой),
type="button" поэтому CTA повторить попытку через reload, а не logout.
onClick={() => logout()} basic_auth Caddy: reload на top-level navigation триггерит
style={{ повторный auth-challenge браузера при отклонённых creds. */}
marginTop: 20, {variant === "session" || variant === "error" ? (
background: "var(--accent)", <button
color: "#FFFFFF", type="button"
border: "none", onClick={() => window.location.reload()}
borderRadius: 8, style={{
padding: "10px 16px", marginTop: 20,
fontSize: 14, background: "var(--accent)",
fontWeight: 500, color: "#FFFFFF",
cursor: "pointer", border: "none",
fontFamily: "inherit", borderRadius: 8,
}} padding: "10px 16px",
> fontSize: 14,
Выйти fontWeight: 500,
</button> cursor: "pointer",
fontFamily: "inherit",
}}
>
{variant === "session" ? "Войти снова" : "Обновить страницу"}
</button>
) : (
<button
type="button"
onClick={() => logout()}
style={{
marginTop: 20,
background: "var(--accent)",
color: "#FFFFFF",
border: "none",
borderRadius: 8,
padding: "10px 16px",
fontSize: 14,
fontWeight: 500,
cursor: "pointer",
fontFamily: "inherit",
}}
>
Выйти
</button>
)}
</div> </div>
</main> </main>
); );

View file

@ -58,7 +58,10 @@ export function RouteGuard({ children }: RouteGuardProps) {
} }
if (error) { if (error) {
return <NoAccessScreen variant="user" />; // Не 401/403 — 500 / сетевой сбой / таймаут. НЕ переиспользуем variant="user"
// (текст «аккаунт не привязан к роли» вводит в заблуждение при техническом
// сбое) — отдельный экран с честной формулировкой + reload CTA.
return <NoAccessScreen variant="error" />;
} }
if (!data) return null; if (!data) return null;