From 1a950813ebdc1b0dea2d5969872ced265a9254e2 Mon Sep 17 00:00:00 2001 From: "andrii.vitvitskyi" Date: Mon, 11 Aug 2025 15:17:22 +0300 Subject: [PATCH 1/5] feat(payment): Added AppSwitch --- .../src/paypal-commerce-types.ts | 2 ++ .../paypal-commerce-button-strategy.spec.ts | 3 +++ .../paypal-commerce-button-strategy.ts | 14 +++++++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/packages/paypal-commerce-integration/src/paypal-commerce-types.ts b/packages/paypal-commerce-integration/src/paypal-commerce-types.ts index 71493cfa05..574d223cf4 100644 --- a/packages/paypal-commerce-integration/src/paypal-commerce-types.ts +++ b/packages/paypal-commerce-integration/src/paypal-commerce-types.ts @@ -360,6 +360,8 @@ export interface PayPalCommerceButtons { render(id: string): void; close(): void; isEligible(): boolean; + hasReturned?(): boolean; + resume?(): void; } export interface PayPalCommerceButtonsOptions { diff --git a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.spec.ts b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.spec.ts index ec77b953c1..1b18e4778f 100644 --- a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.spec.ts +++ b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.spec.ts @@ -371,6 +371,7 @@ describe('PayPalCommerceButtonStrategy', () => { await strategy.initialize(initializationOptions); expect(paypalSdk.Buttons).toHaveBeenCalledWith({ + appSwitchWhenAvailable: true, fundingSource: paypalSdk.FUNDING.PAYPAL, style: paypalCommerceOptions.style, createOrder: expect.any(Function), @@ -382,6 +383,7 @@ describe('PayPalCommerceButtonStrategy', () => { await strategy.initialize(buyNowInitializationOptions); expect(paypalSdk.Buttons).toHaveBeenCalledWith({ + appSwitchWhenAvailable: true, fundingSource: paypalSdk.FUNDING.PAYPAL, style: paypalCommerceOptions.style, createOrder: expect.any(Function), @@ -408,6 +410,7 @@ describe('PayPalCommerceButtonStrategy', () => { await strategy.initialize(initializationOptions); expect(paypalSdk.Buttons).toHaveBeenCalledWith({ + appSwitchWhenAvailable: true, fundingSource: paypalSdk.FUNDING.PAYPAL, style: paypalCommerceOptions.style, createOrder: expect.any(Function), diff --git a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts index d2aac469da..d38fda68e3 100644 --- a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts +++ b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts @@ -104,11 +104,14 @@ export default class PayPalCommerceButtonStrategy implements CheckoutButtonStrat const { isHostedCheckoutEnabled } = paymentMethod.initializationData || {}; const defaultCallbacks = { + appSwitchWhenAvailable: true, // Need an indicator to trigger App Switch createOrder: () => this.paypalCommerceIntegrationService.createOrder('paypalcommerce'), onApprove: ({ orderID }: ApproveCallbackPayload) => this.paypalCommerceIntegrationService.tokenizePayment(methodId, orderID), }; + console.log('DEFAULT', defaultCallbacks); + const buyNowFlowCallbacks = { onClick: () => this.handleClick(buyNowInitializeOptions), onCancel: () => this.paymentIntegrationService.loadDefaultCheckout(), @@ -134,7 +137,16 @@ export default class PayPalCommerceButtonStrategy implements CheckoutButtonStrat const paypalButton = paypalSdk.Buttons(buttonRenderOptions); if (paypalButton.isEligible()) { - paypalButton.render(`#${containerId}`); + // AppSwitch Flow + if (paypalButton?.hasReturned && paypalButton.hasReturned()) { + console.log('HAS RETURNED'); + if (paypalButton.resume) { + paypalButton?.resume(); + } + } else { + console.log('RENDER'); + paypalButton.render(`#${containerId}`); + } } else if (onEligibilityFailure && typeof onEligibilityFailure === 'function') { onEligibilityFailure(); } else { From 8f9a6cf35c6b225404e49d26a479442a5216cbe9 Mon Sep 17 00:00:00 2001 From: "andrii.vitvitskyi" Date: Wed, 13 Aug 2025 13:31:17 +0300 Subject: [PATCH 2/5] feat(payment): Added AppSwitch --- .../paypal-commerce-button-strategy.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts index d38fda68e3..5279cb5c56 100644 --- a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts +++ b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts @@ -137,16 +137,16 @@ export default class PayPalCommerceButtonStrategy implements CheckoutButtonStrat const paypalButton = paypalSdk.Buttons(buttonRenderOptions); if (paypalButton.isEligible()) { - // AppSwitch Flow - if (paypalButton?.hasReturned && paypalButton.hasReturned()) { - console.log('HAS RETURNED'); - if (paypalButton.resume) { - paypalButton?.resume(); - } - } else { - console.log('RENDER'); + // // AppSwitch Flow + // if (paypalButton?.hasReturned && paypalButton.hasReturned()) { + // console.log('HAS RETURNED'); + // if (paypalButton.resume) { + // paypalButton?.resume(); + // } + // } else { + // console.log('RENDER'); paypalButton.render(`#${containerId}`); - } + // } } else if (onEligibilityFailure && typeof onEligibilityFailure === 'function') { onEligibilityFailure(); } else { From db57731b211b70402b274e73490590e4015d1654 Mon Sep 17 00:00:00 2001 From: "andrii.vitvitskyi" Date: Wed, 13 Aug 2025 13:42:45 +0300 Subject: [PATCH 3/5] feat(payment): Added AppSwitch --- .../src/paypal-commerce/paypal-commerce-button-strategy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts index 5279cb5c56..926cb6e43b 100644 --- a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts +++ b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts @@ -145,7 +145,7 @@ export default class PayPalCommerceButtonStrategy implements CheckoutButtonStrat // } // } else { // console.log('RENDER'); - paypalButton.render(`#${containerId}`); + paypalButton.render(`#${containerId}`); // } } else if (onEligibilityFailure && typeof onEligibilityFailure === 'function') { onEligibilityFailure(); From 79810203d5088fd7474ff7b90e2cbdd041f55b13 Mon Sep 17 00:00:00 2001 From: "andrii.vitvitskyi" Date: Wed, 13 Aug 2025 14:16:09 +0300 Subject: [PATCH 4/5] feat(payment): Added AppSwitch --- .../src/paypal-commerce/paypal-commerce-button-strategy.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts index 926cb6e43b..fa0afa932f 100644 --- a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts +++ b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts @@ -104,7 +104,7 @@ export default class PayPalCommerceButtonStrategy implements CheckoutButtonStrat const { isHostedCheckoutEnabled } = paymentMethod.initializationData || {}; const defaultCallbacks = { - appSwitchWhenAvailable: true, // Need an indicator to trigger App Switch + // appSwitchWhenAvailable: true, // Need an indicator to trigger App Switch createOrder: () => this.paypalCommerceIntegrationService.createOrder('paypalcommerce'), onApprove: ({ orderID }: ApproveCallbackPayload) => this.paypalCommerceIntegrationService.tokenizePayment(methodId, orderID), From 79f8a327f3eb813203c7883490d594dfd6102714 Mon Sep 17 00:00:00 2001 From: "andrii.vitvitskyi" Date: Wed, 13 Aug 2025 14:21:19 +0300 Subject: [PATCH 5/5] feat(payment): Added AppSwitch --- .../paypal-commerce-button-strategy.ts | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts index fa0afa932f..d38fda68e3 100644 --- a/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts +++ b/packages/paypal-commerce-integration/src/paypal-commerce/paypal-commerce-button-strategy.ts @@ -104,7 +104,7 @@ export default class PayPalCommerceButtonStrategy implements CheckoutButtonStrat const { isHostedCheckoutEnabled } = paymentMethod.initializationData || {}; const defaultCallbacks = { - // appSwitchWhenAvailable: true, // Need an indicator to trigger App Switch + appSwitchWhenAvailable: true, // Need an indicator to trigger App Switch createOrder: () => this.paypalCommerceIntegrationService.createOrder('paypalcommerce'), onApprove: ({ orderID }: ApproveCallbackPayload) => this.paypalCommerceIntegrationService.tokenizePayment(methodId, orderID), @@ -137,16 +137,16 @@ export default class PayPalCommerceButtonStrategy implements CheckoutButtonStrat const paypalButton = paypalSdk.Buttons(buttonRenderOptions); if (paypalButton.isEligible()) { - // // AppSwitch Flow - // if (paypalButton?.hasReturned && paypalButton.hasReturned()) { - // console.log('HAS RETURNED'); - // if (paypalButton.resume) { - // paypalButton?.resume(); - // } - // } else { - // console.log('RENDER'); - paypalButton.render(`#${containerId}`); - // } + // AppSwitch Flow + if (paypalButton?.hasReturned && paypalButton.hasReturned()) { + console.log('HAS RETURNED'); + if (paypalButton.resume) { + paypalButton?.resume(); + } + } else { + console.log('RENDER'); + paypalButton.render(`#${containerId}`); + } } else if (onEligibilityFailure && typeof onEligibilityFailure === 'function') { onEligibilityFailure(); } else {