abiball/assets/controllers/form_controller.js

98 lines
2.4 KiB
JavaScript
Raw Normal View History

2025-01-29 19:07:31 +01:00
import { Controller } from "@hotwired/stimulus";
2025-01-30 19:20:29 +01:00
import { loadStripe } from "@stripe/stripe-js";
2025-01-29 16:44:20 +01:00
export default class extends Controller {
2025-01-30 19:20:29 +01:00
static targets = ["key", "submit", "firstname", "lastname", "email", "phone"];
2025-01-29 20:38:10 +01:00
stripe;
async connect() {
this.stripe = await loadStripe(this.keyTarget.textContent);
}
2025-01-29 19:07:31 +01:00
addEntry(event) {
event.preventDefault();
2025-01-29 19:06:48 +01:00
2025-01-29 19:07:31 +01:00
const formClone = this.element.querySelector("form").cloneNode(true);
2025-01-29 19:06:48 +01:00
2025-01-29 19:07:31 +01:00
formClone.querySelectorAll("select").forEach((input) => {
input.value = "1";
});
formClone.querySelector("input").value = "";
2025-01-29 16:44:20 +01:00
2025-01-29 19:07:31 +01:00
this.element.querySelector(".forms").appendChild(formClone);
}
2025-01-29 16:44:20 +01:00
2025-01-29 19:07:31 +01:00
removeEntry(event) {
event.preventDefault();
2025-01-29 19:06:48 +01:00
2025-01-29 19:07:31 +01:00
if (document.querySelector(".forms").childElementCount === 1) {
return;
2025-01-29 16:44:20 +01:00
}
2025-01-29 19:07:31 +01:00
event.target.closest("form").remove();
}
submit(event) {
event.preventDefault();
2025-01-30 19:20:29 +01:00
this.submitTarget.querySelector("span").classList.add("hidden");
this.submitTarget.querySelector("svg").classList.remove("hidden");
2025-01-30 12:26:26 +01:00
2025-01-29 19:07:31 +01:00
const forms = document.querySelectorAll("form");
2025-01-30 19:12:23 +01:00
const personalData = this.getPersonalData();
const ticketData = this.getTicketData(forms);
const formData = {
2025-01-30 19:20:29 +01:00
personal: personalData,
tickets: ticketData,
};
2025-01-29 19:07:31 +01:00
fetch("/ticket/submit", {
method: "POST",
body: JSON.stringify(formData),
headers: {
"Content-Type": "application/json",
},
}).then((response) => {
if (!response.ok) {
2025-01-30 19:20:29 +01:00
this.submitTarget.querySelector("svg").classList.add("hidden");
this.submitTarget.querySelector("span").classList.remove("hidden");
2025-01-29 19:07:31 +01:00
alert("An error occurred");
2025-01-29 20:38:10 +01:00
} else {
response.json().then((data) => {
this.stripe.redirectToCheckout({
sessionId: data.id,
});
});
2025-01-29 19:07:31 +01:00
}
});
}
2025-01-30 19:12:23 +01:00
getTicketData(forms) {
2025-01-29 19:07:31 +01:00
const formData = [];
forms.forEach((form) => {
2025-01-30 19:12:23 +01:00
formData.push(this.extractFormData(form));
2025-01-29 19:07:31 +01:00
});
return formData;
}
2025-01-30 19:12:23 +01:00
getPersonalData() {
return {
firstname: this.firstnameTarget.value,
lastname: this.lastnameTarget.value,
email: this.emailTarget.value,
phone: this.phoneTarget.value,
};
}
extractFormData(form) {
return {
ticket: parseInt(form.querySelector('select[name="ticket"]').value),
food: parseInt(form.querySelector('select[name="food"]').value),
note: form.querySelector('input[name="note"]').value,
2025-01-30 19:20:29 +01:00
};
2025-01-30 19:12:23 +01:00
}
2025-01-29 19:07:31 +01:00
}