diff --git a/examples/dynamic-checkout/index.html b/examples/dynamic-checkout/index.html index e8c126bb..02208545 100644 --- a/examples/dynamic-checkout/index.html +++ b/examples/dynamic-checkout/index.html @@ -10,9 +10,10 @@ diff --git a/package.json b/package.json index 681d0e0b..ebf02f01 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "processout.js", - "version": "1.7.8", + "version": "1.7.9", "description": "ProcessOut.js is a JavaScript library for ProcessOut's payment processing API.", "scripts": { "build:processout": "tsc -p src/processout && uglifyjs --compress --keep-fnames --ie8 dist/processout.js -o dist/processout.js", diff --git a/src/dynamic-checkout/clients/apple-pay.ts b/src/dynamic-checkout/clients/apple-pay.ts index b22acfa5..a0f3a660 100644 --- a/src/dynamic-checkout/clients/apple-pay.ts +++ b/src/dynamic-checkout/clients/apple-pay.ts @@ -78,12 +78,25 @@ module ProcessOut { merchantApplePayCertificateId: applePayPaymentMethodData.merchant_id, applePaySessionVersion: 14, }, - DynamicCheckoutEventsUtils.dispatchApplePayNewSessionEvent, - DynamicCheckoutEventsUtils.dispatchApplePaySessionError, + () => + DynamicCheckoutEventsUtils.dispatchApplePayNewSessionEvent( + this.paymentConfig.invoiceId, + this.paymentConfig.invoiceDetails.return_url || null, + ), + (err) => + DynamicCheckoutEventsUtils.dispatchApplePaySessionError( + this.paymentConfig.invoiceId, + err, + this.paymentConfig.invoiceDetails.return_url || null, + ), ) session.onpaymentauthorizedPostprocess = - DynamicCheckoutEventsUtils.dispatchApplePayAuthorizedPostProcessEvent + () => + DynamicCheckoutEventsUtils.dispatchApplePayAuthorizedPostProcessEvent( + this.paymentConfig.invoiceId, + this.paymentConfig.invoiceDetails.return_url || null, + ) return session } @@ -97,8 +110,6 @@ module ProcessOut { card => { session.completePayment(0) - DynamicCheckoutEventsUtils.dispatchTokenizePaymentSuccessEvent(card) - // The casting is needed since Apple Pay returns card object instead of card token for some reason // You can check the implementation of tokenize function const cardToken = (card as unknown as Record).id @@ -112,6 +123,14 @@ module ProcessOut { new DynamicCheckoutPaymentErrorView(this.processOutInstance, this.paymentConfig) .element, ) + + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + { message: "Apple Pay tokenization failed" }, + "apple_pay", + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) }, ) } @@ -145,8 +164,9 @@ module ProcessOut { } DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent({ - invoiceId, - returnUrl: this.paymentConfig.invoiceDetails.return_url, + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + payment_method_name: "apple_pay", }) }, error => { @@ -165,7 +185,13 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + "apple_pay", + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) }, undefined, invoiceId => { @@ -175,8 +201,10 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent(invoiceId, { + DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent({ payment_method_name: "apple_pay", + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, }) }, ) diff --git a/src/dynamic-checkout/clients/google-pay.ts b/src/dynamic-checkout/clients/google-pay.ts index cfcc854a..ec43e814 100644 --- a/src/dynamic-checkout/clients/google-pay.ts +++ b/src/dynamic-checkout/clients/google-pay.ts @@ -103,7 +103,13 @@ module ProcessOut { buttonContainer.appendChild(button) } }) - .catch(DynamicCheckoutEventsUtils.dispatchGooglePayLoadError) + .catch(error => + DynamicCheckoutEventsUtils.dispatchGooglePayLoadError( + error, + this.paymentConfig.invoiceId, + this.paymentConfig.invoiceDetails.return_url || null, + ), + ) } private makePayment(invoiceData: Invoice, getViewContainer: () => HTMLElement) { @@ -119,8 +125,6 @@ module ProcessOut { paymentToken, {}, token => { - DynamicCheckoutEventsUtils.dispatchTokenizePaymentSuccessEvent(token) - this.processOutInstance.makeCardPayment( invoiceData.id, token, @@ -149,8 +153,9 @@ module ProcessOut { } DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent({ - invoiceId, - returnUrl: this.paymentConfig.invoiceDetails.return_url, + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + payment_method_name: "google_pay", }) }, error => { @@ -173,7 +178,13 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + "google_pay", + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) }, undefined, invoiceId => { @@ -183,8 +194,10 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent(invoiceId, { + DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent({ payment_method_name: "google_pay", + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, }) }, ) @@ -195,13 +208,25 @@ module ProcessOut { .element, ) - DynamicCheckoutEventsUtils.dispatchTokenizePaymentErrorEvent({ - message: `Tokenize payment error: ${JSON.stringify(error, undefined, 2)}`, - }) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + { + message: `Tokenize payment error: ${JSON.stringify(error, undefined, 2)}`, + }, + "google_pay", + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) }, ) }) - .catch(DynamicCheckoutEventsUtils.dispatchGooglePayLoadError) + .catch(error => + DynamicCheckoutEventsUtils.dispatchGooglePayLoadError( + error, + this.paymentConfig.invoiceId, + this.paymentConfig.invoiceDetails.return_url || null, + ), + ) } private prepareIsReadyToPayRequest(invoiceData: Invoice) { diff --git a/src/dynamic-checkout/dynamic-checkout.ts b/src/dynamic-checkout/dynamic-checkout.ts index 4a212c26..5c586513 100644 --- a/src/dynamic-checkout/dynamic-checkout.ts +++ b/src/dynamic-checkout/dynamic-checkout.ts @@ -50,7 +50,7 @@ module ProcessOut { this.loadView(paymentMethodsView.element) - DynamicCheckoutEventsUtils.dispatchWidgetReadyEvent() + DynamicCheckoutEventsUtils.dispatchWidgetReadyEvent(this.paymentConfig.invoiceId, null) } private getInvoiceDetails(onFetch: Function, onSuccess: Function, onError: Function) { @@ -73,7 +73,7 @@ module ProcessOut { private onGetInvoiceLoading() { this.loadView(new DynamicCheckoutInvoiceLoadingView(this.paymentConfig.locale).element) - DynamicCheckoutEventsUtils.dispatchWidgetLoadingEvent() + DynamicCheckoutEventsUtils.dispatchWidgetLoadingEvent(this.paymentConfig.invoiceId, null) } private onGetInvoiceSuccess(data: any) { @@ -82,7 +82,11 @@ module ProcessOut { new DynamicCheckoutPaymentErrorView(this.processOutInstance, this.paymentConfig).element, ) - return DynamicCheckoutEventsUtils.dispatchInvoiceFetchingErrorEvent(data) + return DynamicCheckoutEventsUtils.dispatchInvoiceFetchingErrorEvent( + this.paymentConfig.invoiceId, + data, + data.invoice ? data.invoice.return_url || null : null, + ) } if (!data.invoice.payment_methods) { @@ -94,9 +98,12 @@ module ProcessOut { ).element, ) - return DynamicCheckoutEventsUtils.dispatchNoDynamicCheckoutConfigurationEvent({ - invoiceId: data.invoice.id, - }) + return DynamicCheckoutEventsUtils.dispatchNoDynamicCheckoutConfigurationEvent( + { + invoice_id: data.invoice.id, + }, + data.invoice.return_url || null, + ) } if (data.invoice.transaction.status !== "waiting") { @@ -108,10 +115,17 @@ module ProcessOut { ).element, ) - return DynamicCheckoutEventsUtils.dispatchTransactionErrorEvent({ - invoiceId: data.invoice.id, - returnUrl: data.invoice.return_url, - }) + return DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + data.invoice.id, + { + error_type: "transaction.invalid-status", + message: "Transaction is not in a waiting state", + transaction_status: data.invoice.transaction.status, + }, + undefined, + undefined, + data.invoice.return_url || null, + ) } this.paymentConfig.setInvoiceDetails(data.invoice) @@ -129,7 +143,11 @@ module ProcessOut { message: Translator.translateError(errorCode), } - DynamicCheckoutEventsUtils.dispatchInvoiceFetchingErrorEvent(errorData) + DynamicCheckoutEventsUtils.dispatchInvoiceFetchingErrorEvent( + this.paymentConfig.invoiceId, + errorData, + null, + ) this.loadView( new DynamicCheckoutPaymentErrorView(this.processOutInstance, this.paymentConfig).element, diff --git a/src/dynamic-checkout/payment-methods/apm.ts b/src/dynamic-checkout/payment-methods/apm.ts index 552d79b6..7cebb351 100644 --- a/src/dynamic-checkout/payment-methods/apm.ts +++ b/src/dynamic-checkout/payment-methods/apm.ts @@ -89,12 +89,16 @@ module ProcessOut { DynamicCheckoutEventsUtils.dispatchPaymentSubmittedEvent({ payment_method_name: apm.gateway_name, + invoice_id: this.paymentConfig.invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, }) this.processOutInstance.handleAction( apm.redirect_url, paymentToken => { - this.resetContainerHtml().appendChild(new DynamicCheckoutInvoiceLoadingView(this.paymentConfig.locale).element) + this.resetContainerHtml().appendChild( + new DynamicCheckoutInvoiceLoadingView(this.paymentConfig.locale).element, + ) this.processOutInstance.makeCardPayment( this.paymentConfig.invoiceId, @@ -116,7 +120,12 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent(invoiceId) + DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent({ + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + payment_method_name: apm.gateway_name, + customer_token_id: paymentToken, + }) }, error => { this.resetContainerHtml().appendChild( @@ -124,16 +133,25 @@ module ProcessOut { .element, ) - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + apm.gateway_name, + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) }, requestOptions, invoiceId => { this.resetContainerHtml().appendChild( - new DynamicCheckoutPaymentPendingView(this.processOutInstance, this.paymentConfig).element, + new DynamicCheckoutPaymentPendingView(this.processOutInstance, this.paymentConfig) + .element, ) - DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent(invoiceId, { + DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent({ payment_method_name: apm.gateway_name, + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, }) }, ) @@ -147,6 +165,8 @@ module ProcessOut { DynamicCheckoutEventsUtils.dispatchPaymentCancelledEvent({ payment_method_name: apm.gateway_name, + invoice_id: this.paymentConfig.invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, }) } else { this.resetContainerHtml().appendChild( @@ -154,7 +174,13 @@ module ProcessOut { .element, ) - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + apm.gateway_name, + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) } }, actionHandlerOptions, @@ -174,6 +200,12 @@ module ProcessOut { source: apm.gateway_configuration_id, } + DynamicCheckoutEventsUtils.dispatchPaymentSubmittedEvent({ + payment_method_name: apm.gateway_name, + invoice_id: this.paymentConfig.invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + }) + this.processOutInstance.apiRequest( "POST", `invoices/${this.paymentConfig.invoiceId}/capture`, @@ -187,17 +219,28 @@ module ProcessOut { .element, ) - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(data) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + data, + apm.gateway_name, + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + data.customer_token_id, + ) return } if (outcome === OUTCOME.Pending && !data.customer_action) { this.resetContainerHtml().appendChild( - new DynamicCheckoutPaymentPendingView(this.processOutInstance, this.paymentConfig).element, + new DynamicCheckoutPaymentPendingView(this.processOutInstance, this.paymentConfig) + .element, ) - DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent(this.paymentConfig.invoiceId, { + DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent({ payment_method_name: apm.gateway_name, + invoice_id: this.paymentConfig.invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + customer_token_id: data.customer_token_id, }) return @@ -206,7 +249,9 @@ module ProcessOut { this.processOutInstance.handleAction( data.customer_action.value, paymentToken => { - this.resetContainerHtml().appendChild(new DynamicCheckoutInvoiceLoadingView(this.paymentConfig.locale).element) + this.resetContainerHtml().appendChild( + new DynamicCheckoutInvoiceLoadingView(this.paymentConfig.locale).element, + ) this.processOutInstance.makeCardPayment( this.paymentConfig.invoiceId, @@ -232,7 +277,12 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent(invoiceId) + DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent({ + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + payment_method_name: apm.gateway_name, + customer_token_id: data.customer_token_id, + }) }, error => { if (this.paymentConfig.showStatusMessage) { @@ -254,16 +304,29 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + apm.gateway_name, + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + data.customer_token_id, + ) }, requestOptions, invoiceId => { this.resetContainerHtml().appendChild( - new DynamicCheckoutPaymentPendingView(this.processOutInstance, this.paymentConfig).element, + new DynamicCheckoutPaymentPendingView( + this.processOutInstance, + this.paymentConfig, + ).element, ) - DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent(invoiceId, { + DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent({ payment_method_name: apm.gateway_name, + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + customer_token_id: data.customer_token_id, }) }, ) @@ -284,7 +347,14 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + apm.gateway_name, + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + data.customer_token_id, + ) }, actionHandlerOptions, this.paymentConfig.invoiceId, @@ -306,7 +376,13 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + apm.gateway_name, + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) }, 0, requestOptions, @@ -371,8 +447,9 @@ module ProcessOut { { tagName: "button", classNames: ["dco-payment-method-button-pay-button"], - textContent: this.paymentConfig.payButtonText - || `${Translations.getText( + textContent: + this.paymentConfig.payButtonText || + `${Translations.getText( "continue-with-apm-button", this.paymentConfig.locale, )} ${this.paymentMethod.display.name}`, diff --git a/src/dynamic-checkout/payment-methods/card.ts b/src/dynamic-checkout/payment-methods/card.ts index be310639..a51c17f2 100644 --- a/src/dynamic-checkout/payment-methods/card.ts +++ b/src/dynamic-checkout/payment-methods/card.ts @@ -8,6 +8,7 @@ module ProcessOut { private theme: DynamicCheckoutThemeType private resetContainerHtml: () => HTMLElement private isCardRestricted: boolean = false + private tokenizedCardId?: string constructor( procesoutInstance: ProcessOut, @@ -90,9 +91,12 @@ module ProcessOut { } this.setButtonLoading() + this.tokenizedCardId = undefined DynamicCheckoutEventsUtils.dispatchPaymentSubmittedEvent({ payment_method_name: "card", + invoice_id: this.paymentConfig.invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, }) this.procesoutInstance.tokenize( @@ -104,11 +108,20 @@ module ProcessOut { }, this.handleValidationError.bind(this)) }) }, - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent, + err => + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + err, + "card", + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ), ) } private handleTokenizeSuccess(cardToken: string) { + this.tokenizedCardId = cardToken + const cardPaymentOptions = { authorize_only: !this.paymentConfig.capturePayments, allow_fallback_to_sale: this.paymentConfig.allowFallbackToSale, @@ -140,10 +153,23 @@ module ProcessOut { new DynamicCheckoutPaymentErrorView(this.procesoutInstance, this.paymentConfig).element, ) - DynamicCheckoutEventsUtils.dispatchTokenizePaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + "card", + this.tokenizedCardId, + this.paymentConfig.invoiceDetails.return_url || null, + ) } private handleCardPaymentSuccess(invoiceId: string) { + DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent({ + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + payment_method_name: "card", + ...(this.tokenizedCardId && { card_id: this.tokenizedCardId }), + }) + if (this.paymentConfig.showStatusMessage) { this.resetContainerHtml().appendChild( new DynamicCheckoutPaymentSuccessView(this.procesoutInstance, this.paymentConfig).element, @@ -156,11 +182,6 @@ module ProcessOut { new DynamicCheckoutPaymentInfoView(this.processOutInstance, this.paymentConfig).element, ) } - - DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent({ - invoiceId, - returnUrl: this.paymentConfig.invoiceDetails.return_url, - }) } private handleCardPaymentPending(invoiceId: string) { @@ -170,8 +191,11 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent(invoiceId, { + DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent({ payment_method_name: "card", + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + ...(this.tokenizedCardId && { card_id: this.tokenizedCardId }), }) } @@ -189,7 +213,13 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + "card", + this.tokenizedCardId, + this.paymentConfig.invoiceDetails.return_url || null, + ) } private getCardFormOptions() { diff --git a/src/dynamic-checkout/payment-methods/native-apm.ts b/src/dynamic-checkout/payment-methods/native-apm.ts index 438a6958..efb05a11 100644 --- a/src/dynamic-checkout/payment-methods/native-apm.ts +++ b/src/dynamic-checkout/payment-methods/native-apm.ts @@ -2,19 +2,25 @@ module ProcessOut { export class NativeApmPaymentMethod extends PaymentMethodButton { + private static activePaymentMethod: NativeApmPaymentMethod | null = null + private nativeApmInstance: NativeApm private paymentConfig: DynamicCheckoutPaymentConfig private isMounted: boolean + private paymentMethodName: string private theme: DynamicCheckoutThemeType private resetContainerHtml: () => HTMLElement protected processOutInstance: ProcessOut + private onPaymentSubmit?: () => void + constructor( processOutInstance: ProcessOut, paymentMethod: PaymentMethod, paymentConfig: DynamicCheckoutPaymentConfig, theme: DynamicCheckoutThemeType, resetContainerHtml: () => HTMLElement, + onPaymentSubmit?: () => void, ) { const { display, apm } = paymentMethod const { invoiceId, invoiceDetails } = paymentConfig @@ -22,9 +28,11 @@ module ProcessOut { super(processOutInstance, display.name, display.logo.dark_url.vector, display.name) this.paymentConfig = paymentConfig + this.paymentMethodName = apm.gateway_name this.processOutInstance = processOutInstance this.resetContainerHtml = resetContainerHtml this.theme = theme + this.onPaymentSubmit = onPaymentSubmit const wrapper = this.getNativeApmWrapper() super.appendChildren(wrapper) @@ -58,13 +66,29 @@ module ProcessOut { private setupEventListeners(wrapper: HTMLElement) { this.element.addEventListener("click", () => { + NativeApmPaymentMethod.activePaymentMethod = this + if (!this.isMounted) { this.nativeApmInstance.mount(wrapper) this.isMounted = true } }) + window.addEventListener(NATIVE_APM_EVENTS.PAYMENT_INIT, () => { + if (!this.isActivePaymentMethod()) { + return + } + + if (this.onPaymentSubmit) { + this.onPaymentSubmit() + } + }) + window.addEventListener(NATIVE_APM_EVENTS.PAYMENT_SUCCESS, () => { + if (!this.isActivePaymentMethod()) { + return + } + if (this.paymentConfig.showStatusMessage) { this.resetContainerHtml().appendChild( new DynamicCheckoutPaymentSuccessView(this.processOutInstance, this.paymentConfig) @@ -80,12 +104,19 @@ module ProcessOut { } DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent({ - invoiceId: this.paymentConfig.invoiceId, - returnUrl: this.paymentConfig.invoiceDetails.return_url, + invoice_id: this.paymentConfig.invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + payment_method_name: this.paymentMethodName, }) + + NativeApmPaymentMethod.activePaymentMethod = null }) window.addEventListener(NATIVE_APM_EVENTS.PAYMENT_ERROR, e => { + if (!this.isActivePaymentMethod()) { + return + } + if (this.paymentConfig.showStatusMessage) { this.resetContainerHtml().appendChild( new DynamicCheckoutPaymentErrorView(this.processOutInstance, this.paymentConfig) @@ -100,10 +131,22 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(e) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + e, + this.paymentMethodName, + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) + + NativeApmPaymentMethod.activePaymentMethod = null }) } + private isActivePaymentMethod() { + return NativeApmPaymentMethod.activePaymentMethod === this + } + private getNativeApmWrapper() { const wrapper = HTMLElements.createElement({ tagName: "div", diff --git a/src/dynamic-checkout/payment-methods/saved-apm.ts b/src/dynamic-checkout/payment-methods/saved-apm.ts index 9d031a22..176cda2d 100644 --- a/src/dynamic-checkout/payment-methods/saved-apm.ts +++ b/src/dynamic-checkout/payment-methods/saved-apm.ts @@ -45,8 +45,9 @@ module ProcessOut { } private getChildrenElement(deleteMode?: boolean) { - const payButtonText = this.paymentConfig.payButtonText - || `${Translations.getText( + const payButtonText = + this.paymentConfig.payButtonText || + `${Translations.getText( "pay-button-text", this.paymentConfig.locale, )} ${this.paymentConfig.invoiceDetails.amount} ${this.paymentConfig.invoiceDetails.currency}` @@ -106,6 +107,9 @@ module ProcessOut { if (apm_customer_token.redirect_url) { DynamicCheckoutEventsUtils.dispatchPaymentSubmittedEvent({ payment_method_name: apm.gateway_name, + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + customer_token_id: apm_customer_token.customer_token_id, }) return this.processOutInstance.handleAction( @@ -133,7 +137,12 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent(invoiceId) + DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent({ + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + customer_token_id: apm_customer_token.customer_token_id, + payment_method_name: apm.gateway_name, + }) }, error => { if (this.paymentConfig.showStatusMessage) { @@ -151,18 +160,30 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + apm.gateway_name, + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) }, requestOptions, invoiceId => { if (this.paymentConfig.showStatusMessage) { this.resetContainerHtml().appendChild( - new DynamicCheckoutPaymentPendingView(this.processOutInstance, this.paymentConfig).element, + new DynamicCheckoutPaymentPendingView( + this.processOutInstance, + this.paymentConfig, + ).element, ) } - DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent(invoiceId, { + DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent({ payment_method_name: apm.gateway_name, + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + customer_token_id: apm_customer_token.customer_token_id, }) }, ) @@ -173,13 +194,28 @@ module ProcessOut { .element, ) - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + apm.gateway_name, + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) }, actionHandlerOptions, this.paymentConfig.invoiceId, ) } + console.log(apm) + + DynamicCheckoutEventsUtils.dispatchPaymentSubmittedEvent({ + payment_method_name: this.paymentMethod.apm ? this.paymentMethod.apm.gateway_name : "apm", + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + customer_token_id: apm_customer_token.customer_token_id, + }) + this.processOutInstance.makeCardPayment( this.paymentConfig.invoiceId, this.paymentMethod.apm_customer_token.customer_token_id, @@ -197,22 +233,26 @@ module ProcessOut { ) DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent({ - invoiceId, - returnUrl: this.paymentConfig.invoiceDetails.return_url, + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + customer_token_id: this.paymentMethod.apm_customer_token.customer_token_id, + payment_method_name: this.paymentMethod.apm ? this.paymentMethod.apm.gateway_name : "apm", }) } private handlePaymentPending(invoiceId: string) { if (this.paymentConfig.showStatusMessage) { this.resetContainerHtml().appendChild( - new DynamicCheckoutPaymentPendingView(this.processOutInstance, this.paymentConfig).element, + new DynamicCheckoutPaymentPendingView(this.processOutInstance, this.paymentConfig) + .element, ) } - DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent(invoiceId, { - payment_method_name: this.paymentMethod.apm - ? this.paymentMethod.apm.gateway_name - : "apm", + DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent({ + payment_method_name: this.paymentMethod.apm ? this.paymentMethod.apm.gateway_name : "apm", + invoice_id: this.paymentConfig.invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + customer_token_id: this.paymentMethod.apm_customer_token.customer_token_id, }) } @@ -221,7 +261,13 @@ module ProcessOut { new DynamicCheckoutPaymentErrorView(this.processOutInstance, this.paymentConfig).element, ) - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + this.paymentMethod.apm ? this.paymentMethod.apm.gateway_name : "apm", + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) } private setButtonLoading() { diff --git a/src/dynamic-checkout/payment-methods/saved-card.ts b/src/dynamic-checkout/payment-methods/saved-card.ts index d37c81b7..bfac5498 100644 --- a/src/dynamic-checkout/payment-methods/saved-card.ts +++ b/src/dynamic-checkout/payment-methods/saved-card.ts @@ -46,8 +46,9 @@ module ProcessOut { } private getChildrenElement(deleteMode?: boolean) { - const payButtonText = this.paymentConfig.payButtonText - || `${Translations.getText( + const payButtonText = + this.paymentConfig.payButtonText || + `${Translations.getText( "pay-button-text", this.paymentConfig.locale, )} ${this.paymentConfig.invoiceDetails.amount} ${this.paymentConfig.invoiceDetails.currency}` @@ -89,6 +90,9 @@ module ProcessOut { DynamicCheckoutEventsUtils.dispatchPaymentSubmittedEvent({ payment_method_name: "card", + invoice_id: this.paymentConfig.invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + customer_token_id: this.paymentMethod.card_customer_token.customer_token_id, }) this.processOutInstance.makeCardPayment( @@ -121,20 +125,26 @@ module ProcessOut { } DynamicCheckoutEventsUtils.dispatchPaymentSuccessEvent({ - invoiceId, - returnUrl: this.paymentConfig.invoiceDetails.return_url, + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + customer_token_id: this.paymentMethod.card_customer_token.customer_token_id, + payment_method_name: "card", }) } private handlePaymentPending(invoiceId: string) { if (this.paymentConfig.showStatusMessage) { this.resetContainerHtml().appendChild( - new DynamicCheckoutPaymentPendingView(this.processOutInstance, this.paymentConfig).element, + new DynamicCheckoutPaymentPendingView(this.processOutInstance, this.paymentConfig) + .element, ) } - DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent(invoiceId, { + DynamicCheckoutEventsUtils.dispatchPaymentPendingEvent({ payment_method_name: "card", + invoice_id: invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + customer_token_id: this.paymentMethod.card_customer_token.customer_token_id, }) } @@ -152,7 +162,13 @@ module ProcessOut { ) } - DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent(error) + DynamicCheckoutEventsUtils.dispatchPaymentErrorEvent( + this.paymentConfig.invoiceId, + error, + "card", + undefined, + this.paymentConfig.invoiceDetails.return_url || null, + ) } private setButtonLoading() { diff --git a/src/dynamic-checkout/utils/events.ts b/src/dynamic-checkout/utils/events.ts index 6d85697d..7b657525 100644 --- a/src/dynamic-checkout/utils/events.ts +++ b/src/dynamic-checkout/utils/events.ts @@ -5,14 +5,11 @@ module ProcessOut { WIDGET_LOADING: "processout_dynamic_checkout_loading", WIDGET_READY: "processout_dynamic_checkout_ready", INVOICE_FETCHING_ERROR: "processout_dynamic_checkout_invoice_fetching_error", - TOKENIZE_PAYMENT_SUCCESS: "processout_dynamic_checkout_tokenize_payment_success", - TOKENIZE_PAYMENT_ERROR: "processout_dynamic_checkout_tokenize_payment_error", NO_DYNAMIC_CHECKOUT_CONFIGURATION: "processout_dynamic_checkout_no_dynamic_checkout_configuration", PAYMENT_ERROR: "processout_dynamic_checkout_payment_error", PAYMENT_SUCCESS: "processout_dynamic_checkout_payment_success", PAYMENT_CANCELLED: "processout_dynamic_checkout_payment_cancelled", - TRANSACTION_ERROR: "processout_dynamic_checkout_transaction_error", GOOGLE_PAY_LOAD_ERROR: "processout_dynamic_checkout_google_pay_load_error", APPLE_PAY_NEW_SESSION: "processout_dynamic_checkout_apple_pay_new_session", APPLE_PAY_SESSION_ERROR: "processout_dynamic_checkout_apple_pay_session_error", @@ -24,139 +21,260 @@ module ProcessOut { PAYMENT_PENDING: "processout_dynamic_checkout_payment_pending", } - export class DynamicCheckoutEventsUtils { - static dispatchInvoiceFetchingErrorEvent(errorData: any) { - const event = EventsUtils.createEvent( - DYNAMIC_CHECKOUT_EVENTS.INVOICE_FETCHING_ERROR, - errorData, - ) + interface DynamicCheckoutEventDetail { + payment_method_name: string | null + return_url: string | null + card_id?: string + } - return window.dispatchEvent(event) - } + interface DynamicCheckoutPaymentErrorEventDetail extends DynamicCheckoutEventDetail { + error_type: string | null + error_message: string | null + invoice_id: string + transaction_status?: string + customer_token_id?: string + } - static dispatchWidgetLoadingEvent() { - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.WIDGET_LOADING) - return window.dispatchEvent(event) - } + interface DynamicCheckoutPaymentSuccessEventDetail extends DynamicCheckoutEventDetail { + invoice_id: string + customer_token_id?: string + } + + export class DynamicCheckoutEventsUtils { + static dispatchInvoiceFetchingErrorEvent( + invoiceId: string, + errorData: any, + returnUrl: string | null, + ) { + const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.INVOICE_FETCHING_ERROR, { + ...errorData, + invoice_id: invoiceId, + payment_method_name: null, + return_url: returnUrl, + }) - static dispatchWidgetReadyEvent() { - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.WIDGET_READY) return window.dispatchEvent(event) } - static dispatchTokenizePaymentSuccessEvent(token: string) { - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.TOKENIZE_PAYMENT_SUCCESS, { - token, + static dispatchWidgetLoadingEvent(invoiceId: string, returnUrl: string | null) { + const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.WIDGET_LOADING, { + invoice_id: invoiceId, + payment_method_name: null, + return_url: returnUrl, }) return window.dispatchEvent(event) } - static dispatchTokenizePaymentErrorEvent(errorData: any) { - const event = EventsUtils.createEvent( - DYNAMIC_CHECKOUT_EVENTS.TOKENIZE_PAYMENT_ERROR, - errorData, - ) + static dispatchWidgetReadyEvent(invoiceId: string, returnUrl: string | null) { + const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.WIDGET_READY, { + invoice_id: invoiceId, + return_url: returnUrl, + }) return window.dispatchEvent(event) } - static dispatchNoDynamicCheckoutConfigurationEvent(errorData: any) { + static dispatchNoDynamicCheckoutConfigurationEvent(errorData: any, returnUrl: string | null) { const event = EventsUtils.createEvent( DYNAMIC_CHECKOUT_EVENTS.NO_DYNAMIC_CHECKOUT_CONFIGURATION, - errorData, + { + ...errorData, + payment_method_name: null, + return_url: returnUrl, + }, ) return window.dispatchEvent(event) } - static dispatchPaymentErrorEvent(errorData: any) { + static dispatchPaymentErrorEvent( + invoiceId: string, + errorData: any, + paymentMethodName?: string, + cardId?: string, + returnUrl?: string | null, + customerTokenId?: string, + ) { + const normalizedError = + DynamicCheckoutEventsUtils.normalizePaymentError( + invoiceId, + errorData, + paymentMethodName || null, + cardId, + returnUrl || null, + customerTokenId, + ) + // TODO: Temporary fix until we fix properly the field unavailable error - if (errorData.code === "processout-js.field.unavailable") { + if (normalizedError.error_type === "processout-js.field.unavailable") { return } - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.PAYMENT_ERROR, errorData) + const event = EventsUtils.createEvent( + DYNAMIC_CHECKOUT_EVENTS.PAYMENT_ERROR, + normalizedError, + ) return window.dispatchEvent(event) } - static dispatchPaymentSuccessEvent(response: { invoiceId: string; returnUrl: string }) { - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.PAYMENT_SUCCESS, response) + static dispatchPaymentSuccessEvent(response: DynamicCheckoutPaymentSuccessEventDetail) { + const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.PAYMENT_SUCCESS, { + ...response, + payment_method_name: response.payment_method_name || null, + return_url: response.return_url || null, + }) return window.dispatchEvent(event) } - static dispatchApplePayNewSessionEvent() { - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.APPLE_PAY_NEW_SESSION) + static dispatchApplePayNewSessionEvent(invoiceId: string, returnUrl: string | null) { + const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.APPLE_PAY_NEW_SESSION, { + invoice_id: invoiceId, + payment_method_name: "apple_pay", + return_url: returnUrl, + }) return window.dispatchEvent(event) } - static dispatchApplePayAuthorizedPostProcessEvent() { + static dispatchApplePayAuthorizedPostProcessEvent(invoiceId: string, returnUrl: string | null) { const event = EventsUtils.createEvent( DYNAMIC_CHECKOUT_EVENTS.APPLE_PAY_AUTHORIZED_POST_PROCESS, + { + invoice_id: invoiceId, + payment_method_name: "apple_pay", + return_url: returnUrl, + }, ) return window.dispatchEvent(event) } - static dispatchApplePaySessionError(err: any) { - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.APPLE_PAY_SESSION_ERROR) - - return window.dispatchEvent(event) - } - - static dispatchDeletePaymentMethodEvent() { - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.DELETE_PAYMENT_METHOD) + static dispatchApplePaySessionError(invoiceId: string, err: any, returnUrl: string | null) { + const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.APPLE_PAY_SESSION_ERROR, { + ...err, + invoice_id: invoiceId, + payment_method_name: "apple_pay", + return_url: returnUrl, + }) return window.dispatchEvent(event) } - static dispatchDeletePaymentMethodErrorEvent(err: any) { - const event = EventsUtils.createEvent( - DYNAMIC_CHECKOUT_EVENTS.DELETE_PAYMENT_METHOD_ERROR, - err, - ) + static dispatchDeletePaymentMethodEvent( + invoiceId: string, + paymentMethodName: string | null, + returnUrl: string | null, + ) { + const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.DELETE_PAYMENT_METHOD, { + invoice_id: invoiceId, + payment_method_name: paymentMethodName, + return_url: returnUrl, + }) return window.dispatchEvent(event) } - static dispatchTransactionErrorEvent(errorData: { invoiceId: string; returnUrl: string }) { - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.TRANSACTION_ERROR, errorData) + static dispatchDeletePaymentMethodErrorEvent( + invoiceId: string, + err: any, + paymentMethodName: string | null, + returnUrl: string | null, + ) { + const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.DELETE_PAYMENT_METHOD_ERROR, { + ...err, + invoice_id: invoiceId, + payment_method_name: paymentMethodName, + return_url: returnUrl, + }) return window.dispatchEvent(event) } - static dispatchGooglePayLoadError(errorData: { invoiceId: string; returnUrl: string }) { + static dispatchGooglePayLoadError(errorData: any, invoiceId: string, returnUrl: string | null) { const event = EventsUtils.createEvent( DYNAMIC_CHECKOUT_EVENTS.GOOGLE_PAY_LOAD_ERROR, - errorData, + { + ...DynamicCheckoutEventsUtils.getEventDetail(errorData), + invoice_id: invoiceId, + return_url: returnUrl, + payment_method_name: "google_pay", + }, ) return window.dispatchEvent(event) } - static dispatchPaymentSubmittedEvent(details: { payment_method_name: string }) { - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.PAYMENT_SUBMITTED, { - details, - }) + static dispatchPaymentSubmittedEvent(details: { + payment_method_name: string + invoice_id: string + return_url: string | null + customer_token_id?: string + }) { + const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.PAYMENT_SUBMITTED, details) return window.dispatchEvent(event) } - static dispatchPaymentCancelledEvent(details: { payment_method_name: string }) { - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.PAYMENT_CANCELLED, { - details, - }) + + static dispatchPaymentCancelledEvent(details: { + payment_method_name: string + invoice_id: string + return_url: string | null + }) { + const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.PAYMENT_CANCELLED, details) return window.dispatchEvent(event) } - static dispatchPaymentPendingEvent(token: string, details: { payment_method_name: string }) { - const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.PAYMENT_PENDING, { - token, - details, - }) + static dispatchPaymentPendingEvent(details: { + payment_method_name: string + invoice_id: string + return_url: string | null + customer_token_id?: string + }) { + const event = EventsUtils.createEvent(DYNAMIC_CHECKOUT_EVENTS.PAYMENT_PENDING, details) return window.dispatchEvent(event) } + private static getEventDetail(data: any) { + if (typeof data === "object" && data !== null && "detail" in data) { + return data.detail + } + + return data + } + + private static normalizePaymentError( + invoiceId: string, + errorData: any, + paymentMethodName: string | null, + cardId?: string, + returnUrl?: string | null, + customerTokenId?: string, + ): DynamicCheckoutPaymentErrorEventDetail { + const normalizedError = DynamicCheckoutEventsUtils.getEventDetail(errorData) + const isObject = typeof normalizedError === "object" && normalizedError !== null + + return { + invoice_id: invoiceId, + payment_method_name: paymentMethodName, + return_url: returnUrl || null, + ...(cardId && { card_id: cardId }), + ...(customerTokenId && { customer_token_id: customerTokenId }), + error_type: isObject + ? normalizedError.error_type || normalizedError.code || null + : null, + error_message: isObject + ? normalizedError.error_message || normalizedError.message || null + : normalizedError == null + ? null + : String(normalizedError), + ...(isObject && + normalizedError.transaction_status && { + transaction_status: normalizedError.transaction_status, + }), + } + } + // IE 11 polyfill static createEvent(eventName: string, data?: any) { if (typeof window.CustomEvent === "function") { diff --git a/src/dynamic-checkout/views/payment-methods.ts b/src/dynamic-checkout/views/payment-methods.ts index db423504..9cdbfd82 100644 --- a/src/dynamic-checkout/views/payment-methods.ts +++ b/src/dynamic-checkout/views/payment-methods.ts @@ -310,6 +310,13 @@ module ProcessOut { this.paymentConfig, this.theme, this.resetContainerHtml.bind(this), + () => { + DynamicCheckoutEventsUtils.dispatchPaymentSubmittedEvent({ + payment_method_name: paymentMethod.apm.gateway_name, + invoice_id: this.paymentConfig.invoiceId, + return_url: this.paymentConfig.invoiceDetails.return_url || null, + }) + }, ) return regularPaymentMethods.push(apmPaymentMethod) @@ -379,15 +386,29 @@ module ProcessOut { {}, (data) => { if (resolveOutcome(data) === OUTCOME.Failed) { - DynamicCheckoutEventsUtils.dispatchDeletePaymentMethodErrorEvent(data) + DynamicCheckoutEventsUtils.dispatchDeletePaymentMethodErrorEvent( + this.paymentConfig.invoiceId, + data, + isCardToken ? "card" : paymentMethod.apm.gateway_name, + this.paymentConfig.invoiceDetails.return_url || null, + ) return } this.deletePaymentMethodFromDom(tokenId, isCardToken) - DynamicCheckoutEventsUtils.dispatchDeletePaymentMethodEvent() + DynamicCheckoutEventsUtils.dispatchDeletePaymentMethodEvent( + this.paymentConfig.invoiceId, + isCardToken ? "card" : paymentMethod.apm.gateway_name, + this.paymentConfig.invoiceDetails.return_url || null, + ) }, err => { - DynamicCheckoutEventsUtils.dispatchDeletePaymentMethodErrorEvent(err) + DynamicCheckoutEventsUtils.dispatchDeletePaymentMethodErrorEvent( + this.paymentConfig.invoiceId, + err, + isCardToken ? "card" : paymentMethod.apm.gateway_name, + this.paymentConfig.invoiceDetails.return_url || null, + ) }, 0, { diff --git a/src/nativeapm/elements/inputs/input.ts b/src/nativeapm/elements/inputs/input.ts index 5ceec1ea..df13ed95 100644 --- a/src/nativeapm/elements/inputs/input.ts +++ b/src/nativeapm/elements/inputs/input.ts @@ -68,7 +68,6 @@ module ProcessOut { * This function returns the input value */ public getInputValue() { - console.log(this.inputInstance.getValue()) return this.inputInstance.getValue() } diff --git a/src/processout/processout.ts b/src/processout/processout.ts index ecdebf62..8c8a1f2b 100644 --- a/src/processout/processout.ts +++ b/src/processout/processout.ts @@ -1569,7 +1569,7 @@ module ProcessOut { success: (data: any) => void, error: (err: Exception) => void, apiRequestOptions?: apiRequestOptions, - pending?: (data: any) => void, + pending?: (resourceId: string, reason: string | null) => void, ): void { this.handleCardActions( "POST", @@ -1720,7 +1720,7 @@ module ProcessOut { success: (data: any) => void, error: (err: Exception) => void, apiRequestOptions?: apiRequestOptions, - pending?: (data: any) => void, + pending?: (resourceId: string, reason: string | null) => void, ): void { // returns this.hppInitialURL only once during the first call from HPP, then returns the endpoint const getEndpoint = (): string => { @@ -1796,7 +1796,7 @@ module ProcessOut { // Otherwise, call the success callback with the resourceID // This is to ensure backward compatibility with old usage of PO.js if (pending) { - pending(resourceID) + pending(resourceID, data?.message || null) } else { success(resourceID) }