Saltar al contenido principal

Eventos y motor

El SDK expone dos mecanismos para reaccionar a lo que ocurre en el visor: callbacks en StartOptions y eventos mediante vto.on(). Adicionalmente, el objeto VtoEngine que devuelve OBVto.init() ofrece métodos para controlar el motor desde el exterior.


Callbacks en start()

Se pasan como campos de StartOptions y se invocan una sola vez por ocurrencia.

CallbackFirmaCuándo se invoca
onReady() => voidEl módulo está listo y el loop de renderizado ha arrancado.
onError(err: Error) => voidOcurrió un error durante el arranque (ej. cámara denegada).
onCapture(dataUrl: string) => voidEl usuario o el código llamó a capture().
onAddToCart(color: Color) => voidEl usuario pulsó "Añadir al carrito" en la card del producto.
onClose() => voidEl visor se cerró y el overlay de cierre terminó (botón ✕ → "Listo").
onHome() => voidEl usuario pulsó el botón de inicio en la barra del visor.
onProductClick(p: Product) => voidEl usuario pulsó "Ver el producto" en la card.
onFavorite(p: Product) => voidEl usuario añadió un producto a favoritos.
onUnfavorite(p: Product) => voidEl usuario quitó un producto de favoritos.
onNps(result: NpsResult) => voidEl usuario envió el formulario NPS (ver 07-cierre-y-nps.md).

Todos los callbacks son opcionales. Los tipos Color, Product y NpsResult están en 10-referencia-de-tipos.md.


Eventos con vto.on()

Alternativa basada en eventos al estilo EventEmitter. Útil cuando el host no controla start() directamente o necesita múltiples oyentes para el mismo evento.

vto.on(name: VtoEventName, cb: (payload?: VtoEventPayload) => void): void
NombrePayloadEquivale al callback
'ready'undefinedonReady
'error'ErroronError
'shade_selected'Color— (sin callback directo)
'capture'string (dataURL)onCapture
'add_to_cart'ColoronAddToCart

shade_selected se emite cada vez que el usuario elige un tono (incluye la selección del tono inicial al arrancar).

Ejemplo

const vto = await OBVto.init({ modules: ['hair-color'], container: '#vto' })

vto.on('ready', () => console.log('motor listo'))
vto.on('shade_selected', (color) => console.log('tono elegido', color))
vto.on('capture', (dataUrl) => enviarAlServidor(dataUrl))

await vto.start({ module: 'hair-color', colors: TONOS })

Métodos del motor

El objeto VtoEngine devuelto por OBVto.init() expone los siguientes métodos públicos.

MétodoFirma exactaDescripción
onon(name: VtoEventName, cb: (payload?: VtoEventPayload) => void): voidSuscribe un oyente a un evento del motor.
setColorsetColor(id: string): voidCambia el tono activo por su id. Emite shade_selected.
setIntensitysetIntensity(v: number): voidAjusta la intensidad del efecto (0 = sin efecto, 1 = máximo).
comparecompare(on: boolean): voidActiva o desactiva el modo «Antes | Después» (split de pantalla).
capturecapture(): stringCaptura el visual actual como PNG y devuelve un dataURL. Aplica marca de agua si la licencia lo exige. Invoca onCapture.
downloaddownload(filename = 'vto.png'): voidDescarga el PNG del visual actual. Internamente llama capture().
stopstop(): voidDetiene el loop de renderizado, libera la cámara y destruye la UI.
analyzeanalyze(): Promise<unknown>Ejecuta el análisis del módulo activo (si lo soporta). Lanza error si el módulo no implementa analyze.

Notas de uso

  • capture() devuelve el composite del split «Antes | Después» cuando está activo, no el canvas crudo.
  • download() llama a capture() internamente: el fichero descargado respeta el watermark de licencia y el composite del split.
  • analyze() lanza Error si no hay módulo activo o si el módulo no implementa la operación. Comprueba la disponibilidad antes de llamarlo si no estás seguro del módulo.
  • stop() es idempotente: llamarlo múltiples veces no produce errores.

Ejemplo

const vto = await OBVto.init({ modules: ['hair-color'], container: '#vto' })
await vto.start({ module: 'hair-color', colors: TONOS })

// Cambiar tono programáticamente
vto.setColor('rubio-dorado')

// Ajustar intensidad al 60 %
vto.setIntensity(0.6)

// Activar modo comparación
vto.compare(true)

// Capturar y compartir
const dataUrl = vto.capture()
compartirImagen(dataUrl)

// Descargar como fichero
vto.download('mi-look-aura.png')

// Detener el motor al salir de la página
window.addEventListener('beforeunload', () => vto.stop())