'use client' import { CheckCircle } from 'lucide-react' import { useRouter } from 'next/navigation' import { useState, useEffect } from 'react' import { useAuthContext } from '@/contexts/AuthContext' import { getHomePathFromUser } from '@/lib/routing' import { CabinetSelectStep } from './cabinet-select-step' import { ConfirmationStep } from './confirmation-step' import { InnStep } from './inn-step' import { MarketplaceApiStep } from './marketplace-api-step' import { PhoneStep } from './phone-step' import { SmsStep } from './sms-step' type AuthStep = 'phone' | 'sms' | 'cabinet-select' | 'inn' | 'marketplace-api' | 'confirmation' | 'complete' type CabinetType = 'fulfillment' | 'seller' | 'logist' | 'wholesale' interface OrganizationData { name?: string fullName?: string address?: string isActive?: boolean } interface ApiKeyValidation { sellerId?: string sellerName?: string tradeMark?: string isValid?: boolean } interface AuthData { phone: string smsCode: string cabinetType: CabinetType | null inn: string organizationData: OrganizationData | null wbApiKey: string wbApiValidation: ApiKeyValidation | null ozonApiKey: string ozonApiValidation: ApiKeyValidation | null isAuthenticated: boolean partnerCode?: string | null referralCode?: string | null } interface AuthFlowProps { partnerCode?: string | null referralCode?: string | null } export function AuthFlow({ partnerCode, referralCode }: AuthFlowProps = {}) { const router = useRouter() const { isAuthenticated, user } = useAuthContext() // Убираем избыточное логирование // Убираем автоматический logout - это создает race condition // Незавершенная регистрация - это нормальное состояние // AuthFlow должен продолжить с шага cabinet-select // Начинаем всегда с 'phone' для избежания гидрации, // а затем обновляем в useEffect после загрузки клиента const [step, setStep] = useState('phone') // Определяем тип регистрации на основе параметров // Только один из них должен быть активен (валидация уже прошла в RegisterPage) const registrationType = partnerCode ? 'PARTNER' : referralCode ? 'REFERRAL' : null const activeCode = partnerCode || referralCode || null // Убираем избыточное логирование const [authData, setAuthData] = useState({ phone: '', smsCode: '', cabinetType: null, inn: '', organizationData: null, wbApiKey: '', wbApiValidation: null, ozonApiKey: '', ozonApiValidation: null, isAuthenticated: false, // Сохраняем только активный код в правильное поле partnerCode: registrationType === 'PARTNER' ? activeCode : null, referralCode: registrationType === 'REFERRAL' ? activeCode : null, }) // ⭐ КРИТИЧНО: Отслеживаем только смену шагов console.warn('🎯 STEP:', step) // Добавляем useEffect для отслеживания изменений step useEffect(() => { console.warn('🔄 STEP CHANGED TO:', step) }, [step]) // Определяем правильный шаг после гидрации useEffect(() => { if (typeof window === 'undefined') return // Только на клиенте // Убираем избыточное логирование useEffect // Если у пользователя есть токен и организация - переходим к завершению if (isAuthenticated && user?.organization) { console.warn('🎢 AuthFlow - SCENARIO A: User has organization, setting step to complete') console.warn('🎢 AuthFlow - Organization details:', { id: user.organization.id, type: user.organization.type, name: user.organization.name, }) setStep('complete') } // Если есть токен но нет организации - переходим к выбору кабинета else if (isAuthenticated && user && !user.organization) { console.warn('🎢 AuthFlow - SCENARIO B/C: User authenticated but no organization, setting step to cabinet-select') console.warn('🎢 AuthFlow - User has token but missing organization:', { userId: user.id, phone: user.phone, organizationStatus: 'missing', }) setStep('cabinet-select') } // Иначе остаемся на шаге телефона else { console.warn('🎢 AuthFlow - SCENARIO D: User not authenticated, setting step to phone') console.warn('🎢 AuthFlow - Auth status:', { isAuthenticated, userExists: !!user, tokenInStorage: typeof window !== 'undefined' ? !!localStorage.getItem('authToken') : 'unknown', }) setStep('phone') } }, [isAuthenticated, user]) // Обновляем шаг при изменении статуса авторизации useEffect(() => { if (isAuthenticated && step === 'phone') { if (process.env.NODE_ENV === 'development') { console.warn('🎢 AuthFlow - Пользователь авторизовался, переход к выбору кабинета') } setStep('cabinet-select') } }, [isAuthenticated, step]) // При завершении авторизации инициируем проверку и перенаправление useEffect(() => { if (step === 'complete') { const timer = setTimeout(() => { // Прямое перенаправление в соответствующий home без промежуточного dashboard const homePath = getHomePathFromUser(user) console.warn('🎢 AuthFlow - Registration complete, redirecting to', homePath) router.push(homePath) }, 2000) // Задержка для показа сообщения о завершении return () => clearTimeout(timer) } }, [step, router, user]) const handlePhoneNext = (phone: string) => { console.warn('📞 PHONE→SMS:', phone) setAuthData((prev) => ({ ...prev, phone })) setStep('sms') } const handleSmsNext = async (smsCode: string) => { console.warn('✅ SMS→CABINET:', smsCode) setAuthData((prev) => ({ ...prev, smsCode, isAuthenticated: true })) setStep('cabinet-select') } const handleCabinetNext = (cabinetType: CabinetType) => { setAuthData((prev) => ({ ...prev, cabinetType })) if (cabinetType === 'fulfillment' || cabinetType === 'logist' || cabinetType === 'wholesale') { setStep('inn') } else { setStep('marketplace-api') } } const handleInnNext = (inn: string, organizationData?: OrganizationData) => { setAuthData((prev) => ({ ...prev, inn, organizationData: organizationData || null, })) setStep('confirmation') } const handleMarketplaceApiNext = (apiData: { wbApiKey?: string wbApiValidation?: ApiKeyValidation ozonApiKey?: string ozonApiValidation?: ApiKeyValidation }) => { setAuthData((prev) => ({ ...prev, wbApiKey: apiData.wbApiKey || '', wbApiValidation: apiData.wbApiValidation || null, ozonApiKey: apiData.ozonApiKey || '', ozonApiValidation: apiData.ozonApiValidation || null, })) setStep('confirmation') } const handleConfirmation = () => { setStep('complete') } const handleSmsBack = () => { setStep('phone') } const handleCabinetBack = () => { setStep('sms') } const handleInnBack = () => { setStep('cabinet-select') } const handleMarketplaceApiBack = () => { setStep('cabinet-select') } const handleConfirmationBack = () => { if ( authData.cabinetType === 'fulfillment' || authData.cabinetType === 'logist' || authData.cabinetType === 'wholesale' ) { setStep('inn') } else { setStep('marketplace-api') } } if (step === 'complete') { return (
{/* Floating Particles */}

Добро пожаловать!

Регистрация успешно завершена

Тип кабинета:

{authData.cabinetType === 'fulfillment' ? 'Фулфилмент' : authData.cabinetType === 'logist' ? 'Логистика' : authData.cabinetType === 'wholesale' ? 'Поставщик' : 'Селлер'}

Переход в личный кабинет...
) } return ( <> {step === 'phone' && ( )} {step === 'sms' && } {step === 'cabinet-select' && } {step === 'inn' && } {step === 'marketplace-api' && ( )} {step === 'confirmation' && ( )} {/* ОТЛАДКА: Логируем authData перед передачей в ConfirmationStep */} {step === 'confirmation' && (() => { console.warn('📊 AuthFlow - Passing to ConfirmationStep:', { phone: authData.phone, phoneLength: authData.phone?.length, cabinetType: authData.cabinetType, inn: authData.inn, allAuthData: authData, }) return null })()} {(step as string) === 'complete' && (

Регистрация завершена!

Ваш{' '} {authData.cabinetType === 'fulfillment' ? 'фулфилмент кабинет' : authData.cabinetType === 'seller' ? 'селлер кабинет' : authData.cabinetType === 'logist' ? 'логистический кабинет' : 'оптовый кабинет'}{' '} успешно создан

Переход в личный кабинет...

)} ) }