Skip to content

[Refactor] Разделить UI и side-effects в logout и нормализовать очистку кэша #47

@kapitulin24

Description

@kapitulin24

Контекст

Текущая реализация logout в useSignOut использует глобальный client.clear(), что может очищать больше данных, чем требуется, и делает поведение после выхода из аккаунта менее контролируемым.
Также SignOut используется внутри NavUser через DropdownMenuItem asChild, где важно унифицировать семантику действия и контракты компонентов.

Технические требования

  • Локация логики: src/features/auth/sign-out/ui/SignOut.tsx, src/features/auth/sign-out/model/useSignOut.ts, src/widgets/app-sidebar/ui/NavUser.tsx
  • Инструменты: @tanstack/react-query, Next.js router, AccessToken, sonner, shared/ui
  • Логика работы:
    1. Разделить презентационную кнопку SignOut и доменные side-effects в useSignOut; сделать прозрачный контракт (mutateAsync, callbacks).
    2. Заменить глобальное client.clear() на целевую очистку/инвалидацию auth/user/team query-ключей.
    3. Сохранить последовательность: отмена релевантных запросов -> очистка токена -> cache reset/invalidate -> редирект на routes.auth.signin() -> toast.
    4. Проверить интеграцию с NavUser и унифицировать семантику DropdownMenuItem + Button (доступность, disabled/loading состояние).

Цель и критерии приемки (Definition of Done)

  • База: Хук useSignOut имеет явный типизированный контракт и покрывает success/error сценарии.
  • Функционал: Выход из аккаунта стабильно очищает auth-состояние, перенаправляет на /signin, показывает корректный toast и не ломает dropdown.
  • Лимиты/SLA: Logout-сценарий завершается <= 1 сек после успешного ответа API; отсутствуют race conditions с параллельными запросами.
  • Интеграция: Обновлены query-key стратегии очистки для auth/user/team, проверена совместимость с NavUser, пройдены линтеры и типизация.

Важные указания

  • Производительность: Не выполнять полный сброс кэша приложения; очищать только затронутые доменные ключи.
  • Ошибки: На API-ошибках использовать предсказуемую ветку onError с человекочитаемым сообщением; не очищать локальное состояние до подтвержденного сценария.
  • Безопасность: Гарантировать удаление AccessToken в любом успешном logout-flow; исключить доступ к protected-данным после редиректа.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions