From 05898d504d41e074b4e339d35ee9add79fc1347d Mon Sep 17 00:00:00 2001 From: Urtzi Alfaro Date: Sun, 7 Sep 2025 21:26:28 +0200 Subject: [PATCH] Start integrating the onboarding flow with backend 13 --- .../steps/SmartInventorySetupStep.tsx | 4 +- .../src/hooks/business/onboarding/README.md | 8 +- .../business/onboarding/{ => config}/steps.ts | 2 +- .../hooks/business/onboarding/core/actions.ts | 2 +- .../hooks/business/onboarding/core/store.ts | 2 +- .../onboarding/{ => core}/useAutoResume.ts | 2 +- .../src/hooks/business/onboarding/index.ts | 4 +- .../services/useProgressTracking.ts | 10 +- .../onboarding/services/useResumeLogic.ts | 10 +- .../src/hooks/business/onboarding/types.ts | 112 ------------------ 10 files changed, 24 insertions(+), 132 deletions(-) rename frontend/src/hooks/business/onboarding/{ => config}/steps.ts (99%) rename frontend/src/hooks/business/onboarding/{ => core}/useAutoResume.ts (88%) delete mode 100644 frontend/src/hooks/business/onboarding/types.ts diff --git a/frontend/src/components/domain/onboarding/steps/SmartInventorySetupStep.tsx b/frontend/src/components/domain/onboarding/steps/SmartInventorySetupStep.tsx index ec77438d..aa6c26b5 100644 --- a/frontend/src/components/domain/onboarding/steps/SmartInventorySetupStep.tsx +++ b/frontend/src/components/domain/onboarding/steps/SmartInventorySetupStep.tsx @@ -455,7 +455,7 @@ export const SmartInventorySetupStep: React.FC = ({

- Sube tu historial de ventas + Sube tus datos de ventas de forma segura: tΓΊ eres el propietario de esos datos, nosotros solo los optimizamos.

Arrastra y suelta tu archivo aquΓ­, o haz clic para seleccionar @@ -771,7 +771,7 @@ export const SmartInventorySetupStep: React.FC = ({ {/* Information */}

- πŸ“¦ Inventario Inteligente: + πŸ“¦ Sube tus datos de ventas de forma segura: tΓΊ eres el propietario, nosotros solo los optimizamos.:

  • β€’ ConfiguraciΓ³n automΓ‘tica - Los niveles de stock se calculan basΓ‘ndose en tus datos de ventas
  • diff --git a/frontend/src/hooks/business/onboarding/README.md b/frontend/src/hooks/business/onboarding/README.md index 7ea05d8b..d25247b6 100644 --- a/frontend/src/hooks/business/onboarding/README.md +++ b/frontend/src/hooks/business/onboarding/README.md @@ -55,7 +55,8 @@ src/hooks/business/onboarding/ β”œβ”€β”€ core/ β”‚ β”œβ”€β”€ store.ts # Zustand centralized store β”‚ β”œβ”€β”€ actions.ts # Business logic orchestration -β”‚ └── types.ts # Complete type definitions +β”‚ β”œβ”€β”€ types.ts # Complete type definitions +β”‚ └── useAutoResume.ts # Auto-resume wrapper β”œβ”€β”€ services/ β”‚ β”œβ”€β”€ useTenantCreation.ts # Tenant service β”‚ β”œβ”€β”€ useSalesProcessing.ts # Sales processing service @@ -65,10 +66,9 @@ src/hooks/business/onboarding/ β”‚ └── useResumeLogic.ts # Resume service β”œβ”€β”€ utils/ β”‚ └── createServiceHook.ts # Service factory +β”œβ”€β”€ config/ +β”‚ └── steps.ts # Step definitions and validation β”œβ”€β”€ useOnboarding.ts # Main unified hook -β”œβ”€β”€ useAutoResume.ts # Auto-resume wrapper -β”œβ”€β”€ steps.ts # Step definitions -β”œβ”€β”€ types.ts # Legacy type exports └── index.ts # Clean exports ``` diff --git a/frontend/src/hooks/business/onboarding/steps.ts b/frontend/src/hooks/business/onboarding/config/steps.ts similarity index 99% rename from frontend/src/hooks/business/onboarding/steps.ts rename to frontend/src/hooks/business/onboarding/config/steps.ts index 3c366e47..986c7355 100644 --- a/frontend/src/hooks/business/onboarding/steps.ts +++ b/frontend/src/hooks/business/onboarding/config/steps.ts @@ -2,7 +2,7 @@ * Onboarding step definitions and validation logic */ -import type { OnboardingStep, OnboardingData } from './types'; +import type { OnboardingStep, OnboardingData } from '../core/types'; export const DEFAULT_STEPS: OnboardingStep[] = [ { diff --git a/frontend/src/hooks/business/onboarding/core/actions.ts b/frontend/src/hooks/business/onboarding/core/actions.ts index d9fb2179..df22f0fd 100644 --- a/frontend/src/hooks/business/onboarding/core/actions.ts +++ b/frontend/src/hooks/business/onboarding/core/actions.ts @@ -10,7 +10,7 @@ import { useSalesProcessing } from '../services/useSalesProcessing'; import { useInventorySetup } from '../services/useInventorySetup'; import { useTrainingOrchestration } from '../services/useTrainingOrchestration'; import { useProgressTracking } from '../services/useProgressTracking'; -import { getStepById } from '../steps'; +import { getStepById } from '../config/steps'; import type { ProductSuggestionResponse } from '../core/types'; import type { BakeryRegistration } from '../../../../api'; diff --git a/frontend/src/hooks/business/onboarding/core/store.ts b/frontend/src/hooks/business/onboarding/core/store.ts index bbe4d01a..b9ee5775 100644 --- a/frontend/src/hooks/business/onboarding/core/store.ts +++ b/frontend/src/hooks/business/onboarding/core/store.ts @@ -6,7 +6,7 @@ import { create } from 'zustand'; import { devtools } from 'zustand/middleware'; import type { OnboardingData, OnboardingStep, OnboardingProgress } from './types'; -import { DEFAULT_STEPS } from '../steps'; +import { DEFAULT_STEPS } from '../config/steps'; interface OnboardingStore { // Flow state diff --git a/frontend/src/hooks/business/onboarding/useAutoResume.ts b/frontend/src/hooks/business/onboarding/core/useAutoResume.ts similarity index 88% rename from frontend/src/hooks/business/onboarding/useAutoResume.ts rename to frontend/src/hooks/business/onboarding/core/useAutoResume.ts index aa28abb5..eba1ca6f 100644 --- a/frontend/src/hooks/business/onboarding/useAutoResume.ts +++ b/frontend/src/hooks/business/onboarding/core/useAutoResume.ts @@ -2,7 +2,7 @@ * Auto-resume hook - Simple wrapper around resume logic service */ -import { useResumeLogic } from './services/useResumeLogic'; +import { useResumeLogic } from '../services/useResumeLogic'; export const useAutoResume = () => { const resumeLogic = useResumeLogic(); diff --git a/frontend/src/hooks/business/onboarding/index.ts b/frontend/src/hooks/business/onboarding/index.ts index 2bbdafdb..8f804eb2 100644 --- a/frontend/src/hooks/business/onboarding/index.ts +++ b/frontend/src/hooks/business/onboarding/index.ts @@ -7,7 +7,7 @@ export type * from './core/types'; // Steps configuration -export { DEFAULT_STEPS, getStepById, getStepIndex, canAccessStep, calculateProgress } from './steps'; +export { DEFAULT_STEPS, getStepById, getStepIndex, canAccessStep, calculateProgress } from './config/steps'; // Core architecture (for advanced usage) export { useOnboardingStore } from './core/store'; @@ -23,7 +23,7 @@ export { useResumeLogic } from './services/useResumeLogic'; // Main hooks - PRIMARY INTERFACE for components export { useOnboarding } from './useOnboarding'; -export { useAutoResume } from './useAutoResume'; +export { useAutoResume } from './core/useAutoResume'; // Utility export { createServiceHook } from './utils/createServiceHook'; \ No newline at end of file diff --git a/frontend/src/hooks/business/onboarding/services/useProgressTracking.ts b/frontend/src/hooks/business/onboarding/services/useProgressTracking.ts index bfbe559d..39d2296d 100644 --- a/frontend/src/hooks/business/onboarding/services/useProgressTracking.ts +++ b/frontend/src/hooks/business/onboarding/services/useProgressTracking.ts @@ -2,7 +2,7 @@ * Progress tracking service - Clean, standardized implementation */ -import { useCallback, useEffect } from 'react'; +import { useCallback, useEffect, useRef } from 'react'; import { onboardingService } from '../../../../api/services/onboarding'; import { createServiceHook } from '../utils/createServiceHook'; import type { ProgressTrackingState } from '../core/types'; @@ -20,6 +20,7 @@ const useProgressTrackingService = createServiceHook({ export const useProgressTracking = () => { const service = useProgressTrackingService(); + const initializationAttempted = useRef(false); // Load initial progress from backend const loadProgress = useCallback(async (): Promise => { @@ -121,12 +122,13 @@ export const useProgressTracking = () => { } }, []); - // Auto-load progress on hook initialization + // Auto-load progress on hook initialization - PREVENT multiple attempts useEffect(() => { - if (!service.data?.isInitialized) { + if (!service.data?.isInitialized && !initializationAttempted.current && !service.isLoading) { + initializationAttempted.current = true; loadProgress(); } - }, [loadProgress, service.data?.isInitialized]); + }, [service.data?.isInitialized, service.isLoading]); // Remove loadProgress from deps return { // State diff --git a/frontend/src/hooks/business/onboarding/services/useResumeLogic.ts b/frontend/src/hooks/business/onboarding/services/useResumeLogic.ts index df5d2cd6..8b5d6d7d 100644 --- a/frontend/src/hooks/business/onboarding/services/useResumeLogic.ts +++ b/frontend/src/hooks/business/onboarding/services/useResumeLogic.ts @@ -2,7 +2,7 @@ * Resume logic service - Clean, standardized implementation */ -import { useCallback, useEffect } from 'react'; +import { useCallback, useEffect, useRef } from 'react'; import { useNavigate } from 'react-router-dom'; import { useOnboardingStore } from '../core/store'; import { useProgressTracking } from './useProgressTracking'; @@ -22,6 +22,7 @@ export const useResumeLogic = () => { const navigate = useNavigate(); const progressTracking = useProgressTracking(); const { setCurrentStep } = useOnboardingStore(); + const resumeAttempted = useRef(false); // Check if user should resume onboarding const checkForResume = useCallback(async (): Promise => { @@ -114,12 +115,13 @@ export const useResumeLogic = () => { } }, [checkForResume, resumeFlow]); - // Auto-check for resume when the hook is first used + // Auto-check for resume when the hook is first used - PREVENT multiple attempts useEffect(() => { - if (progressTracking.isInitialized && !service.data?.isCheckingResume) { + if (progressTracking.isInitialized && !service.data?.isCheckingResume && !resumeAttempted.current) { + resumeAttempted.current = true; handleAutoResume(); } - }, [progressTracking.isInitialized, handleAutoResume, service.data?.isCheckingResume]); + }, [progressTracking.isInitialized, service.data?.isCheckingResume]); // Remove handleAutoResume from deps return { // State diff --git a/frontend/src/hooks/business/onboarding/types.ts b/frontend/src/hooks/business/onboarding/types.ts deleted file mode 100644 index 0ffc0f6b..00000000 --- a/frontend/src/hooks/business/onboarding/types.ts +++ /dev/null @@ -1,112 +0,0 @@ -/** - * Shared types for onboarding hooks - */ - -import type { - BakeryRegistration, - ProductSuggestionResponse, - BusinessModelAnalysisResponse, - User -} from '../../../api'; - -// Re-export for convenience -export type { ProductSuggestionResponse, BusinessModelAnalysisResponse }; - -export interface OnboardingStep { - id: string; - title: string; - description: string; - isRequired: boolean; - isCompleted: boolean; - validation?: (data: OnboardingData) => string | null; -} - -export interface OnboardingData { - // Step 1: Setup - bakery?: BakeryRegistration; - - // Step 2: Data Processing - files?: { - salesData?: File; - }; - processingStage?: 'upload' | 'validating' | 'analyzing' | 'review' | 'completed' | 'error'; - processingResults?: { - is_valid: boolean; - total_records: number; - unique_products: number; - product_list: string[]; - validation_errors: string[]; - validation_warnings: string[]; - summary: { - date_range: string; - total_sales: number; - average_daily_sales: number; - }; - }; - - // Step 3: Sales Validation (merged data processing + review) - suggestions?: ProductSuggestionResponse[]; - detectedProducts?: any[]; // Products detected from AI analysis - approvedSuggestions?: ProductSuggestionResponse[]; - approvedProducts?: ProductSuggestionResponse[]; - reviewCompleted?: boolean; - - // Step 4: Inventory - inventoryItems?: any[]; - inventoryMapping?: { [productName: string]: string }; - inventoryConfigured?: boolean; - salesImportResult?: { - success: boolean; - imported: boolean; - records_created: number; - message: string; - }; - - // Step 5: Suppliers - suppliers?: any[]; - supplierMappings?: any[]; - - // Step 6: ML Training - trainingStatus?: 'idle' | 'validating' | 'training' | 'completed' | 'failed'; - trainingProgress?: number; - trainingJob?: any; - trainingLogs?: any[]; - trainingMetrics?: any; - autoStartTraining?: boolean; - - // Step 7: Completion - completionStats?: { - totalProducts: number; - inventoryItems: number; - suppliersConfigured: number; - mlModelAccuracy: number; - estimatedTimeSaved: string; - completionScore: number; - }; - - // Cross-step data sharing - allStepData?: { [stepId: string]: any }; -} - -export interface OnboardingProgress { - currentStep: number; - totalSteps: number; - completedSteps: number; - isComplete: boolean; - progressPercentage: number; -} - -export interface OnboardingError { - step?: string; - message: string; - details?: any; -} - -// Processing progress callback -export type ProgressCallback = (progress: number, stage: string, message: string) => void; - -// Step validation function -export type StepValidator = (data: OnboardingData) => string | null; - -// Step update callback -export type StepDataUpdater = (stepId: string, data: Partial) => void; \ No newline at end of file