
• Полная миграция 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>
11 KiB
11 KiB
🎯 ПЛАН ИСПРАВЛЕНИЯ АРХИТЕКТУРЫ РОУТИНГА 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 fallbacksrc/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 для пользователей
- Никаких неожиданных сбросов формы
- Плавные переходы между шагами
🚀 ГОТОВНОСТЬ К РЕАЛИЗАЦИИ
План детально проработан. Готов к пошаговой реализации:
- ✅ Анализ проблемы завершен
- ✅ Архитектура спроектирована
- ✅ План реализации детализирован
- ✅ Тест-кейсы подготовлены
- ✅ Критерии успеха определены
Следующий шаг: Начать PHASE 1 - Подготовка и анализ