Widget por npm y React
Instala @utilia-os/widget por npm, inicialízalo desde tu código y contrólalo en React con todas las opciones de configuración.
Actualizado el . 4 min de lectura
Incluido en los planes Profesional y Avanzado. Ver precios
El widget de soporte también se distribuye como paquete npm, @utilia-os/widget. Es la vía adecuada si tu web es una aplicación de página única o usa un empaquetador (Vite, webpack) o un framework como React, Vue o Svelte: lo inicializas desde tu código, lo abres desde tus propios botones y te enteras de cada ticket creado.
Si solo necesitas pegar un fragmento en el HTML, la etiqueta de script es más sencilla. En ambos casos, prepara antes la aplicación externa, su clave y tus dominios autorizados como se explica en la visión general.
Instalación
npm install @utilia-os/widgetEl paquete trae sus propios tipos de TypeScript e incluye dentro el SDK de JavaScript, así que no tienes que instalar nada más. Al importarlo se registra el componente web utilia-support; funciona en cualquier navegador actual con soporte de componentes web.
Uso básico
initUtiliaWidget busca el elemento <utilia-support> en la página; si no existe, lo crea y lo añade al final del body. Después lo configura y te devuelve la instancia para controlarlo.
import { initUtiliaWidget } from '@utilia-os/widget';
const widget = initUtiliaWidget({
baseURL: 'https://os.utilia.ai/api',
apiKey: 'TU_CLAVE_DE_API',
userId: 'user-123',
});
widget.open();La clave de API viaja en el navegador y cualquiera puede leerla: usa una aplicación externa dedicada al widget, con los scopes mínimos y tus dominios autorizados, como se explica en la visión general.
Opciones de configuración
Solo baseURL, apiKey y userId son obligatorias.
- baseURLstringobligatorio
- Dirección base de la API:
https://os.utilia.ai/api. - apiKeystringobligatorio
- Clave de API de la aplicación externa.
- userIdstringobligatorio
- Identificador de la persona en tu sistema. Separa los tickets de cada usuario.
- userEmailstring
- Correo de la persona. Se guarda al identificarla.
- userNamestring
- Nombre de la persona. Se guarda al identificarla.
- userMetadataRecord<string, unknown>
- Datos adicionales de la persona, por ejemplo su plan o su empresa en tu sistema.
- position'bottom-right' | 'bottom-left'Por defecto:
bottom-right - Esquina en la que aparece el botón.
- theme'light' | 'dark' | 'auto'Por defecto:
light - Aspecto del widget.
autose acepta, pero hoy se pinta igual quelight. - defaultCategory'CONSULTA' | 'BUG' | 'SUGERENCIA'Por defecto:
CONSULTA - Categoría preseleccionada en el formulario. Son las tres que acepta la API.
- defaultPriority'BAJA' | 'MEDIA' | 'ALTA' | 'CRITICA'Por defecto:
MEDIA - Prioridad preseleccionada en el formulario.
- autoContextbooleanPor defecto:
false - Si es
true, cada ticket lleva la dirección de la página y los datos del navegador. - onTicketCreated(ticket: { id: string; ticketKey: string }) => void
- Se llama al crear un ticket, con su identificador y su clave legible.
- onError(error: Error) => void
- Se llama cuando falla una operación del widget.
Fíjate en autoContext: por npm está desactivado si no lo pones, mientras que con la etiqueta de script está activado salvo que escribas false.
Integración con React
En React, el widget sigue la vida del componente que lo monta:
El widget dentro de un componente de React
useEffect
Al montar
initUtiliaWidget crea el elemento, identifica al usuario y pide sus mensajes sin leer. Guarda la instancia en un useRef.Tus botones
Mientras está en pantalla
Llamas a open() o showNewTicketForm(), y onTicketCreated te avisa de cada ticket nuevo.Limpieza del efecto
Al desmontar
widget.remove() quita el elemento de la página.
import { useEffect, useRef, useState } from 'react';
import { initUtiliaWidget } from '@utilia-os/widget';
export function SoporteWidget({ usuario }: { usuario: { id: string; email: string; nombre: string } }) {
const widgetRef = useRef<ReturnType<typeof initUtiliaWidget> | null>(null);
const [ultimoTicket, setUltimoTicket] = useState<string | null>(null);
useEffect(() => {
const widget = initUtiliaWidget({
baseURL: 'https://os.utilia.ai/api',
apiKey: import.meta.env.VITE_UTILIA_API_KEY,
userId: usuario.id,
userEmail: usuario.email,
userName: usuario.nombre,
autoContext: true,
onTicketCreated: (ticket) => setUltimoTicket(ticket.ticketKey),
onError: (error) => console.error('Widget de soporte:', error),
});
widgetRef.current = widget;
// Al desmontar, el widget sale de la página.
return () => {
widget.remove();
widgetRef.current = null;
};
}, [usuario.id, usuario.email, usuario.nombre]);
return (
<div>
<button onClick={() => widgetRef.current?.open()}>Abrir soporte</button>
<button onClick={() => widgetRef.current?.showNewTicketForm()}>Informar de un problema</button>
{ultimoTicket && <p>Último ticket creado: {ultimoTicket}</p>}
</div>
);
}Cada llamada a initUtiliaWidget vuelve a identificar al usuario y a pedir el contador de no leídos, y ambas peticiones cuentan para el límite de la clave. Por eso el efecto depende solo de los datos del usuario: si cambian, el widget se reconfigura; si no, se queda como está.
Métodos de la instancia
| Método | Qué hace |
|---|---|
open() | Abre el widget con la lista de tickets del usuario. Emite widget:open. |
close() | Lo cierra y deja solo el botón flotante. Emite widget:close. |
showNewTicketForm() | Abre directamente el formulario de ticket nuevo. |
showTicketDetail(ticketId) | Abre el detalle de un ticket a partir de su identificador. |
La instancia es el propio elemento <utilia-support>, así que también puedes escuchar sus eventos con addEventListener. Están explicados en Eventos y callbacks.