Fix new Frontend 7

This commit is contained in:
Urtzi Alfaro
2025-08-04 08:42:35 +02:00
parent 0e2c6dd54e
commit a8dbd37c5a
4 changed files with 76 additions and 35 deletions

View File

@@ -12,12 +12,12 @@ import { ApiErrorHandler } from '../utils';
* Authentication Interceptor
* Automatically adds authentication headers to requests
*/
export class AuthInterceptor {
class AuthInterceptor {
static setup() {
apiClient.addRequestInterceptor({
onRequest: async (config: RequestConfig) => {
const token = localStorage.getItem('auth_token');
if (token) {
config.headers = {
...config.headers,
@@ -58,7 +58,7 @@ export class AuthInterceptor {
* Logging Interceptor
* Logs API requests and responses for debugging
*/
export class LoggingInterceptor {
class LoggingInterceptor {
static setup() {
apiClient.addRequestInterceptor({
onRequest: async (config: RequestConfig) => {
@@ -120,7 +120,7 @@ export class LoggingInterceptor {
* Tenant Context Interceptor
* Automatically adds tenant context to tenant-scoped requests
*/
export class TenantInterceptor {
class TenantInterceptor {
private static currentTenantId: string | null = null;
static setCurrentTenant(tenantId: string | null) {
@@ -160,7 +160,7 @@ export class TenantInterceptor {
* Error Recovery Interceptor
* Handles automatic token refresh and retry logic
*/
export class ErrorRecoveryInterceptor {
class ErrorRecoveryInterceptor {
private static isRefreshing = false;
private static failedQueue: Array<{
resolve: (token: string) => void;
@@ -261,7 +261,7 @@ export class ErrorRecoveryInterceptor {
* Performance Monitoring Interceptor
* Tracks API performance metrics
*/
export class PerformanceInterceptor {
class PerformanceInterceptor {
private static metrics: Array<{
url: string;
method: string;
@@ -351,7 +351,9 @@ export class PerformanceInterceptor {
export const setupInterceptors = () => {
AuthInterceptor.setup();
if (process.env.NODE_ENV === 'development') {
const isDevelopment = import.meta.env.DEV;
if (isDevelopment) {
LoggingInterceptor.setup();
PerformanceInterceptor.setup();
}

View File

@@ -61,6 +61,8 @@ export interface TenantSubscription {
export interface TenantCreate {
name: string;
postal_code: string;
phone: string;
description?: string;
settings?: Partial<TenantSettings>;
location?: TenantLocation;

View File

@@ -2,9 +2,13 @@ import React, { useState } from 'react';
import { ChevronLeft, ChevronRight, Upload, MapPin, Store, Factory, Check } from 'lucide-react';
import toast from 'react-hot-toast';
import { useTenant, useTraining, useData, useAuth } from '../../api/hooks';
import { TenantCreate } from '../../api/types';
import { UserResponse } from '../../api/types';
import {
useTenant,
useTraining,
useData,
useAuth,
TenantCreate
} from '../../api';
interface OnboardingPageProps {
user: any;
@@ -40,8 +44,7 @@ const OnboardingPage: React.FC<OnboardingPageProps> = ({ user, onComplete }) =>
const { createTenant, isLoading: tenantLoading } = useTenant();
const { startTrainingJob } = useTraining();
const { uploadSalesHistory, validateSalesData, uploadProgress } = useData();
const [ setUploadProgress ] = useState<number>(0);
const { uploadSalesHistory, validateSalesData } = useData();
const steps = [
{ id: 1, title: 'Datos de Panadería', icon: Store },
@@ -99,11 +102,20 @@ const OnboardingPage: React.FC<OnboardingPageProps> = ({ user, onComplete }) =>
const tenantData: TenantCreate = {
name: bakeryData.name,
address: bakeryData.address,
business_type: bakeryData.businessType,
business_type:"bakery",
postal_code: "28010",
phone: "+34655334455",
coordinates: bakeryData.coordinates,
products: bakeryData.products,
has_historical_data: bakeryData.hasHistoricalData,
};
const token = localStorage.getItem('auth_token');
if (!token) {
toast.error('Sesión expirada. Por favor, inicia sesión nuevamente.');
// Redirect to login or handle authentication error
return;
}
const newTenant = await createTenant(tenantData);
const tenantId = newTenant.id;
@@ -147,10 +159,7 @@ const OnboardingPage: React.FC<OnboardingPageProps> = ({ user, onComplete }) =>
const uploadResult = await uploadSalesHistory(tenantId, bakeryData.csvFile, {
source: 'onboarding_upload',
validate_only: false,
onProgress: (progress) => {
setUploadProgress(progress.percentage);
}
validate_only: false
});
toast.dismiss('csv-upload');
@@ -188,9 +197,6 @@ const OnboardingPage: React.FC<OnboardingPageProps> = ({ user, onComplete }) =>
throw new Error(`Upload failed: ${uploadResult.errors?.join(', ') || 'Unknown error'}`);
}
// Reset progress when done
setUploadProgress(0);
} catch (uploadError) {
// Handle validation or upload error gracefully
console.error('CSV validation/upload error:', uploadError);
@@ -210,11 +216,16 @@ const OnboardingPage: React.FC<OnboardingPageProps> = ({ user, onComplete }) =>
} catch (error) {
console.error('Onboarding completion error:', error);
const errorMessage = error instanceof Error ? error.message : 'Error al completar la configuración';
toast.error(errorMessage);
// 🔧 ADD: Better error handling for auth issues
if (error instanceof Error && error.message.includes('401')) {
toast.error('Sesión expirada. Por favor, inicia sesión nuevamente.');
} else {
toast.error('Error en la configuración. Inténtalo de nuevo.');
}
} finally {
setIsLoading(false);
setUploadProgress(0); // Reset progress in case of error
}
};