import React, { useState, useEffect } from 'react'; import { useNavigate } from 'react-router-dom'; import { OnboardingWizard, OnboardingStep } from '../../../components/domain/onboarding/OnboardingWizard'; import { onboardingApiService } from '../../../services/api/onboarding.service'; import { useAuthUser, useIsAuthenticated } from '../../../stores/auth.store'; import { LoadingSpinner } from '../../../components/shared/LoadingSpinner'; // Step Components import { BakerySetupStep } from '../../../components/domain/onboarding/steps/BakerySetupStep'; import { DataProcessingStep } from '../../../components/domain/onboarding/steps/DataProcessingStep'; import { ReviewStep } from '../../../components/domain/onboarding/steps/ReviewStep'; import { InventorySetupStep } from '../../../components/domain/onboarding/steps/InventorySetupStep'; import { SuppliersStep } from '../../../components/domain/onboarding/steps/SuppliersStep'; import { MLTrainingStep } from '../../../components/domain/onboarding/steps/MLTrainingStep'; import { CompletionStep } from '../../../components/domain/onboarding/steps/CompletionStep'; const OnboardingPage: React.FC = () => { const navigate = useNavigate(); const user = useAuthUser(); const isAuthenticated = useIsAuthenticated(); const [isLoading, setIsLoading] = useState(false); const [globalData, setGlobalData] = useState({}); // Define the 8 onboarding steps (simplified by merging data upload + analysis) const steps: OnboardingStep[] = [ { id: 'setup', title: '馃彚 Setup', description: 'Configuraci贸n b谩sica de tu panader铆a y creaci贸n del tenant', component: BakerySetupStep, isRequired: true, validation: (data) => { if (!data.bakery?.name) return 'El nombre de la panader铆a es requerido'; if (!data.bakery?.business_model) return 'El modelo de negocio es requerido'; if (!data.bakery?.address) return 'La direcci贸n es requerida'; if (!data.bakery?.city) return 'La ciudad es requerida'; if (!data.bakery?.postal_code) return 'El c贸digo postal es requerido'; if (!data.bakery?.phone) return 'El tel茅fono es requerido'; // Tenant creation will happen automatically when validation passes return null; } }, { id: 'data-processing', title: '馃搳 Historial de Ventas', description: 'Sube tus datos de ventas para obtener insights personalizados', component: DataProcessingStep, isRequired: true, validation: (data) => { if (!data.files?.salesData) return 'Debes cargar el archivo de datos de ventas'; if (data.processingStage !== 'completed') return 'El procesamiento debe completarse antes de continuar'; if (!data.processingResults?.is_valid) return 'Los datos deben ser v谩lidos para continuar'; return null; } }, { id: 'review', title: '馃搵 Revisi贸n', description: 'Revisi贸n de productos detectados por IA y resultados', component: ReviewStep, isRequired: true, validation: (data) => { if (!data.reviewCompleted) return 'Debes revisar y aprobar los productos detectados'; return null; } }, { id: 'inventory', title: '鈿欙笍 Inventario', description: 'Configuraci贸n de inventario (stock, fechas de vencimiento)', component: InventorySetupStep, isRequired: true, validation: (data) => { if (!data.inventoryConfigured) return 'Debes configurar el inventario b谩sico'; return null; } }, { id: 'suppliers', title: '馃彧 Proveedores', description: 'Configuraci贸n de proveedores y asociaciones', component: SuppliersStep, isRequired: false, validation: () => null // Optional step }, { id: 'ml-training', title: '馃幆 Inteligencia', description: 'Creaci贸n de tu asistente inteligente personalizado', component: MLTrainingStep, isRequired: true, validation: (data) => { if (data.trainingStatus !== 'completed') return 'El entrenamiento del modelo debe completarse'; return null; } }, { id: 'completion', title: '馃帀 Listo', description: 'Finalizaci贸n y preparaci贸n para usar la plataforma', component: CompletionStep, isRequired: true, validation: () => null } ]; const handleComplete = async (allData: any) => { setIsLoading(true); try { // Mark onboarding as complete in the backend if (user?.tenant_id) { await onboardingApiService.completeOnboarding(user.tenant_id, { completedAt: new Date().toISOString(), data: allData }); } // Navigate to dashboard navigate('/app/dashboard', { state: { message: '隆Felicidades! Tu panader铆a ha sido configurada exitosamente.', type: 'success' } }); } catch (error) { console.error('Error completing onboarding:', error); // Still navigate to dashboard but show warning navigate('/app/dashboard', { state: { message: 'Configuraci贸n completada. Algunos ajustes finales pueden estar pendientes.', type: 'warning' } }); } finally { setIsLoading(false); } }; const handleExit = () => { const confirmExit = window.confirm( '驴Est谩s seguro de que quieres salir del proceso de configuraci贸n? Tu progreso se guardar谩 autom谩ticamente.' ); if (confirmExit) { navigate('/app/dashboard'); } }; // Redirect to login if not authenticated useEffect(() => { if (!isAuthenticated) { navigate('/login', { state: { message: 'Debes iniciar sesi贸n para acceder al onboarding.', returnUrl: '/app/onboarding' } }); } }, [isAuthenticated, navigate]); if (isLoading) { return ; } // Don't render if not authenticated (will redirect) if (!isAuthenticated || !user) { return ; } return (
); }; export default OnboardingPage;