airwallexInit.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. import { init,InitResult,createElement, type Payment } from '@airwallex/components-sdk';
  2. // export {Payment};
  3. export type AirwallexCartNumberElementType = Payment.CardNumberElementType;
  4. export type AirwallexCvcElementType = Payment.CvcElementType;
  5. export type AirwallexExpiryDateElementType = Payment.ExpiryDateElementType;
  6. export interface AirwallexCardElements{
  7. cardNumber?: AirwallexCartNumberElementType;
  8. cvc?: AirwallexCvcElementType;
  9. expiry?: AirwallexExpiryDateElementType;
  10. }
  11. type ElementType =
  12. | AirwallexCartNumberElementType
  13. | AirwallexCvcElementType
  14. | AirwallexExpiryDateElementType;
  15. let initPromise: Promise<InitResult> | null = null;
  16. export function airwallexInit() {
  17. if (!initPromise) {
  18. initPromise = init({
  19. env:
  20. process.env.NEXT_PUBLIC_APP_ENV !== 'production'
  21. ? 'demo'
  22. : 'prod',
  23. enabledElements: ['payments'],
  24. }).catch((err) => {
  25. initPromise = null;
  26. throw err;
  27. });
  28. }
  29. return initPromise;
  30. }
  31. class AirwallexManager {
  32. private elements: AirwallexCardElements = {};
  33. private createPromise: Promise<AirwallexCardElements> | null = null;
  34. async createElements() {
  35. if (this.elements.cardNumber) {
  36. return this.elements;
  37. }
  38. if (this.createPromise) {
  39. return this.createPromise;
  40. }
  41. this.createPromise = Promise.all([
  42. createElement("cardNumber"),
  43. createElement("cvc"),
  44. createElement("expiry")
  45. ]).then(([cardNumber,cvc,expiry]) => {
  46. this.elements = {
  47. cardNumber,
  48. cvc,
  49. expiry
  50. };
  51. return this.elements;
  52. });
  53. return this.createPromise;
  54. }
  55. mount(containerIds: {
  56. cardNumber: string;
  57. cvc: string;
  58. expiry: string;
  59. }) {
  60. this.elements.cardNumber?.mount(containerIds.cardNumber);
  61. this.elements.cvc?.mount(containerIds.cvc);
  62. this.elements.expiry?.mount(containerIds.expiry);
  63. }
  64. unmount() {
  65. this.elements.cardNumber?.unmount();
  66. this.elements.cvc?.unmount();
  67. this.elements.expiry?.unmount();
  68. }
  69. on<EventCode extends Payment.SplitElementEventCode>(el: ElementType, event: EventCode, handler: Payment.SplitElementEventHandler<EventCode>) {
  70. el.on(event, handler);
  71. }
  72. destroy() {
  73. const { cardNumber, cvc, expiry } = this.elements;
  74. [cardNumber, cvc, expiry].forEach((el) => {
  75. if (!el) return;
  76. el.unmount();
  77. el.destroy();
  78. });
  79. this.elements = {};
  80. this.createPromise=null;
  81. }
  82. getElements() {
  83. return this.elements;
  84. }
  85. }
  86. export const airwallexManager = new AirwallexManager();