Skip to content

Commit 17695fe

Browse files
authored
feat(payment): PAYPAL-6035 skips the error when the strategy has already been deinitialized during braintree hosted filed error (#3064)
1 parent 919bbf8 commit 17695fe

File tree

2 files changed

+42
-2
lines changed

2 files changed

+42
-2
lines changed

packages/braintree-integration/src/braintree-credit-card/braintree-credit-card-payment-strategy.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { getScriptLoader } from '@bigcommerce/script-loader';
22
import { merge } from 'lodash';
33

44
import {
5+
BraintreeError,
6+
BraintreeErrorType,
57
BraintreeFastlane,
68
BraintreeIntegrationService,
79
BraintreeScriptLoader,
@@ -527,6 +529,32 @@ describe('BraintreeCreditCardPaymentStrategy', () => {
527529
payload.payment,
528530
);
529531
});
532+
533+
it('throws an error if loadHostedFields finished with an error related to an invalid hosted field when the strategy is not deinitialized', async () => {
534+
const braintreeError: BraintreeError = {
535+
code: 'HOSTED_FIELDS_INVALID_FIELD_SELECTOR',
536+
type: BraintreeErrorType.Merchant,
537+
name: 'BraintreeError',
538+
message: 'Selector does not reference a valid DOM node.',
539+
};
540+
541+
jest.spyOn(braintreeScriptLoader, 'loadHostedFields').mockRejectedValue(
542+
braintreeError,
543+
);
544+
jest.spyOn(
545+
paymentIntegrationService.getState(),
546+
'isPaymentMethodInitialized',
547+
).mockReturnValue(true);
548+
549+
try {
550+
await braintreeCreditCardPaymentStrategy.initialize({
551+
methodId: paymentMethod.id,
552+
braintree: initializeOptions,
553+
});
554+
} catch (error: Error | any) {
555+
expect(error.message).toEqual(braintreeError.message);
556+
}
557+
});
530558
});
531559
});
532560
});

packages/braintree-integration/src/braintree-credit-card/braintree-credit-card-payment-strategy.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export default class BraintreeCreditCardPaymentStrategy implements PaymentStrate
8585
await this.initializeBraintreeFastlaneOrThrow(methodId);
8686
}
8787
} catch (error) {
88-
return this.handleError(error);
88+
return this.handleError(error, methodId);
8989
}
9090
}
9191

@@ -135,8 +135,20 @@ export default class BraintreeCreditCardPaymentStrategy implements PaymentStrate
135135
return Promise.resolve();
136136
}
137137

138-
private handleError(error: unknown): never {
138+
private handleError(error: unknown, methodId?: string): void {
139139
if (isBraintreeError(error)) {
140+
const isPaymentMethodInitialized = !!(
141+
methodId &&
142+
this.paymentIntegrationService.getState().isPaymentMethodInitialized({ methodId })
143+
);
144+
145+
if (
146+
!isPaymentMethodInitialized &&
147+
error.code === 'HOSTED_FIELDS_INVALID_FIELD_SELECTOR'
148+
) {
149+
return;
150+
}
151+
140152
throw new PaymentMethodFailedError(error.message);
141153
}
142154

0 commit comments

Comments
 (0)