Arbeiten mit dem Server
Das Booking-Widget wird über zwei Hauptoperationen mit einem Backend verknüpft: das Laden von Kartendaten vom Server und das Übermitteln von Slot-Reservierungen an den Server. Dieser Leitfaden erläutert beide Abläufe sowie die UTC-Konvertierung, die erforderlich ist, wenn die Serverdaten eine andere Zeitzone verwenden.
Daten vom Server laden
Rufen Sie Kartendaten mit der nativen fetch-API (oder einem gleichwertigen HTTP-Client) ab und übergeben Sie das geparste JSON über die Methode setConfig() an das Widget.
Das folgende Code-Snippet initialisiert eine leere Booking-Instanz und lädt den Datensatz, sobald die Antwort eintrifft:
const widget = new booking.Booking("#booking", { data: [] });
const server = "https://some-backend-url";
fetch(server + "/data")
.then((res) => res.json())
.then((data) => {
widget.setConfig({ data });
});
Slot-Reservierungen auf dem Server speichern
Um Slot-Reservierungen im Backend zu verarbeiten, registrieren Sie einen Bestätigungs-Handler mit der Methode setConfirmHandler().
Der Handler empfängt ein Event-Objekt mit drei Feldern:
slot— gebuchter Slot:id(Karten-ID) undtime([timestamp, duration])data— Formularwerte, die den Feld-IDs vonformShapezugeordnet sind (Standardwerte:name,email,description)confirm— Server-Antwort-Callbacks:done()bei Erfolg,error()bei Fehler
Das folgende Code-Snippet sendet die Reservierung an den Server und löst die Buchung basierend auf der Antwort auf:
// Reservierungslogik verarbeiten
const handleSlotReservation = (event) => {
const { confirm, slot, data } = event;
// Nutzdaten zusammenstellen
const info = {
item: slot.id,
start: slot.time[0],
data
};
// Nutzdaten an den Server senden
fetch("/server/url", {
method: "POST",
body: JSON.stringify(info),
// Buchung basierend auf der Antwort bestätigen oder ablehnen
}).then((response) => {
if (response.ok) confirm.done();
else confirm.error();
});
};
// Booking erstellen
const widget = new booking.Booking("#root", {
data: [],
// Konfigurationsparameter
});
// Datensatz vom Server abrufen
fetch("/server/url")
.then((res) => res.json())
.then((items) => {
// abgerufene Einträge in das Widget laden
widget.setConfig({ data: items });
// Reservierungs-Handler registrieren
widget.setConfirmHandler(handleSlotReservation);
});
Die Methode setConfirmHandler() ist eine Kurzform, die intern das Ereignis confirm-slot über widget.api.on("confirm-slot", handler) abonniert. Beide Ansätze registrieren einen Handler mit derselben Callback-Signatur — verwenden Sie widget.api.on("confirm-slot", handler) direkt, wenn Sie mehrere Abonnenten hinzufügen möchten.
UTC-Daten in die lokale Zeitzone konvertieren
Das Widget arbeitet in der lokalen Zeitzone. Wenn der Server UTC-Timestamps zurückgibt, konvertieren Sie jeden Timestamp vor der Übergabe an das Widget und konvertieren Sie ihn vor dem Senden von Reservierungen zurück in UTC.
Die folgenden Hilfsfunktionen verarbeiten beide Richtungen:
g2l— einen UTC-Timestamp in die lokale Zeitzone konvertieren (auf eingehendeusedSlotsundslots.datesanwenden)l2g— einen lokalen Timestamp zurück in UTC konvertieren (vor dem Senden an den Server aufslot.time[0]anwenden)
Das folgende Code-Snippet kombiniert beide Hilfsfunktionen in einem vollständigen Lade- und Reservierungsablauf:
const serverURL = "https://some-backend-url";
function g2l(v) {
const utcDate = new Date(v);
return new Date(
utcDate.getUTCFullYear(),
utcDate.getUTCMonth(),
utcDate.getUTCDate(),
utcDate.getUTCHours(),
utcDate.getUTCMinutes(),
utcDate.getUTCSeconds(),
utcDate.getUTCMilliseconds(),
).valueOf();
}
function l2g(v) {
const date = new Date(v);
return Date.UTC(
date.getFullYear(),
date.getMonth(),
date.getDate(),
date.getHours(),
date.getMinutes(),
date.getSeconds(),
date.getMilliseconds(),
);
}
const handleSlotReservation = event => {
const { confirm, slot, data } = event;
const info = {
doctor: slot.id,
date: l2g(slot.time[0]),
form: {
name: data.name,
email: data.email,
details: data.description,
},
};
fetch( serverURL + "/doctors/reservations", {
method: "POST",
body: JSON.stringify(info),
}).then(response => {
if (response.ok) confirm.done();
else confirm.error();
});
};
// Widget-Initialisierung
const widget = new booking.Booking("#root", {
data: [],
});
// Daten laden
fetch( serverURL + "/units")
.then(res => res.json())
.then(units => {
units.forEach(unit => {
if (unit.usedSlots) unit.usedSlots = unit.usedSlots.map(g2l);
if (unit.slots) {
unit.slots = unit.slots.map(slot => {
if (slot.dates) {
return {
...slot,
dates: slot.dates.map(g2l)
};
}
return slot;
});
};
});
widget.setConfig({ data: units });
widget.setConfirmHandler(handleSlotReservation);
});
Beispiel
Das folgende Snippet zeigt einen vollständigen serverseitigen Buchungsablauf:
Verwandte Artikel:
confirm-slot— Ereignis, das ausgelöst wird, wenn ein Benutzer einen Slot bestätigtsetConfig()— Widget-Konfiguration mit abgerufenen Daten aktualisierensetConfirmHandler()— Slot-Reservierungs-Handler registrieren