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>
This commit is contained in:
294
2025-09-18/ROUTING_ARCHITECTURE_FIX_PLAN.md
Normal file
294
2025-09-18/ROUTING_ARCHITECTURE_FIX_PLAN.md
Normal file
@ -0,0 +1,294 @@
|
||||
# 🎯 ПЛАН ИСПРАВЛЕНИЯ АРХИТЕКТУРЫ РОУТИНГА 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 - Подготовка и анализ
|
Reference in New Issue
Block a user