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:
@ -155,11 +155,15 @@ const CardContent = React.forwardRef<HTMLDivElement, CardProps>(
|
||||
|
||||
## 🎮 HOOKS ПАТТЕРНЫ
|
||||
|
||||
### useAuth - Централизованная авторизация
|
||||
### AuthContext - Централизованная авторизация ✅ НОВАЯ АРХИТЕКТУРА
|
||||
|
||||
**⚡ МИГРАЦИЯ ЗАВЕРШЕНА (19.09.2025): useAuth → AuthContext**
|
||||
|
||||
```typescript
|
||||
// src/hooks/useAuth.ts
|
||||
export const useAuth = (): UseAuthReturn => {
|
||||
// src/contexts/AuthContext.tsx - НОВАЯ АРХИТЕКТУРА
|
||||
export const AuthContext = createContext<AuthContextType | undefined>(undefined)
|
||||
|
||||
export const AuthProvider = ({ children }: { children: ReactNode }) => {
|
||||
const [user, setUser] = useState<User | null>(null)
|
||||
const [isAuthenticated, setIsAuthenticated] = useState(() => !!getAuthToken())
|
||||
const [isLoading, setIsLoading] = useState(false)
|
||||
@ -230,12 +234,32 @@ export const useAuth = (): UseAuthReturn => {
|
||||
}
|
||||
```
|
||||
|
||||
**Ключевые паттерны useAuth:**
|
||||
// Использование в компонентах:
|
||||
export const useAuthContext = (): AuthContextType => {
|
||||
const context = useContext(AuthContext)
|
||||
if (context === undefined) {
|
||||
throw new Error('useAuthContext must be used within an AuthProvider')
|
||||
}
|
||||
return context
|
||||
}
|
||||
```
|
||||
|
||||
- **Lazy initialization** - проверка токена при инициализации
|
||||
- **Error handling** - обработка GraphQL ошибок
|
||||
- **Token persistence** - автоматическое сохранение токенов
|
||||
- **Apollo integration** - синхронизация с GraphQL клиентом
|
||||
**✅ Ключевые преимущества AuthContext (vs старый useAuth):**
|
||||
|
||||
- **Централизованное состояние** - единое состояние для всего приложения
|
||||
- **Устранение изоляции** - нет дублирования состояния между компонентами
|
||||
- **React Context API** - стандартный React паттерн
|
||||
- **SSR совместимость** - корректная работа с Next.js
|
||||
- **Race conditions fix** - исправлены проблемы с синхронизацией
|
||||
|
||||
**📋 Паттерн использования:**
|
||||
```typescript
|
||||
// ✅ Новый способ (все компоненты)
|
||||
const { user, isAuthenticated, logout } = useAuthContext()
|
||||
|
||||
// ❌ Старый способ (удален после миграции)
|
||||
// const { user, isAuthenticated, logout } = useAuth()
|
||||
```
|
||||
|
||||
### useSidebar - Управление состоянием сайдбара
|
||||
|
||||
@ -268,7 +292,7 @@ export const useSidebar = () => {
|
||||
```typescript
|
||||
// src/components/dashboard/sidebar.tsx
|
||||
export function Sidebar({ isRootInstance = false }: { isRootInstance?: boolean }) {
|
||||
const { user, logout } = useAuth()
|
||||
const { user, logout } = useAuthContext()
|
||||
const { isCollapsed, toggleSidebar } = useSidebar()
|
||||
const pathname = usePathname()
|
||||
|
||||
@ -375,7 +399,7 @@ export function Sidebar({ isRootInstance = false }: { isRootInstance?: boolean }
|
||||
```typescript
|
||||
// src/components/messenger/messenger-chat.tsx
|
||||
export function MessengerChat({ counterparty, onMessagesRead }: MessengerChatProps) {
|
||||
const { user } = useAuth()
|
||||
const { user } = useAuthContext()
|
||||
const [message, setMessage] = useState('')
|
||||
const messagesEndRef = useRef<HTMLDivElement>(null)
|
||||
|
||||
|
Reference in New Issue
Block a user