@ribajs/shopify
Version:
Shopify extension for Riba.js
117 lines (97 loc) • 2.87 kB
text/typescript
import { Component, ScopeBase } from "@ribajs/core";
import { selectAll, hasChildNodesTrim } from "@ribajs/utils/src/dom.js";
import { stripHtml } from "@ribajs/utils/src/type.js";
// TODO move to general validation component class we can extend from
export interface ValidationObject {
fields: {
[name: string]: string;
};
valid: boolean;
error?: string;
}
interface Scope extends ScopeBase {
form: ValidationObject;
send: ShopifyContactFormComponent["send"];
selectAll: ShopifyContactFormComponent["selectAll"];
}
export class ShopifyContactFormComponent extends Component {
public static tagName = "shopify-contact-form";
static get observedAttributes(): string[] {
return [];
}
protected form?: HTMLFormElement;
public scope: Scope = {
form: {
fields: {
firstName: "",
lastName: "",
fullName: "",
company: "",
phone: "",
email: "",
message: "",
},
valid: false,
error: undefined,
},
/** send form function */
send: this.send,
/** select all text function */
selectAll: this.selectAll,
};
constructor() {
super();
}
protected connectedCallback() {
super.connectedCallback();
this.init(ShopifyContactFormComponent.observedAttributes);
}
/**
* Send the contact form using a form submit request with best shopify form support
*/
public send(event: Event) {
for (const key in this.scope.form.fields) {
if (this.scope.form.fields[key]) {
this.scope.form.fields[key] = stripHtml(this.scope.form.fields[key]);
}
}
// stop native submit
event.preventDefault();
event.stopPropagation();
if (!this.form) {
return false;
}
this.validate(this.form, this.scope.form);
if (this.scope.form.valid) {
this.form.submit();
}
}
public selectAll(event: Event, scope: any, eventEl: HTMLInputElement) {
selectAll(eventEl);
}
protected validate(form: HTMLFormElement, validationScope: ValidationObject) {
validationScope.valid = form.checkValidity();
validationScope.error = form.validationMessage;
form.classList.add("was-validated");
}
protected async beforeBind() {
this.form = this.getElementsByTagName("form")[0];
// For custom style form validation, see https://getbootstrap.com/docs/4.1/components/forms/#custom-styles
this.form.classList.add("needs-validation");
this.form.setAttribute("novalidate", "");
}
protected requiredAttributes(): string[] {
return [];
}
protected async template() {
// Only set the component template if there no childs already
if (this && hasChildNodesTrim(this)) {
return null;
} else {
const { default: template } = await import(
"./contact-form.component.html?raw"
);
return template;
}
}
}