tradein/ui: чистить TanStack Query cache при смене identity (login/logout) #2567

Open
opened 2026-07-30 19:09:08 +00:00 by lekss361 · 0 comments
Owner

Найдено при ревью PR #2565 (team-дашборд, эпик #2549). Не регрессия этого PR — существующий паттерн всего tradein-frontend, но с появлением ролевки цена ошибки выросла.

Проблема

useLogout.ts и login/page.tsx инвалидируют только ME_QUERY_KEY. Кэш остальных запросов — включая новый ["team","employees",…] (список сотрудников, квоты, история оценок) — переживает смену пользователя в той же вкладке.

Сценарий: менеджер работает в дашборде → выходит → на том же устройстве входит сотрудник (или другой менеджер) → до первого рефетча в кэше лежат данные чужой организации. Backend их больше не отдаст, но отрисоваться из кэша они могут.

Что сделать

queryClient.clear() (или прицельная инвалидация всех ключей, кроме публичных) при:

  • успешном logout — в useLogout.ts,
  • успешном login — в login/page.tsx (на случай входа под другим юзером без предварительного выхода),
  • получении 401 в RouteGuard перед редиректом на /login.

DoD

Проверка на проде: войти менеджером, открыть «Команду», выйти, войти сотрудником — в дашборде/девтулзах нет данных предыдущей организации. Смена identity без перезагрузки вкладки не оставляет старых данных ни в одном экране.

Scope: frontend-engineer, ~1 файл + 2 точки вызова.

Найдено при ревью PR #2565 (team-дашборд, эпик #2549). Не регрессия этого PR — существующий паттерн всего tradein-frontend, но с появлением ролевки цена ошибки выросла. ## Проблема `useLogout.ts` и `login/page.tsx` инвалидируют только `ME_QUERY_KEY`. Кэш остальных запросов — включая новый `["team","employees",…]` (список сотрудников, квоты, история оценок) — переживает смену пользователя в той же вкладке. Сценарий: менеджер работает в дашборде → выходит → на том же устройстве входит сотрудник (или другой менеджер) → до первого рефетча в кэше лежат данные чужой организации. Backend их больше не отдаст, но отрисоваться из кэша они могут. ## Что сделать `queryClient.clear()` (или прицельная инвалидация всех ключей, кроме публичных) при: - успешном logout — в `useLogout.ts`, - успешном login — в `login/page.tsx` (на случай входа под другим юзером без предварительного выхода), - получении 401 в RouteGuard перед редиректом на `/login`. ## DoD Проверка на проде: войти менеджером, открыть «Команду», выйти, войти сотрудником — в дашборде/девтулзах нет данных предыдущей организации. Смена identity без перезагрузки вкладки не оставляет старых данных ни в одном экране. Scope: frontend-engineer, ~1 файл + 2 точки вызова.
Sign in to join this conversation.
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#2567
No description provided.