import { setStatus } from "./status.js"; import { triggerEvent } from "./event.js"; import { apiFetch } from "./api-fetch.js"; import { setValidationError, removeValidationError } from "./validate.js"; export default async function submit(form, options = {}) { // Another submission is ongoing. if ("submitting" === form.wpcf7.status) { return; } // Irritating submission mode // https://github.com/rocklobster-in/contact-form-7/issues/533 if (wpcf7.blocked) { clearResponse(form); setStatus(form, "submitting"); return; } const formData = new FormData(form); if (options.submitter && options.submitter.name) { formData.append(options.submitter.name, options.submitter.value); } const detail = { contactFormId: form.wpcf7.id, pluginVersion: form.wpcf7.pluginVersion, contactFormLocale: form.wpcf7.locale, unitTag: form.wpcf7.unitTag, containerPostId: form.wpcf7.containerPost, status: form.wpcf7.status, inputs: Array.from(formData, (val) => { const name = val[0], value = val[1]; return name.match(/^_/) ? false : { name, value }; }).filter((val) => false !== val), formData, }; clearResponse(form); triggerEvent(form, "beforesubmit", detail); setStatus(form, "submitting"); const response = await apiFetch({ endpoint: `contact-forms/${form.wpcf7.id}/feedback`, method: "POST", body: formData, wpcf7: { endpoint: "feedback", form, detail, }, }); const status = setStatus(form, response.status); detail.status = response.status; detail.apiResponse = response; if (["invalid", "unaccepted", "spam", "aborted"].includes(status)) { triggerEvent(form, status, detail); } else if (["sent", "failed"].includes(status)) { triggerEvent(form, `mail${status}`, detail); } triggerEvent(form, "submit", detail); if (response.posted_data_hash) { form.querySelector('input[name="_wpcf7_posted_data_hash"]').value = response.posted_data_hash; } if ("mail_sent" === response.status) { form.reset(); form.wpcf7.resetOnMailSent = true; } if (response.invalid_fields) { response.invalid_fields.forEach((error) => { setValidationError(form, error.field, error.message); }); } form.wpcf7.parent .querySelector('.screen-reader-response [role="status"]') .insertAdjacentText("beforeend", response.message); form.querySelectorAll(".wpcf7-response-output").forEach((div) => { div.innerText = response.message; }); } export const clearResponse = (form) => { form.querySelectorAll(".wpcf7-form-control-wrap").forEach((wrap) => { if (wrap.dataset.name) { removeValidationError(form, wrap.dataset.name); } }); form.wpcf7.parent.querySelector( '.screen-reader-response [role="status"]', ).innerText = ""; form.querySelectorAll(".wpcf7-response-output").forEach((div) => { div.innerText = ""; }); };