fix(tradein/auth): always-available logout button on NoAccessScreen #1986

Merged
lekss361 merged 1 commit from fix/tradein-logout-on-noaccess into main 2026-06-27 12:18:35 +00:00
Owner

Проблема

Залоченный/без-доступа юзер в Mera (trade-in) попадает в тупик: NoAccessScreen (экран для 403/denied/session/trial) не имеет кнопки выхода, а logout() живёт только внутри UserMenu, который на этом экране не рендерится. Выйти можно было только через DevTools-консоль или полный перезапуск браузера.

Фикс

  • logout() вынесен в общий util lib/logout.ts (basic-auth invalidation через logout:logout + hard-reload на /).
  • UserMenu импортирует его (поведение без изменений).
  • NoAccessScreen получает accent-кнопку «Выйти» для всех вариантов (user/path/session/trial), под контентом карточки. Telegram-ссылка на trial сохранена.
  • Зеркально применено в обоих фронтах (tradein-mvp + main frontend/) — MIRROR-инвариант.

Проверка

  • npm run type-check (tsc --noEmit) → exit 0 в обоих фронтах.
  • pre-commit (end-of-file-fixer, prettier, trailing-whitespace) — passed.
  • Post-deploy: быстрый playwright-smoke по вариантам NoAccessScreen (кнопка видна → logout → basic-auth prompt).

Заметки о дрейфе фронтов (применён эквивалент, не форс)

  • logout endpoint: tradein ${API_BASE_URL}/api/v1/me (basePath /trade-in) vs main литеральный /api/v1/me — сохранил оригинальное поведение каждого.
  • NoAccessScreen: tradein 4 варианта (inline-SVG, Telegram для trial) vs main 2 (lucide Lock). Кнопка добавлена в обоих под контентом.
## Проблема Залоченный/без-доступа юзер в Mera (trade-in) попадает в тупик: `NoAccessScreen` (экран для 403/denied/session/**trial**) не имеет кнопки выхода, а `logout()` живёт только внутри `UserMenu`, который на этом экране не рендерится. Выйти можно было только через DevTools-консоль или полный перезапуск браузера. ## Фикс - `logout()` вынесен в общий util `lib/logout.ts` (basic-auth invalidation через `logout:logout` + hard-reload на `/`). - `UserMenu` импортирует его (поведение без изменений). - `NoAccessScreen` получает accent-кнопку **«Выйти»** для **всех** вариантов (user/path/session/trial), под контентом карточки. Telegram-ссылка на `trial` сохранена. - Зеркально применено в обоих фронтах (tradein-mvp + main `frontend/`) — MIRROR-инвариант. ## Проверка - `npm run type-check` (tsc --noEmit) → exit 0 в обоих фронтах. - pre-commit (end-of-file-fixer, prettier, trailing-whitespace) — passed. - Post-deploy: быстрый playwright-smoke по вариантам NoAccessScreen (кнопка видна → logout → basic-auth prompt). ## Заметки о дрейфе фронтов (применён эквивалент, не форс) - logout endpoint: tradein `${API_BASE_URL}/api/v1/me` (basePath `/trade-in`) vs main литеральный `/api/v1/me` — сохранил оригинальное поведение каждого. - NoAccessScreen: tradein 4 варианта (inline-SVG, Telegram для trial) vs main 2 (lucide Lock). Кнопка добавлена в обоих под контентом.
lekss361 added 1 commit 2026-06-27 12:17:33 +00:00
fix(tradein/auth): always-available logout button on NoAccessScreen
All checks were successful
CI / changes (pull_request) Successful in 7s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 51s
CI / openapi-codegen-check (pull_request) Successful in 1m56s
a9dfe44f5c
Locked/no-access users (403/denied path/expired session/trial ended) were
trapped: NoAccessScreen had no logout control, and «Выйти» lived only inside
UserMenu, which does not render on the no-access screen. They could not switch
accounts without clearing browser basic-auth manually.

- Extract logout() into shared `lib/logout.ts` (single source of truth).
- UserMenu now imports it instead of a local copy (behaviour unchanged).
- NoAccessScreen renders an always-available «Выйти» accent button for every
  variant.

Mirrored across both frontends (tradein-mvp/frontend + main frontend) to keep
the MIRROR invariant in sync.
lekss361 scheduled this pull request to auto merge when all checks succeed 2026-06-27 12:18:30 +00:00
lekss361 merged commit 727f9b1f05 into main 2026-06-27 12:18:35 +00:00
lekss361 deleted branch fix/tradein-logout-on-noaccess 2026-06-27 12:18:35 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#1986
No description provided.