Eventos del Widget
Callbacks y eventos para responder a las acciones del usuario y personalizar el flujo de reservas.
Introduccion
El widget emite eventos en diferentes momentos del flujo de reservas. Puedes suscribirte a estos eventos mediante callbacks en la configuracion inicial:
SalonBookIt.init({
apiKey: 'hh_live_...',
container: '#widget',
// Callbacks de eventos
onReady: (business) => { /* ... */ },
onStepChange: (step, data) => { /* ... */ },
onServiceSelect: (service) => { /* ... */ },
onBookingComplete: (booking) => { /* ... */ },
onError: (error) => { /* ... */ }
});
Referencia de eventos
onReady
Se dispara cuando el widget ha cargado completamente y esta listo para usarse.
Parametros
| Parametro | Tipo | Descripcion |
|---|---|---|
business |
object |
Informacion del negocio cargado |
Ejemplo
onReady: (business) => {
console.log('Negocio:', business.nombre);
console.log('Servicios disponibles:', business.servicios_count);
// Actualizar UI externa
document.querySelector('.loading').style.display = 'none';
}
Objeto business
{
"id": "uuid-del-tenant",
"nombre": "Mi Salon",
"telefono": "+34612345678",
"email": "info@misalon.com",
"direccion": "Calle Principal 123",
"logo_url": "https://...",
"servicios_count": 12,
"profesionales_count": 5,
"moneda": "EUR",
"simbolo_moneda": "€"
}
onStepChange
Se dispara cuando el usuario avanza o retrocede en el flujo de reservas.
Parametros
| Parametro | Tipo | Descripcion |
|---|---|---|
step |
string |
Nombre del paso actual |
data |
object |
Datos acumulados hasta el momento |
Pasos disponibles
'services'- Seleccion de servicios'staff'- Seleccion de profesional'datetime'- Seleccion de fecha y hora'customer'- Datos del cliente'payment'- Pago (si aplica)'confirmation'- Confirmacion final
Ejemplo
onStepChange: (step, data) => {
console.log('Paso actual:', step);
// Analytics
gtag('event', 'booking_step', {
'step_name': step,
'services_selected': data.services?.length || 0
});
// Actualizar breadcrumbs externos
updateBreadcrumbs(step);
}
onServiceSelect
Se dispara cuando el usuario selecciona o deselecciona un servicio.
Parametros
| Parametro | Tipo | Descripcion |
|---|---|---|
service |
object |
Servicio seleccionado |
selected |
boolean |
Si fue seleccionado o deseleccionado |
allSelected |
array |
Todos los servicios seleccionados actualmente |
Ejemplo
onServiceSelect: (service, selected, allSelected) => {
console.log(selected ? 'Añadido:' : 'Eliminado:', service.nombre);
// Actualizar precio total en UI externa
const total = allSelected.reduce((sum, s) => sum + s.precio, 0);
document.querySelector('.total-price').textContent = `€${total}`;
}
onStaffSelect
Se dispara cuando el usuario selecciona un profesional.
Ejemplo
onStaffSelect: (staff) => {
console.log('Profesional:', staff.nombre);
// staff = { id, nombre, imagen_url, especialidades }
}
onDateSelect
Se dispara cuando el usuario selecciona una fecha y hora.
Ejemplo
onDateSelect: (datetime) => {
console.log('Fecha:', datetime.fecha); // '2024-01-20'
console.log('Hora:', datetime.hora); // '10:30'
}
onBookingComplete
Se dispara cuando la reserva se ha creado exitosamente (antes del pago si aplica).
Ejemplo
onBookingComplete: (booking) => {
console.log('Reserva creada:', booking.id);
// Analytics
gtag('event', 'purchase', {
'transaction_id': booking.id,
'value': booking.total,
'currency': 'EUR'
});
// Redirigir a pagina de confirmacion
window.location.href = `/reserva-confirmada/${booking.id}`;
}
Objeto booking
{
"id": 12345,
"codigo": "ABC123",
"fecha": "2024-01-20",
"hora_inicio": "10:30",
"hora_fin": "11:00",
"servicios": [
{ "id": 1, "nombre": "Corte clasico", "precio": 25.00 }
],
"profesional": {
"id": 5,
"nombre": "Carlos Garcia"
},
"cliente": {
"nombre": "Juan Perez",
"email": "juan@email.com",
"telefono": "+34612345678"
},
"total": 25.00,
"estado": "confirmada",
"pago_pendiente": true
}
onPaymentComplete
Se dispara cuando el pago se ha completado exitosamente.
Ejemplo
onPaymentComplete: (payment) => {
console.log('Pago completado');
console.log('ID:', payment.payment_intent_id);
console.log('Monto:', payment.amount);
// Mostrar mensaje de exito
showSuccessMessage('¡Pago recibido!');
}
onError
Se dispara cuando ocurre un error en cualquier punto del flujo.
Ejemplo
onError: (error) => {
console.error('Error:', error.code, error.message);
// Reportar a sistema de errores
Sentry.captureException(error);
// Mostrar mensaje al usuario
if (error.code === 'SLOT_UNAVAILABLE') {
alert('Lo sentimos, ese horario ya no esta disponible.');
}
}
Codigos de error comunes
| Codigo | Descripcion |
|---|---|
INVALID_API_KEY |
API Key invalida |
NETWORK_ERROR |
Error de conexion |
SLOT_UNAVAILABLE |
Horario ya no disponible |
PAYMENT_FAILED |
Error en el pago |
VALIDATION_ERROR |
Datos del formulario invalidos |
onClose
Se dispara cuando el usuario cierra el widget (solo en modo modal).
Ejemplo
onClose: () => {
console.log('Widget cerrado');
// Preguntar si quiere guardar borrador
if (hasUnsavedData()) {
saveBookingDraft();
}
}
Metodos del Widget
Ademas de los eventos, puedes controlar el widget programaticamente:
// Obtener referencia al widget
const widget = SalonBookIt.init({ ... });
// Abrir modal (solo en modo modal/button)
widget.open();
// Cerrar modal
widget.close();
// Ir a un paso especifico
widget.goToStep('services');
// Reiniciar el widget
widget.reset();
// Destruir el widget
widget.destroy();