Files
karibeo_backend_admin/src/services/mockApi.ts
gpt-engineer-app[bot] 5ddc52658d Initial commit from remix
2025-09-25 16:01:00 +00:00

314 lines
9.0 KiB
TypeScript

// Mock data for Karibeo API simulation
export const mockUsers = [
{
id: '1',
email: 'usuario@karibeo.com',
password: '123456',
name: 'Juan Pérez',
type: 'tourist',
avatar: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=150',
location: { lat: 18.4861, lng: -69.9312 }, // Santo Domingo
preferences: { language: 'es' }
},
{
id: '2',
email: 'comercio@karibeo.com',
password: '123456',
name: 'María García',
type: 'business',
avatar: 'https://images.unsplash.com/photo-1494790108755-2616b612b829?w=150',
location: { lat: 18.5204, lng: -69.9055 }, // Santo Domingo
preferences: { language: 'es' }
}
];
export const mockListings = [
{
id: '1',
title: 'Hotel Colonial Boutique',
category: 'hotel',
location: { lat: 18.4861, lng: -69.9312, address: 'Zona Colonial, Santo Domingo' },
price: 120,
rating: 4.8,
images: ['https://images.unsplash.com/photo-1566073771259-6a8506099945?w=400'],
description: 'Hermoso hotel boutique en el corazón de la Zona Colonial',
amenities: ['WiFi', 'Desayuno', 'Piscina', 'Spa'],
ownerId: '2'
},
{
id: '2',
title: 'Restaurante El Malecón',
category: 'restaurant',
location: { lat: 18.4692, lng: -69.9014, address: 'Malecón, Santo Domingo' },
price: 45,
rating: 4.6,
images: ['https://images.unsplash.com/photo-1414235077428-338989a2e8c0?w=400'],
description: 'Exquisita comida dominicana con vista al mar',
amenities: ['Vista al mar', 'Terraza', 'Música en vivo'],
ownerId: '2'
},
{
id: '3',
title: 'Tour Guiado Zona Colonial',
category: 'tour',
location: { lat: 18.4861, lng: -69.9312, address: 'Plaza de Armas, Santo Domingo' },
price: 25,
rating: 4.9,
images: ['https://images.unsplash.com/photo-1539650116574-75c0c6d73c1e?w=400'],
description: 'Descubre la historia de la primera ciudad de América',
amenities: ['Guía certificado', 'Grupo pequeño', 'Incluye entradas'],
ownerId: '2'
},
{
id: '4',
title: 'Resort Playa Bávaro',
category: 'hotel',
location: { lat: 18.6813, lng: -68.4090, address: 'Playa Bávaro, Punta Cana' },
price: 280,
rating: 4.7,
images: ['https://images.unsplash.com/photo-1571003123894-1f0594d2b5d9?w=400'],
description: 'Resort todo incluido frente al mar Caribe',
amenities: ['Todo incluido', 'Playa privada', 'Spa', 'Golf'],
ownerId: '2'
},
{
id: '5',
title: 'Excursión Isla Saona',
category: 'tour',
location: { lat: 18.1667, lng: -68.8000, address: 'Isla Saona, La Romana' },
price: 85,
rating: 4.8,
images: ['https://images.unsplash.com/photo-1559827260-dc66d52bef19?w=400'],
description: 'Día completo en la paradisíaca Isla Saona',
amenities: ['Transporte incluido', 'Almuerzo', 'Snorkel', 'Guía'],
ownerId: '2'
},
{
id: '6',
title: 'Casa Colonial Airbnb',
category: 'apartment',
location: { lat: 18.4756, lng: -69.9390, address: 'Gazcue, Santo Domingo' },
price: 60,
rating: 4.5,
images: ['https://images.unsplash.com/photo-1502672260266-1c1ef2d93688?w=400'],
description: 'Acogedora casa colonial en zona histórica',
amenities: ['WiFi', 'Cocina', 'Aire acondicionado', 'Jardín'],
ownerId: '2'
},
{
id: '7',
title: 'Restaurante Lucia',
category: 'restaurant',
location: { lat: 18.4853, lng: -69.9314, address: 'Calle Hostos, Zona Colonial' },
price: 65,
rating: 4.9,
images: ['https://images.unsplash.com/photo-1517248135467-4c7edcad34c4?w=400'],
description: 'Restaurante gourmet en casa colonial del siglo XVI',
amenities: ['Terraza', 'Wine bar', 'Chef internacional', 'Ambiente histórico'],
ownerId: '2'
},
{
id: '8',
title: 'Apartamento Moderno Piantini',
category: 'apartment',
location: { lat: 18.4736, lng: -69.9506, address: 'Piantini, Santo Domingo' },
price: 95,
rating: 4.6,
images: ['https://images.unsplash.com/photo-1522708323590-d24dbb6b0267?w=400'],
description: 'Moderno apartamento en zona exclusiva',
amenities: ['Piscina', 'Gimnasio', 'Seguridad 24h', 'Vista panorámica'],
ownerId: '2'
}
];
export const mockBookings = [
{
id: '1',
listingId: '1',
userId: '1',
checkIn: '2024-02-15',
checkOut: '2024-02-18',
guests: 2,
total: 360,
status: 'confirmed',
paymentMethod: 'paypal'
},
{
id: '2',
listingId: '2',
userId: '1',
date: '2024-02-20',
guests: 4,
total: 180,
status: 'pending',
paymentMethod: 'credit_card'
}
];
export const mockWalletData = {
balance: 1250.50,
transactions: [
{
id: '1',
type: 'income',
amount: 120,
description: 'Pago por reserva Hotel Colonial',
date: '2024-02-10',
status: 'completed'
},
{
id: '2',
type: 'expense',
amount: -45,
description: 'Comisión plataforma',
date: '2024-02-10',
status: 'completed'
},
{
id: '3',
type: 'income',
amount: 180,
description: 'Pago restaurante El Malecón',
date: '2024-02-12',
status: 'pending'
}
]
};
// Simulate API calls with promises
export const mockApi = {
// Authentication
login: async (email: string, password: string) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
const user = mockUsers.find(u => u.email === email && u.password === password);
if (user) {
const { password: _, ...userWithoutPassword } = user;
resolve({ user: userWithoutPassword, token: 'mock-jwt-token' });
} else {
reject(new Error('Credenciales inválidas'));
}
}, 1000);
});
},
register: async (userData: any) => {
return new Promise((resolve) => {
setTimeout(() => {
const newUser = {
id: String(mockUsers.length + 1),
...userData,
avatar: 'https://images.unsplash.com/photo-1472099645785-5658abf4ff4e?w=150'
};
mockUsers.push(newUser);
const { password: _, ...userWithoutPassword } = newUser;
resolve({ user: userWithoutPassword, token: 'mock-jwt-token' });
}, 1000);
});
},
// Listings
getListings: async (location?: { lat: number, lng: number }, radius = 10) => {
return new Promise((resolve) => {
setTimeout(() => {
let filteredListings = mockListings;
if (location) {
// Simulate distance filtering (simplified)
filteredListings = mockListings.filter(listing => {
const distance = Math.sqrt(
Math.pow(listing.location.lat - location.lat, 2) +
Math.pow(listing.location.lng - location.lng, 2)
) * 111; // Rough km conversion
return distance <= radius;
});
}
resolve(filteredListings);
}, 800);
});
},
getUserListings: async (userId: string) => {
return new Promise((resolve) => {
setTimeout(() => {
const userListings = mockListings.filter(listing => listing.ownerId === userId);
resolve(userListings);
}, 500);
});
},
createListing: async (listingData: any) => {
return new Promise((resolve) => {
setTimeout(() => {
const newListing = {
id: String(mockListings.length + 1),
...listingData,
rating: 0,
images: [listingData.image || 'https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=400']
};
mockListings.push(newListing);
resolve(newListing);
}, 1000);
});
},
// Bookings
getBookings: async (userId: string) => {
return new Promise((resolve) => {
setTimeout(() => {
const userBookings = mockBookings
.filter(booking => booking.userId === userId)
.map(booking => ({
...booking,
listing: mockListings.find(l => l.id === booking.listingId)
}));
resolve(userBookings);
}, 500);
});
},
createBooking: async (bookingData: any) => {
return new Promise((resolve) => {
setTimeout(() => {
const newBooking = {
id: String(mockBookings.length + 1),
...bookingData,
status: 'pending'
};
mockBookings.push(newBooking);
resolve(newBooking);
}, 800);
});
},
// Wallet
getWallet: async (userId: string) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(mockWalletData);
}, 500);
});
},
// Analytics for dashboard
getDashboardStats: async (userId: string) => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
totalIncome: 5899,
incomeChange: 20.9,
visitors: 780192,
visitorsChange: 20,
totalOrders: 796542,
ordersChange: -9.01,
recentBookings: mockBookings.slice(0, 5).map(booking => ({
...booking,
listing: mockListings.find(l => l.id === booking.listingId),
user: mockUsers.find(u => u.id === booking.userId)
}))
});
}, 600);
});
}
};