
• Полная миграция 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>
294 lines
11 KiB
Markdown
294 lines
11 KiB
Markdown
# 🎯 ПЛАН ИСПРАВЛЕНИЯ АРХИТЕКТУРЫ РОУТИНГА 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` |
|
||
|
||
### 🔄 Логика перенаправлений:
|
||
|
||
```typescript
|
||
// 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 Анализ текущих страниц авторизации
|
||
```bash
|
||
# Проверить содержимое:
|
||
- 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
|
||
```bash
|
||
# Найти все места перенаправлений
|
||
grep -r "router.replace\|redirect" src/
|
||
```
|
||
|
||
---
|
||
|
||
### **PHASE 2: СОЗДАНИЕ НОВОЙ АРХИТЕКТУРЫ**
|
||
|
||
#### 2.1 Исправить app/page.tsx (корневой роутер)
|
||
**БЫЛО:**
|
||
```typescript
|
||
if (user) {
|
||
router.replace('/dashboard') // Неправильно!
|
||
} else {
|
||
router.replace('/login')
|
||
}
|
||
```
|
||
|
||
**БУДЕТ:**
|
||
```typescript
|
||
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
|
||
**БЫЛО:**
|
||
```typescript
|
||
<AuthGuard> {/* Показывает AuthFlow при незавершенной регистрации */}
|
||
<DashboardHome />
|
||
</AuthGuard>
|
||
```
|
||
|
||
**БУДЕТ:**
|
||
```typescript
|
||
<AuthGuard fallback={<RedirectToRegister />}>
|
||
<DashboardHome />
|
||
</AuthGuard>
|
||
```
|
||
|
||
#### 2.3 Обновить /register/page.tsx
|
||
**Должен обрабатывать:**
|
||
- Новую регистрацию (нет токена)
|
||
- Незавершенную регистрацию (есть токен, нет организации)
|
||
- Параметры партнерских/реферальных кодов
|
||
|
||
#### 2.4 Обновить /login/page.tsx
|
||
**Только для входа** (без регистрации)
|
||
|
||
---
|
||
|
||
### **PHASE 3: ОБНОВЛЕНИЕ КОМПОНЕНТОВ**
|
||
|
||
#### 3.1 Создать RedirectToRegister компонент
|
||
```typescript
|
||
// 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
|
||
**БЫЛО:**
|
||
```typescript
|
||
window.location.href = '/dashboard'
|
||
```
|
||
|
||
**БУДЕТ:**
|
||
```typescript
|
||
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 - Подготовка и анализ |