Files
sfera-new/2025-09-18/ROUTING_ARCHITECTURE_FIX_PLAN.md
Veronika Smirnova 24a6ff74b5 feat: migrate from useAuth to AuthContext for centralized auth state
• Полная миграция 64 компонентов с useAuth на AuthContext
• Исправлена race condition в SMS регистрации
• Улучшена SSR совместимость с таймаутами
• Удалена дублирующая система регистрации
• Обновлена документация архитектуры аутентификации

Технические изменения:
- AuthContext.tsx: централизованная система состояния
- auth-flow.tsx: убрана агрессивная логика logout
- confirmation-step.tsx: исправлена передача телефона
- page.tsx: добавлена синхронизация состояния
- 64 файла: миграция useAuth → useAuthContext

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-19 17:21:52 +03:00

11 KiB
Raw Blame History

🎯 ПЛАН ИСПРАВЛЕНИЯ АРХИТЕКТУРЫ РОУТИНГА SFERA

Цель: Исправить критическую ошибку архитектуры где регистрация происходит на /dashboard


🚨 ТЕКУЩАЯ ПРОБЛЕМА

Что не работает:

  • Регистрация идет на /dashboard - семантически неправильно
  • AuthGuard создает второй AuthFlow на dashboard при незавершенной регистрации
  • Логическое противоречие: dashboard = для авторизованных, но используется для регистрации
  • Пользователь запутывается в flow регистрации

🔍 Корневая причина:

SMS верификация → токен есть → isAuthenticated: true
AuthContext → user: {...} НО user.organization: null  
AuthGuard → видит "незавершенная регистрация" → создает НОВЫЙ AuthFlow
Результат → сброс на step: "phone" вместо продолжения регистрации

🎯 ЦЕЛЕВАЯ АРХИТЕКТУРА

Правильная структура URL:

URL Назначение Пользователи Компонент
/ Корневая страница (роутер) Все app/page.tsx - логика перенаправления
/login Вход в систему Неавторизованные AuthFlow без параметров
/register Регистрация Неавторизованные + незавершенная регистрация AuthFlow с поддержкой кодов
/dashboard Панель управления Авторизованные с организацией DashboardHome через AuthGuard

🔄 Логика перенаправлений:

// app/page.tsx
if (isLoading) return <Loading />

if (user?.organization) {
  // Полностью авторизован → в dashboard
  router.replace('/dashboard')
} else if (user && !user.organization) {
  // Незавершенная регистрация → продолжить на /register
  router.replace('/register')
} else {
  // Не авторизован → на /login
  router.replace('/login')
}

📋 ДЕТАЛЬНЫЙ ПЛАН РЕАЛИЗАЦИИ

PHASE 1: ПОДГОТОВКА И АНАЛИЗ

1.1 Анализ текущих страниц авторизации

# Проверить содержимое:
- src/app/login/page.tsx
- src/app/register/page.tsx  
- src/app/dashboard/page.tsx
- src/components/auth-guard.tsx

1.2 Анализ AuthFlow размещения

  • Где сейчас рендерится AuthFlow
  • Какие параметры принимает
  • Как обрабатывает незавершенную регистрацию

1.3 Проверка всех redirect/router.replace

# Найти все места перенаправлений
grep -r "router.replace\|redirect" src/

PHASE 2: СОЗДАНИЕ НОВОЙ АРХИТЕКТУРЫ

2.1 Исправить app/page.tsx (корневой роутер)

БЫЛО:

if (user) {
  router.replace('/dashboard')  // Неправильно!
} else {
  router.replace('/login')
}

БУДЕТ:

if (isLoading) return <LoadingSpinner />

if (user?.organization) {
  // Пользователь полностью зарегистрирован
  router.replace('/dashboard')
} else if (user && !user.organization) {
  // Пользователь авторизован, но регистрация не завершена
  router.replace('/register')
} else {
  // Пользователь не авторизован
  router.replace('/login')
}

2.2 Исправить /dashboard/page.tsx

БЫЛО:

<AuthGuard>  {/* Показывает AuthFlow при незавершенной регистрации */}
  <DashboardHome />
</AuthGuard>

БУДЕТ:

<AuthGuard fallback={<RedirectToRegister />}>
  <DashboardHome />
</AuthGuard>

2.3 Обновить /register/page.tsx

Должен обрабатывать:

  • Новую регистрацию (нет токена)
  • Незавершенную регистрацию (есть токен, нет организации)
  • Параметры партнерских/реферальных кодов

2.4 Обновить /login/page.tsx

Только для входа (без регистрации)


PHASE 3: ОБНОВЛЕНИЕ КОМПОНЕНТОВ

3.1 Создать RedirectToRegister компонент

// components/auth/redirect-to-register.tsx
export function RedirectToRegister() {
  const router = useRouter()
  
  useEffect(() => {
    router.replace('/register')
  }, [])
  
  return <div>Перенаправление на регистрацию...</div>
}

3.2 Обновить AuthGuard логику

  • НЕ показывать AuthFlow на /dashboard
  • Перенаправлять на /register при незавершенной регистрации
  • Добавить проверку pathname

3.3 Обновить AuthFlow состояния

  • Правильно обрабатывать состояние при незавершенной регистрации
  • Убрать конфликты между экземплярами AuthFlow

PHASE 4: ИСПРАВЛЕНИЕ AUTH-FLOW

4.1 Убрать window.location.href

БЫЛО:

window.location.href = '/dashboard'

БУДЕТ:

router.push('/dashboard')

4.2 Исправить логику завершения регистрации

  • После создания организации → redirect на /dashboard
  • При ошибке → остаться на /register

4.3 Обновить логику инициализации AuthFlow

  • Определять текущий шаг на основе состояния пользователя
  • Учитывать что пользователь может попасть на /register с токеном

🧪 ПЛАН ТЕСТИРОВАНИЯ

TEST CASE 1: Новый пользователь

1. Открыть / → перенаправление на /login
2. Ввести телефон → SMS step
3. Ввести SMS → cabinet-select step  
4. Выбрать тип → inn/api step
5. Завершить → /dashboard

TEST CASE 2: Незавершенная регистрация

1. Пользователь с токеном без организации
2. Открыть / → перенаправление на /register
3. AuthFlow определяет нужный шаг
4. Продолжить с правильного места
5. Завершить → /dashboard

TEST CASE 3: Авторизованный пользователь

1. Пользователь с токеном и организацией
2. Открыть / → перенаправление на /dashboard
3. Открыть /register → перенаправление на /dashboard
4. Открыть /login → перенаправление на /dashboard

TEST CASE 4: Партнерские коды

1. Открыть /register?partner=FF_123_456
2. AuthFlow получает partnerCode
3. Проходит регистрацию с партнерским кодом
4. Завершить → /dashboard

⚠️ КРИТИЧЕСКИЕ МОМЕНТЫ

🔒 Безопасность:

  • /dashboard должен быть доступен ТОЛЬКО авторизованным с организацией
  • AuthGuard НЕ должен показывать формы регистрации на защищенных страницах
  • Проверить все места где используется AuthGuard

🔄 Обратная совместимость:

  • Существующие ссылки на /dashboard должны работать
  • Незавершенные регистрации не должны ломаться
  • SMS коды и токены должны продолжать работать

📱 UX:

  • Пользователь не должен видеть мерцания и перезагрузки
  • Четкие состояния загрузки
  • Понятные сообщения об ошибках

🛠️ ФАЙЛЫ ДЛЯ ИЗМЕНЕНИЯ

Обязательные изменения:

  • src/app/page.tsx - корневая логика роутинга
  • src/app/dashboard/page.tsx - убрать AuthFlow fallback
  • src/app/register/page.tsx - обработка незавершенной регистрации
  • src/app/login/page.tsx - только для входа
  • src/components/auth-guard.tsx - новая логика перенаправлений
  • src/components/auth/auth-flow.tsx - убрать window.location.href

Новые компоненты:

  • src/components/auth/redirect-to-register.tsx - компонент перенаправления

Тестирование:

  • Все flow регистрации
  • Все типы пользователей
  • Партнерские и реферальные коды

📊 КРИТЕРИИ УСПЕХА

Функциональные:

  • Новая регистрация проходит полностью
  • Незавершенная регистрация продолжается с нужного шага
  • Авторизованные пользователи попадают в dashboard
  • Партнерские коды работают

Технические:

  • Нет создания второго AuthFlow
  • Нет бесконечных перенаправлений
  • ESLint и TypeScript без ошибок
  • Приложение собирается

UX:

  • Логичные URL для пользователей
  • Никаких неожиданных сбросов формы
  • Плавные переходы между шагами

🚀 ГОТОВНОСТЬ К РЕАЛИЗАЦИИ

План детально проработан. Готов к пошаговой реализации:

  1. Анализ проблемы завершен
  2. Архитектура спроектирована
  3. План реализации детализирован
  4. Тест-кейсы подготовлены
  5. Критерии успеха определены

Следующий шаг: Начать PHASE 1 - Подготовка и анализ