Skip to content

Commit

Permalink
fix(payment): PAYPAL-2719 fix amazon pay button
Browse files Browse the repository at this point in the history
  • Loading branch information
bc-nick committed Jul 10, 2023
1 parent c9670d4 commit de1cb81
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 59 deletions.
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import { CartRequestSender } from '../../../cart';
import BuyNowCartRequestBody from '../../../cart/buy-now-cart-request-body';
import { BuyNowCartCreationError } from '../../../cart/errors';
import { CheckoutActionCreator, CheckoutStore } from '../../../checkout';
import {
Expand All @@ -17,12 +16,12 @@ import { getShippableItemsCount } from '../../../shipping';
import { CheckoutButtonInitializeOptions } from '../../checkout-button-options';
import CheckoutButtonStrategy from '../checkout-button-strategy';

import { isWithBuyNowFeatures } from './amazon-pay-v2-button-options';
import { isWithBuyNowFeatures, WithBuyNowFeature } from './amazon-pay-v2-button-options';
import AmazonPayV2RequestSender from './amazon-pay-v2-request-sender';
import AmazonPayV2ConfigCreationError from './errors/amazon-pay-v2-config-creation-error';

export default class AmazonPayV2ButtonStrategy implements CheckoutButtonStrategy {
private _buyNowCartRequestBody?: BuyNowCartRequestBody | void;
private _buyNowInitializeOptions: WithBuyNowFeature['buyNowInitializeOptions'];

constructor(
private _store: CheckoutStore,
Expand Down Expand Up @@ -60,11 +59,10 @@ export default class AmazonPayV2ButtonStrategy implements CheckoutButtonStrategy
isWithBuyNowFeatures(amazonpay) &&
typeof amazonpay?.buyNowInitializeOptions?.getBuyNowCartRequestBody === 'function'
) {
this._buyNowCartRequestBody =
amazonpay.buyNowInitializeOptions.getBuyNowCartRequestBody();
this._buyNowInitializeOptions = amazonpay.buyNowInitializeOptions;

if (this._buyNowCartRequestBody) {
this._amazonPayV2PaymentProcessor.setCartRequestBody(this._buyNowCartRequestBody);
if (this._buyNowInitializeOptions) {
this._amazonPayV2PaymentProcessor.updateBuyNowFlowFlag(true);
}
}

Expand All @@ -77,7 +75,7 @@ export default class AmazonPayV2ButtonStrategy implements CheckoutButtonStrategy
buttonColor,
});

if (this._buyNowCartRequestBody) {
if (this._buyNowInitializeOptions) {
this._amazonPayV2PaymentProcessor.prepareCheckoutWithCreationRequestConfig(
this._getCheckoutCreationRequestConfig.bind(this),
);
Expand All @@ -89,13 +87,15 @@ export default class AmazonPayV2ButtonStrategy implements CheckoutButtonStrategy
}

private async _createBuyNowCart() {
if (!this._buyNowCartRequestBody) {
const buyNowCartRequestBody = this._buyNowInitializeOptions?.getBuyNowCartRequestBody?.();

if (!buyNowCartRequestBody) {
throw new MissingDataError(MissingDataErrorType.MissingCart);
}

try {
const { body: buyNowCart } = await this._cartRequestSender.createBuyNowCart(
this._buyNowCartRequestBody,
buyNowCartRequestBody,
);

return buyNowCart;
Expand Down Expand Up @@ -125,20 +125,22 @@ export default class AmazonPayV2ButtonStrategy implements CheckoutButtonStrategy
private async _getCheckoutCreationRequestConfig() {
const buyNowCart = await this._createBuyNowCart();

const estimatedOrderAmount = {
amount: String(buyNowCart.baseAmount),
currencyCode: buyNowCart.currency.code,
};

const createCheckoutSessionConfig = await this._createCheckoutConfig(buyNowCart.id);

return {
createCheckoutSessionConfig,
estimatedOrderAmount,
productType:
getShippableItemsCount(buyNowCart) === 0
? AmazonPayV2PayOptions.PayOnly
: AmazonPayV2PayOptions.PayAndShip,
};
if (buyNowCart) {
const estimatedOrderAmount = {
amount: String(buyNowCart.baseAmount),
currencyCode: buyNowCart.currency.code,
};

const createCheckoutSessionConfig = await this._createCheckoutConfig(buyNowCart.id);

return {
createCheckoutSessionConfig,
estimatedOrderAmount,
productType:
getShippableItemsCount(buyNowCart) === 0
? AmazonPayV2PayOptions.PayOnly
: AmazonPayV2PayOptions.PayAndShip,
};
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import { createScriptLoader } from '@bigcommerce/script-loader';

import { CartSource } from '@bigcommerce/checkout-sdk/payment-integration-api';

import { PaymentMethod } from '../../';
import { getConfig, getConfigState } from '../../../../src/config/configs.mock';
import { BuyNowCartRequestBody } from '../../../cart';
import { getCart } from '../../../cart/carts.mock';
import { CheckoutStore, createCheckoutStore } from '../../../checkout';
import { getCheckoutStoreState } from '../../../checkout/checkouts.mock';
Expand Down Expand Up @@ -428,20 +425,6 @@ describe('AmazonPayV2PaymentProcessor', () => {
});

describe('should use the new button params from API Version 2:', () => {
const buyNowRequestBody: BuyNowCartRequestBody = {
source: CartSource.BuyNow,
lineItems: [
{
productId: 1,
quantity: 2,
optionSelections: {
optionId: 11,
optionValue: 11,
},
},
],
};

beforeEach(() => {
const storeConfigMock = getConfig().storeConfig;

Expand All @@ -465,7 +448,7 @@ describe('AmazonPayV2PaymentProcessor', () => {
);

await processor.initialize(amazonPayV2Mock);
processor.setCartRequestBody(buyNowRequestBody);
processor.updateBuyNowFlowFlag(true);
renderAmazonPayButton();

expect(amazonPayV2SDKMock.Pay.renderButton).toHaveBeenCalledWith(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { getShippableItemsCount } from '../../../../../core/src/shipping';
import { guard } from '../../../../src/common/utility';
import { StoreProfile } from '../../../../src/config';
import { CheckoutSettings } from '../../../../src/config/config';
import BuyNowCartRequestBody from '../../../cart/buy-now-cart-request-body';
import {
InvalidArgumentError,
MissingDataError,
Expand Down Expand Up @@ -35,7 +34,7 @@ export default class AmazonPayV2PaymentProcessor {
private _amazonPayV2SDK?: AmazonPayV2SDK;
private _buttonParentContainer?: HTMLDivElement;
private _amazonPayV2Button?: AmazonPayV2Button;
private _buyNowCartRequestBody?: BuyNowCartRequestBody;
private _isBuyNowFlow?: boolean;

constructor(private _amazonPayV2ScriptLoader: AmazonPayV2ScriptLoader) {}

Expand Down Expand Up @@ -81,21 +80,27 @@ export default class AmazonPayV2PaymentProcessor {
}

prepareCheckoutWithCreationRequestConfig(
createCheckoutConfig: () => Promise<{
createCheckoutSessionConfig: Required<AmazonPayV2CheckoutSessionConfig>;
estimatedOrderAmount: AmazonPayV2Price;
productType: AmazonPayV2PayOptions;
}>,
createCheckoutConfig: () => Promise<
| {
createCheckoutSessionConfig: Required<AmazonPayV2CheckoutSessionConfig>;
estimatedOrderAmount: AmazonPayV2Price;
productType: AmazonPayV2PayOptions;
}
| undefined
>,
) {
this._getAmazonPayV2Button().onClick(async () => {
const config = await createCheckoutConfig();
const requestConfig = this._prepareRequestConfig(
config.createCheckoutSessionConfig,
config.estimatedOrderAmount,
config.productType,
);

this._getAmazonPayV2Button().initCheckout(requestConfig);
if (config) {
const requestConfig = this._prepareRequestConfig(
config.createCheckoutSessionConfig,
config.estimatedOrderAmount,
config.productType,
);

this._getAmazonPayV2Button().initCheckout(requestConfig);
}
});
}

Expand Down Expand Up @@ -145,8 +150,8 @@ export default class AmazonPayV2PaymentProcessor {
return this._getButtonParentContainer();
}

setCartRequestBody(buyNowCartRequestBody: BuyNowCartRequestBody) {
this._buyNowCartRequestBody = buyNowCartRequestBody;
updateBuyNowFlowFlag(isBuyNowFlow?: boolean) {
this._isBuyNowFlow = Boolean(isBuyNowFlow);
}

/**
Expand Down Expand Up @@ -228,7 +233,7 @@ export default class AmazonPayV2PaymentProcessor {
design: AmazonPayV2ButtonDesign.C0001,
};

if (this._buyNowCartRequestBody) {
if (this._isBuyNowFlow) {
return {
...buttonBaseConfig,
sandbox: !!testMode,
Expand Down

0 comments on commit de1cb81

Please sign in to comment.