import{P as d}from"./form-validation-58394433.js";import{s as g}from"./animation-7e2d11a2.js";import{g as f}from"./request-a636442b.js";class p{constructor(t,s){if(!t)throw new Error("Form not found for form handler");this.options={submitBtnSelector:"[data-submit]",serverMessageSelector:"[data-server-message]",serverMessageClass:"server-message",defaultServerErrorMsg:"Something went wrong",arrayFields:[],scrollToError:!0,shakeOnError:!0,onlyAllowSubmitIfDirty:!1,onSuccess:e=>{},onError:(e,i)=>{},onValidationFailed:e=>{},onBeforeSubmit:e=>{},onSubmitStart:e=>{},onSubmitEnd:e=>{},transformData:(e,i)=>{},...s},this.form=t,this.pristineValidation=d(this.form),this.initialPayload=this.getPayloadData(),this.bindListeners(),this.syncSubmitDirtyState()}bindListeners(){this.form.addEventListener("submit",t=>{t.preventDefault(),!(this.options.onlyAllowSubmitIfDirty&&!this.isDirty())&&this.submitForm()}),this.form.addEventListener("input",this.syncSubmitDirtyState.bind(this)),this.form.addEventListener("change",this.syncSubmitDirtyState.bind(this)),this.form.addEventListener("recaptcha-v2:error",()=>{this.setServerMessage("There was a problem with the reCAPTCHA. Please try again later.")})}async submitForm(){var i,a,n,l,h,u,m;if(this.form.hasAttribute("is-submitting"))return;const t=this.getPayloadData();if(!((i=this.pristineValidation)!=null&&i.validate())){if(this.options.shakeOnError&&this.shakeSubmitButton(),this.options.scrollToError){const r=this.form.querySelector(".has-validation-error");r==null||r.scrollIntoView({behavior:"smooth",block:"nearest"})}(n=(a=this.options).onValidationFailed)==null||n.call(a,t);return}if(this.options.onBeforeSubmit&&this.options.onBeforeSubmit(t)===!1)return;const s=this.form.querySelector("drb-recaptcha-v2");if(s&&!s.response){s.execute(this.submitForm.bind(this));return}this.toggleFormSubmitting(!0),this.setServerMessage(null),(h=(l=this.options).onSubmitStart)==null||h.call(l,t);let e;try{if(e=await fetch(this.form.getAttribute("action"),{method:this.form.getAttribute("method")||"POST",body:JSON.stringify(t),headers:{"X-Requested-With":"XMLHttpRequest","Content-Type":"application/json","X-CSRF-Token":f()}}),e.status<200||e.status>=400){let r;if(e.status===422)r=await e.text();else if(e.status===429){const o=await e.json();r=(o==null?void 0:o.message)||"Too many requests. Please try again later."}throw new Error(r||this.options.defaultServerErrorMsg)}this.initialPayload=t,this.options.onSuccess(e)}catch(r){const o=r instanceof Error?r.message:this.options.defaultServerErrorMsg;this.setServerMessage(o),this.toggleFormSubmitting(!1),console.error(o,r),this.options.onError(e,o),s==null||s.reset()}finally{(m=(u=this.options).onSubmitEnd)==null||m.call(u,t)}}toggleFormSubmitting(t){const s=this.form.querySelector(this.options.submitBtnSelector);this.form.toggleAttribute("is-submitting",t),s==null||s.classList.toggle("btn2--loading",t),this.toggleSubmitDisabled(t)}toggleSubmitDisabled(t){const s=this.form.querySelector(this.options.submitBtnSelector);s==null||s.toggleAttribute("disabled",t)}shakeSubmitButton(){const t=this.form.querySelector(this.options.submitBtnSelector);g(t)}setServerMessage(t,s=!0){const e=this.form.querySelector(this.options.serverMessageSelector);e&&(e.classList.toggle(this.options.serverMessageClass,!0),e.toggleAttribute("hidden",!t),e.toggleAttribute("data-non-error",!s),e.innerHTML=t)}getPayloadData(){const t=new FormData(this.form),s={};for(const i of t.keys()){const a=t.getAll(i).filter(n=>n!=="");a.length!==0&&(s[i]=this.options.arrayFields.includes(i)?a:a[0])}return this.options.transformData(s,t)||s}isDirty(){const t=this.getPayloadData();return JSON.stringify(t)!==JSON.stringify(this.initialPayload)}syncSubmitDirtyState(){this.options.onlyAllowSubmitIfDirty&&this.toggleSubmitDisabled(!this.isDirty())}}export{p as F}; //# sourceMappingURL=form-handler-d276c37d.js.map