From 583db7c21768d6e9ae44c21ea5314af53e6b424c Mon Sep 17 00:00:00 2001 From: roman makarov Date: Thu, 27 Jul 2023 17:56:35 +0400 Subject: [PATCH] feat(PAYMENTS-15242): add form initialization --- src/core/event-name.enum.ts | 1 + src/core/form/field.interface.ts | 24 +++++++++++++++++++ src/core/form/form-configuration.interface.ts | 5 ++++ src/core/form/form.interface.ts | 5 ++++ .../guards/init-form-event-message.guard.ts | 14 +++++++++++ src/core/xps-boolean.enum.ts | 4 ++++ .../headless-checkout/headless-checkout.ts | 24 +++++++++++++++++++ .../init-form.handler.ts | 16 +++++++++++++ 8 files changed, 93 insertions(+) create mode 100644 src/core/form/field.interface.ts create mode 100644 src/core/form/form-configuration.interface.ts create mode 100644 src/core/form/form.interface.ts create mode 100644 src/core/guards/init-form-event-message.guard.ts create mode 100644 src/core/xps-boolean.enum.ts create mode 100644 src/features/headless-checkout/post-messages-handlers/init-form.handler.ts diff --git a/src/core/event-name.enum.ts b/src/core/event-name.enum.ts index e11322e..ea4937c 100644 --- a/src/core/event-name.enum.ts +++ b/src/core/event-name.enum.ts @@ -1,6 +1,7 @@ export const enum EventName { error = 'error', initPayment = 'initPayment', + initForm = 'initForm', getPaymentMethodsList = 'getPaymentMethodsList', getPaymentQuickMethods = 'getPaymentQuickMethods', getSavedMethods = 'getSavedMethods', diff --git a/src/core/form/field.interface.ts b/src/core/form/field.interface.ts new file mode 100644 index 0000000..51dae48 --- /dev/null +++ b/src/core/form/field.interface.ts @@ -0,0 +1,24 @@ +import { XpsBoolean } from '../xps-boolean.enum'; + +export interface Field { + name: string; + type: string; + value: string; + title: string; + example: string; + options?: unknown[]; + isMandatory: XpsBoolean; + isReadonly?: XpsBoolean; + isVisible: XpsBoolean; + tooltip?: string; + regex?: string; + validation_error_msg?: string; + label_hint?: string; + javascript: { + change: { + mutableFields: string[]; + staticParams: { [key: string]: string }; + params: string[]; + }; + }; +} diff --git a/src/core/form/form-configuration.interface.ts b/src/core/form/form-configuration.interface.ts new file mode 100644 index 0000000..145b02d --- /dev/null +++ b/src/core/form/form-configuration.interface.ts @@ -0,0 +1,5 @@ +export interface FormConfiguration { + paymentMethodId: number; + returnUrl: string; + country?: string; +} diff --git a/src/core/form/form.interface.ts b/src/core/form/form.interface.ts new file mode 100644 index 0000000..33569c6 --- /dev/null +++ b/src/core/form/form.interface.ts @@ -0,0 +1,5 @@ +import { Field } from './field.interface'; + +export interface Form { + fields: Field[]; +} diff --git a/src/core/guards/init-form-event-message.guard.ts b/src/core/guards/init-form-event-message.guard.ts new file mode 100644 index 0000000..6ab8ab7 --- /dev/null +++ b/src/core/guards/init-form-event-message.guard.ts @@ -0,0 +1,14 @@ +import { EventName } from '../../core/event-name.enum'; +import { Message } from '../../core/message.interface'; +import { Form } from '../form/form.interface'; +import { isEventMessage } from './event-message.guard'; + +export const isInitFormEventMessage = ( + messageData: unknown +): messageData is Message
=> { + if (isEventMessage(messageData)) { + return messageData.name === EventName.initForm; + } + + return false; +}; diff --git a/src/core/xps-boolean.enum.ts b/src/core/xps-boolean.enum.ts new file mode 100644 index 0000000..9eb861c --- /dev/null +++ b/src/core/xps-boolean.enum.ts @@ -0,0 +1,4 @@ +export const enum XpsBoolean { + true = '1', + false = '0', +} diff --git a/src/features/headless-checkout/headless-checkout.ts b/src/features/headless-checkout/headless-checkout.ts index baa15d2..ebd3765 100644 --- a/src/features/headless-checkout/headless-checkout.ts +++ b/src/features/headless-checkout/headless-checkout.ts @@ -16,6 +16,9 @@ import { UserBalance } from '../../core/user-balance.interface'; import { getUserBalanceHandler } from './post-messages-handlers/get-user-balance.handler'; import { HeadlessCheckoutSpy } from '../../core/headless-checkout-spy/headless-checkout-spy'; import { getRegularMethodsHandler } from './post-messages-handlers/get-regular-methods.handler'; +import { FormConfiguration } from '../../core/form/form-configuration.interface'; +import { initFormHandler } from './post-messages-handlers/init-form.handler'; +import { Form } from '../../core/form/form.interface'; @singleton() export class HeadlessCheckout { @@ -46,6 +49,27 @@ export class HeadlessCheckout { }, }; + public form = { + /** + * Initialize payment form + * @param configuration Form configuration + * @returns {Form} form details + */ + init: async (configuration: FormConfiguration): Promise => { + const msg: Message = { + name: EventName.initForm, + data: { + configuration, + }, + }; + + return this.postMessagesClient.send( + msg, + initFormHandler + ) as Promise; + }, + }; + private isWebView?: boolean; private coreIframe!: HTMLIFrameElement; private errorsSubscription?: () => void; diff --git a/src/features/headless-checkout/post-messages-handlers/init-form.handler.ts b/src/features/headless-checkout/post-messages-handlers/init-form.handler.ts new file mode 100644 index 0000000..119d90c --- /dev/null +++ b/src/features/headless-checkout/post-messages-handlers/init-form.handler.ts @@ -0,0 +1,16 @@ +import { Form } from '../../../core/form/form.interface'; +import { isInitFormEventMessage } from '../../../core/guards/init-form-event-message.guard'; +import { Message } from '../../../core/message.interface'; +import { Handler } from '../../../core/post-messages-client/handler.type'; + +export const initFormHandler: Handler = ( + message: Message +): { isHandled: boolean; value?: Form } | null => { + if (isInitFormEventMessage(message)) { + return { + isHandled: true, + value: message.data, + }; + } + return null; +};