import { init,InitResult,createElement, type Payment } from '@airwallex/components-sdk'; // export {Payment}; export type AirwallexCartNumberElementType = Payment.CardNumberElementType; export type AirwallexCvcElementType = Payment.CvcElementType; export type AirwallexExpiryDateElementType = Payment.ExpiryDateElementType; export interface AirwallexCardElements{ cardNumber?: AirwallexCartNumberElementType; cvc?: AirwallexCvcElementType; expiry?: AirwallexExpiryDateElementType; } type ElementType = | AirwallexCartNumberElementType | AirwallexCvcElementType | AirwallexExpiryDateElementType; let initPromise: Promise | null = null; export function airwallexInit() { if (!initPromise) { initPromise = init({ env: process.env.NEXT_PUBLIC_APP_ENV !== 'production' ? 'demo' : 'prod', enabledElements: ['payments'], }).catch((err) => { initPromise = null; throw err; }); } return initPromise; } class AirwallexManager { private elements: AirwallexCardElements = {}; private createPromise: Promise | null = null; async createElements() { if (this.elements.cardNumber) { return this.elements; } if (this.createPromise) { return this.createPromise; } this.createPromise = Promise.all([ createElement("cardNumber"), createElement("cvc"), createElement("expiry") ]).then(([cardNumber,cvc,expiry]) => { this.elements = { cardNumber, cvc, expiry }; return this.elements; }); return this.createPromise; } mount(containerIds: { cardNumber: string; cvc: string; expiry: string; }) { this.elements.cardNumber?.mount(containerIds.cardNumber); this.elements.cvc?.mount(containerIds.cvc); this.elements.expiry?.mount(containerIds.expiry); } unmount() { this.elements.cardNumber?.unmount(); this.elements.cvc?.unmount(); this.elements.expiry?.unmount(); } on(el: ElementType, event: EventCode, handler: Payment.SplitElementEventHandler) { el.on(event, handler); } destroy() { const { cardNumber, cvc, expiry } = this.elements; [cardNumber, cvc, expiry].forEach((el) => { if (!el) return; el.unmount(); el.destroy(); }); this.elements = {}; this.createPromise=null; } getElements() { return this.elements; } } export const airwallexManager = new AirwallexManager();