From f8aefa9abe3b5d32c2cb8adf378797b3b5ae0802 Mon Sep 17 00:00:00 2001 From: Urtzi Alfaro Date: Wed, 23 Jul 2025 13:37:37 +0200 Subject: [PATCH] Add new frontend - fix 20 --- frontend/src/api/services/authService.ts | 2 +- frontend/src/api/services/index.ts | 1 + .../src/api/services/notificationService.ts | 3 +- frontend/src/api/services/tenantService.ts | 2 +- frontend/src/api/services/trainingService.ts | 4 -- frontend/src/pages/onboarding.tsx | 67 +++++++++++++------ 6 files changed, 52 insertions(+), 27 deletions(-) diff --git a/frontend/src/api/services/authService.ts b/frontend/src/api/services/authService.ts index 27042420..e185c908 100644 --- a/frontend/src/api/services/authService.ts +++ b/frontend/src/api/services/authService.ts @@ -61,7 +61,7 @@ export class AuthService { */ async getCurrentUser(): Promise { const response = await apiClient.get('/users/me'); - return response.data!; + return response; } async register(userData: RegisterRequest): Promise { diff --git a/frontend/src/api/services/index.ts b/frontend/src/api/services/index.ts index 869cb200..bb3f7416 100644 --- a/frontend/src/api/services/index.ts +++ b/frontend/src/api/services/index.ts @@ -56,6 +56,7 @@ export type { TenantStats, TenantUser, InviteUser, + TenantInfo } from './tenantService'; // Create a unified API object for convenience diff --git a/frontend/src/api/services/notificationService.ts b/frontend/src/api/services/notificationService.ts index 38d7e93f..60abfed5 100644 --- a/frontend/src/api/services/notificationService.ts +++ b/frontend/src/api/services/notificationService.ts @@ -1,8 +1,7 @@ // src/api/services/NotificationService.ts import { apiClient } from '../base/apiClient'; import { - ApiResponse, - NotificationSettings + ApiResponse } from '@/api/services'; export interface NotificationCreate { diff --git a/frontend/src/api/services/tenantService.ts b/frontend/src/api/services/tenantService.ts index 5ae9af12..00723520 100644 --- a/frontend/src/api/services/tenantService.ts +++ b/frontend/src/api/services/tenantService.ts @@ -112,7 +112,7 @@ export class TenantService { */ async registerBakery(bakeryData: TenantCreate): Promise { const response = await apiClient.post('/api/v1/tenants/register', bakeryData); - return response.data!; + return response; } /** diff --git a/frontend/src/api/services/trainingService.ts b/frontend/src/api/services/trainingService.ts index 1a7aad93..ad6ae4e0 100644 --- a/frontend/src/api/services/trainingService.ts +++ b/frontend/src/api/services/trainingService.ts @@ -4,10 +4,6 @@ import { ApiResponse } from '../types/api'; -import { - ApiResponse -} from '@/api/services'; - export interface TrainingJobStatus { id: string; tenant_id: string; diff --git a/frontend/src/pages/onboarding.tsx b/frontend/src/pages/onboarding.tsx index bcea6b00..9b3748e1 100644 --- a/frontend/src/pages/onboarding.tsx +++ b/frontend/src/pages/onboarding.tsx @@ -13,11 +13,12 @@ import { XMarkIcon } from '@heroicons/react/24/outline'; -// Real API services imports +// Updated imports in onboarding.tsx import { TenantUser, -} from '@/api/services'; - + TenantCreate, + TenantInfo +} from '@/api/services'; import api from '@/api/services'; @@ -30,14 +31,27 @@ const OnboardingPage = () => { const [notification, setNotification] = useState(null); const [currentTenantId, setCurrentTenantId] = useState(null); const [formData, setFormData] = useState({ + // User registration fields full_name: '', email: '', password: '', confirm_password: '', + + // Bakery/Tenant fields - matching TenantCreate interface bakery_name: '', address: '', city: 'Madrid', postal_code: '', + phone: '', // Will use default if empty + business_type: 'individual_bakery' as 'individual_bakery' | 'central_workshop', + + // Optional fields + latitude: undefined as number | undefined, + longitude: undefined as number | undefined, + subscription_plan: undefined as string | undefined, + settings: undefined as Record | undefined, + + // Additional form fields has_nearby_schools: false, has_nearby_offices: false, selected_products: ['Pan de molde', 'Croissants', 'Magdalenas'], @@ -45,7 +59,6 @@ const OnboardingPage = () => { trainingStatus: 'pending', trainingTaskId: null, trainingProgress: 0, - business_type: 'bakery' }); const [errors, setErrors] = useState({}); const [uploadValidation, setUploadValidation] = useState(null); @@ -138,6 +151,17 @@ const OnboardingPage = () => { if (!formData.bakery_name.trim()) newErrors.bakery_name = 'Nombre de panadería requerido'; if (!formData.address.trim()) newErrors.address = 'Dirección requerida'; if (!formData.postal_code.trim()) newErrors.postal_code = 'Código postal requerido'; + if (!formData.email.trim()) newErrors.email = 'Email requerido'; // Email is required for TenantCreate + + // Validate business_type is one of the allowed values + if (!['individual_bakery', 'central_workshop'].includes(formData.business_type)) { + newErrors.business_type = 'Tipo de negocio inválido'; + } + + // Optional: Validate phone format if provided (will use default if empty) + if (formData.phone && !formData.phone.match(/^(\+34|34)?[67][0-9]{8}$/)) { + newErrors.phone = 'Formato de teléfono inválido'; + } break; case 3: if (!formData.salesFile) newErrors.salesFile = 'Archivo de ventas requerido'; @@ -165,21 +189,26 @@ const OnboardingPage = () => { const user = await api.auth.register(userData); showNotification('success', 'Usuario creado', 'Cuenta registrada exitosamente.'); - } else if (currentStep === 2) { - // Register bakery using real tenant service - const bakeryData = { - name: formData.bakery_name, - business_type: formData.business_type, - address: formData.address, - city: formData.city, - postal_code: formData.postal_code, - phone: formData.phone || '+34600000000' // Default phone if not provided - }; - - const tenant = await api.tenant.registerBakery(bakeryData); - setCurrentTenantId(tenant.id); - showNotification('success', 'Panadería registrada', 'Información guardada correctamente.'); - + } else if (currentStep === 2) { + // Register bakery using real tenant service with proper TenantCreate interface + const bakeryData: TenantCreate = { + name: formData.bakery_name, + email: formData.email, // Required field from TenantCreate interface + phone: formData.phone || '+34600000000', // Required field with default + address: formData.address, + business_type: formData.business_type as 'individual_bakery' | 'central_workshop', + // Optional fields that could be added based on form data + latitude: formData.latitude, // if you have coordinates + longitude: formData.longitude, // if you have coordinates + subscription_plan: formData.subscription_plan, // if selected + settings: formData.settings // if any initial settings + }; + + // The response will be typed as TenantInfo + const tenant: TenantInfo = await api.tenant.registerBakery(bakeryData); + setCurrentTenantId(tenant.id); + showNotification('success', 'Panadería registrada', 'Información guardada correctamente.'); + } else if (currentStep === 3) { // Upload and validate sales data using real data service if (formData.salesFile) {