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

294 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🎯 ПЛАН ИСПРАВЛЕНИЯ АРХИТЕКТУРЫ РОУТИНГА 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 - Подготовка и анализ