From 2902730b1efbd874c07eac821bea904b2e0595e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BB=D0=B5=D0=BA=D1=81=D0=B0=D0=BD=D0=B4=D1=80=20?= =?UTF-8?q?=D0=97=D0=B8=D0=BC=D0=B8=D0=BD?= Date: Sun, 10 May 2026 21:15:14 +0000 Subject: [PATCH] =?UTF-8?q?fix(admin-ui):=20RequireAuth=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D0=B1=D0=BB=D0=BE=D0=BA=D0=B8=D1=80=D1=83=D0=B5=D1=82=20UI=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BA=D0=B0=20silent=20SSO=20loading?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ordinis-admin-ui/src/auth/RequireAuth.tsx | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/ordinis-admin-ui/src/auth/RequireAuth.tsx b/ordinis-admin-ui/src/auth/RequireAuth.tsx index a62c76f..7f22b99 100644 --- a/ordinis-admin-ui/src/auth/RequireAuth.tsx +++ b/ordinis-admin-ui/src/auth/RequireAuth.tsx @@ -67,18 +67,17 @@ export function RequireAuth({ children }: { children: ReactNode }) { ) } - // Loading — initial OIDC bootstrap (silent SSO check). Показываем нейтральный - // spinner, чтобы избежать flash of unauthenticated UI если silent SSO успеет - // вернуть active session. - if (auth.isLoading) { - return ( -
-
Загрузка…
-
- ) - } + // ВАЖНО: НЕ блокируем UI пока {@code auth.isLoading=true}. Initial OIDC + // bootstrap может зависать на 10-20 сек если Keycloak silent SSO iframe + // блокируется X-Frame-Options или сеть медленная. Anonymous user в это + // время видит только spinner и может подумать что сайт сломан. + // Решение: рендерим children immediately. AuthBadge в top bar сам + // показывает loading state своим маленьким индикатором, а PUBLIC данные + // (которые backend отдаёт без auth) грузятся параллельно с silent SSO. + // Если silent SSO succeed позже — useAuth() обновит scope, кнопки + // create/edit активируются автоматически (canMutate реактивен). - // Anonymous OR authenticated — рендерим children всегда. UI в дочерних + // Anonymous OR authenticated OR loading — рендерим children всегда. UI в // компонентах сам адаптируется (через useAuth().isAuthenticated): // hide mutation buttons, show «Войти» CTA, тонировать blocked actions. return <>{children}