Saltar al contenido principal

API programatica del Feedback Widget

Ademas de la interfaz visual con el boton flotante, puedes controlar el widget completamente desde codigo. Esto te permite abrir el formulario desde tus propios botones, enviar feedback sin interfaz visual, o reaccionar a eventos del widget.

Hook useFeedbackWidget (React)

El paquete @almirant/feedback-react incluye un hook que da acceso completo a la API del widget.

import { useFeedbackWidget } from '@almirant/feedback-react';

function MiComponente() {
const {
open, // Abre el formulario
close, // Cierra el formulario
submit, // Envia feedback programaticamente
isReady, // true cuando el widget esta inicializado
isOpen, // true cuando el formulario esta visible
error, // Ultimo error o null
} = useFeedbackWidget();

return (
<button onClick={open}>
Enviar feedback
</button>
);
}
Importante

El hook useFeedbackWidget requiere que el componente <FeedbackWidget> este montado en algun lugar del arbol de componentes. Si no hay widget montado, el hook devuelve funciones no-op y isReady sera false.

Propiedades del hook

PropiedadTipoDescripcion
open()() => voidAbre el formulario de feedback
close()() => voidCierra el formulario
submit(data)(data: FeedbackData) => Promise<void>Envia feedback programaticamente
isReadybooleantrue cuando el widget esta completamente inicializado
isOpenbooleantrue cuando el formulario esta visible
errorstring | nullMensaje del ultimo error, o null si no hay errores

Ejemplo: boton personalizado

Oculta el boton flotante por defecto y usa tu propio boton:

import { FeedbackWidget, useFeedbackWidget } from '@almirant/feedback-react';

function FeedbackButton() {
const { open, isReady } = useFeedbackWidget();

return (
<button
onClick={open}
disabled={!isReady}
className="mi-boton-feedback"
>
Dejar feedback
</button>
);
}

function App() {
return (
<>
<nav>
<FeedbackButton />
</nav>

<FeedbackWidget
publicKey="pk_tu_clave_publica"
showTriggerLabel={false}
/>
</>
);
}

Ejemplo: enviar feedback programaticamente

Envia feedback sin mostrar el formulario visual. Util para recopilar feedback contextual (despues de completar una accion, al cerrar un modal, etc.).

import { useFeedbackWidget } from '@almirant/feedback-react';

function PostCompraFeedback() {
const { submit, error } = useFeedbackWidget();

const handleRating = async (rating: number) => {
await submit({
message: `Valoracion post-compra: ${rating}/5`,
metadata: {
type: 'rating',
rating,
orderId: 'order_123',
},
});
};

return (
<div>
<p>Como fue tu experiencia de compra?</p>
{[1, 2, 3, 4, 5].map((n) => (
<button key={n} onClick={() => handleRating(n)}>
{n}
</button>
))}
{error && <p className="error">{error}</p>}
</div>
);
}

Tipo FeedbackData

interface FeedbackData {
message: string; // Texto del feedback (requerido)
category?: string; // Categoria: 'bug', 'feature', 'improvement', 'other'
metadata?: Record<string, unknown>; // Datos adicionales
}

API global (JavaScript)

Cuando usas el script tag, la API esta disponible en el objeto global FeedbackWidget.

Metodos

// Abrir el formulario
FeedbackWidget.open();

// Cerrar el formulario
FeedbackWidget.close();

// Enviar feedback sin interfaz visual
FeedbackWidget.submit({
message: 'El boton de pago no responde en Safari',
category: 'bug',
metadata: {
browser: navigator.userAgent,
page: window.location.href,
},
});

// Verificar si el widget esta listo
if (FeedbackWidget.isReady()) {
FeedbackWidget.open();
}

Referencia de metodos

MetodoParametrosRetornoDescripcion
init(options)WidgetOptionsvoidInicializa el widget con la configuracion dada
open()--voidAbre el formulario
close()--voidCierra el formulario
submit(data)FeedbackDataPromise<void>Envia feedback programaticamente
isReady()--booleanDevuelve true si el widget esta inicializado
isOpen()--booleanDevuelve true si el formulario esta visible
destroy()--voidElimina el widget del DOM y libera recursos

Eventos y callbacks

Puedes suscribirte a eventos del widget para reaccionar a acciones del usuario.

Script tag

FeedbackWidget.init({
publicKey: 'pk_tu_clave_publica',
onOpen: () => {
console.log('El formulario se abrio');
},
onClose: () => {
console.log('El formulario se cerro');
},
onSubmit: (data) => {
console.log('Feedback enviado:', data.message);
// Puedes enviar a tu propio analytics
analytics.track('feedback_submitted', {
category: data.category,
});
},
onError: (error) => {
console.error('Error al enviar feedback:', error);
},
});

React

<FeedbackWidget
publicKey="pk_tu_clave_publica"
onOpen={() => console.log('Abierto')}
onClose={() => console.log('Cerrado')}
onSubmit={(data) => {
analytics.track('feedback_submitted', {
category: data.category,
});
}}
onError={(error) => {
console.error('Error:', error);
}}
/>

Lista de callbacks

CallbackParametrosSe dispara cuando...
onOpen--El formulario se abre
onClose--El formulario se cierra
onSubmit{ message, category, metadata }Se envia feedback exitosamente
onError{ message: string }Ocurre un error al enviar

Enviar feedback sin interfaz visual

Si no necesitas el formulario visual y quieres construir tu propia UI, puedes usar solo la funcion submit:

JavaScript

// Inicializa sin boton visible
FeedbackWidget.init({
publicKey: 'pk_tu_clave_publica',
// No se muestra boton flotante al usar submit directamente
});

// Tu formulario personalizado
document.getElementById('mi-formulario').addEventListener('submit', async (e) => {
e.preventDefault();
const mensaje = document.getElementById('mensaje').value;

try {
await FeedbackWidget.submit({
message: mensaje,
category: 'feature',
metadata: {
source: 'custom-form',
page: window.location.pathname,
},
});
alert('Feedback enviado');
} catch (error) {
alert('Error al enviar: ' + error.message);
}
});

React

import { FeedbackWidget, useFeedbackWidget } from '@almirant/feedback-react';

function CustomFeedbackForm() {
const { submit, error } = useFeedbackWidget();
const [message, setMessage] = useState('');
const [sending, setSending] = useState(false);

const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault();
setSending(true);

try {
await submit({
message,
category: 'feature',
metadata: { source: 'custom-form' },
});
setMessage('');
} finally {
setSending(false);
}
};

return (
<form onSubmit={handleSubmit}>
<textarea
value={message}
onChange={(e) => setMessage(e.target.value)}
placeholder="Tu feedback..."
required
/>
<button type="submit" disabled={sending}>
{sending ? 'Enviando...' : 'Enviar'}
</button>
{error && <p className="error">{error}</p>}
</form>
);
}

// No olvides montar el widget (puede estar oculto)
function App() {
return (
<>
<CustomFeedbackForm />
<FeedbackWidget publicKey="pk_tu_clave_publica" />
</>
);
}
Consejo

Aunque construyas tu propia interfaz, necesitas inicializar el widget con FeedbackWidget.init() o montar <FeedbackWidget> para que la funcion submit tenga acceso a la API de Almirant. El widget se encarga de la autenticacion y el envio.

Destruir el widget

Si necesitas eliminar el widget completamente (por ejemplo, al cambiar de seccion en una SPA):

// JavaScript
FeedbackWidget.destroy();

En React, el widget se destruye automaticamente cuando se desmonta el componente <FeedbackWidget>.