Zum Hauptinhalt springen

Programmatische API des Feedback-Widgets

Neben der visuellen Oberfläche mit dem schwebenden Button kannst du das Widget vollständig per Code steuern. Dadurch kannst du das Formular über deine eigenen Buttons öffnen, Feedback ohne visuelle Oberfläche senden oder auf Widget-Ereignisse reagieren.

Hook useFeedbackWidget (React)

Das Paket @almirant/feedback-react enthält einen Hook, der vollständigen Zugriff auf die API des Widgets bietet.

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

function MiComponente() {
const {
open, // Öffnet das Formular
close, // Schließt das Formular
submit, // Sendet Feedback programmatisch
isReady, // true, wenn das Widget initialisiert ist
isOpen, // true, wenn das Formular sichtbar ist
error, // Letzter Fehler oder null
} = useFeedbackWidget();

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

Der Hook useFeedbackWidget setzt voraus, dass die Komponente <FeedbackWidget> an einer Stelle im Komponentenbaum eingebunden ist. Wenn kein Widget eingebunden ist, gibt der Hook No-Op-Funktionen zurück und isReady ist false.

Hook-Eigenschaften

EigenschaftTypBeschreibung
open()() => voidÖffnet das Feedback-Formular
close()() => voidSchließt das Formular
submit(data)(data: FeedbackData) => Promise<void>Sendet Feedback programmatisch
isReadybooleantrue, wenn das Widget vollständig initialisiert ist
isOpenbooleantrue, wenn das Formular sichtbar ist
errorstring | nullMeldung des letzten Fehlers oder null, wenn kein Fehler vorliegt

Beispiel: Benutzerdefinierter Button

Blende den standardmäßigen schwebenden Button aus und verwende deinen eigenen Button:

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}
/>
</>
);
}

Beispiel: Feedback programmatisch senden

Sende Feedback, ohne das visuelle Formular anzuzeigen. Das ist nützlich, um kontextbezogenes Feedback zu erfassen (nach dem Abschließen einer Aktion, beim Schließen eines Modals usw.).

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>
);
}

Typ FeedbackData

interface FeedbackData {
message: string; // Feedback-Text (erforderlich)
category?: string; // Kategorie: 'bug', 'feature', 'improvement', 'other'
metadata?: Record<string, unknown>; // Zusätzliche Daten
}

Globale API (JavaScript)

Wenn du den Script-Tag verwendest, ist die API im globalen Objekt FeedbackWidget verfügbar.

Methoden

// Formular öffnen
FeedbackWidget.open();

// Formular schließen
FeedbackWidget.close();

// Feedback ohne visuelle Oberfläche senden
FeedbackWidget.submit({
message: 'El boton de pago no responde en Safari',
category: 'bug',
metadata: {
browser: navigator.userAgent,
page: window.location.href,
},
});

// Prüfen, ob das Widget bereit ist
if (FeedbackWidget.isReady()) {
FeedbackWidget.open();
}

Methodenreferenz

MethodeParameterRückgabewertBeschreibung
init(options)WidgetOptionsvoidInitialisiert das Widget mit der angegebenen Konfiguration
open()--voidÖffnet das Formular
close()--voidSchließt das Formular
submit(data)FeedbackDataPromise<void>Sendet Feedback programmatisch
isReady()--booleanGibt true zurück, wenn das Widget initialisiert ist
isOpen()--booleanGibt true zurück, wenn das Formular sichtbar ist
destroy()--voidEntfernt das Widget aus dem DOM und gibt Ressourcen frei

Ereignisse und Callbacks

Du kannst Widget-Ereignisse abonnieren, um auf Nutzeraktionen zu reagieren.

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);
// Du kannst Daten an deine eigene Analytics-Lösung senden
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);
}}
/>

Callback-Liste

CallbackParameterWird ausgelöst, wenn ...
onOpen--Das Formular geöffnet wird
onClose--Das Formular geschlossen wird
onSubmit{ message, category, metadata }Feedback erfolgreich gesendet wird
onError{ message: string }Beim Senden ein Fehler auftritt

Feedback ohne visuelle Oberfläche senden

Wenn du das visuelle Formular nicht benötigst und eine eigene Benutzeroberfläche erstellen möchtest, kannst du nur die Funktion submit verwenden:

JavaScript

// Ohne sichtbaren Button initialisieren
FeedbackWidget.init({
publicKey: 'pk_tu_clave_publica',
// Beim direkten Einsatz von submit wird kein schwebender Button angezeigt
});

// Dein benutzerdefiniertes Formular
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>
);
}

// Vergiss nicht, das Widget einzubinden (es kann ausgeblendet sein)
function App() {
return (
<>
<CustomFeedbackForm />
<FeedbackWidget publicKey="pk_tu_clave_publica" />
</>
);
}
Tipp

Auch wenn du deine eigene Benutzeroberfläche erstellst, musst du das Widget mit FeedbackWidget.init() initialisieren oder <FeedbackWidget> einbinden, damit die Funktion submit Zugriff auf die Almirant-API hat. Das Widget übernimmt die Authentifizierung und das Senden.

Widget entfernen

Wenn du das Widget vollständig entfernen musst (zum Beispiel beim Wechseln eines Bereichs in einer SPA):

// JavaScript
FeedbackWidget.destroy();

In React wird das Widget automatisch entfernt, wenn die Komponente <FeedbackWidget> ausgehängt wird.