314 lines
9.0 KiB
TypeScript
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);
|
|
});
|
|
}
|
|
}; |