Skip to content

Commit 2592137

Browse files
Add SPM events/types/tests (#613)
1 parent e73efa4 commit 2592137

File tree

3 files changed

+82
-0
lines changed

3 files changed

+82
-0
lines changed

src/components/createElementComponent.test.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,46 @@ describe('createElementComponent', () => {
712712
expect(mockHandler).not.toHaveBeenCalled();
713713
});
714714

715+
it('propagates the Element`s savedpaymentmethodremove event to the current onSavedPaymentMethodRemove prop', () => {
716+
const mockHandler = jest.fn();
717+
const mockHandler2 = jest.fn();
718+
const {rerender} = render(
719+
<Elements stripe={mockStripe}>
720+
<PaymentElement onSavedPaymentMethodRemove={mockHandler} />
721+
</Elements>
722+
);
723+
rerender(
724+
<Elements stripe={mockStripe}>
725+
<PaymentElement onSavedPaymentMethodRemove={mockHandler2} />
726+
</Elements>
727+
);
728+
729+
const removeEventMock = Symbol('savedpaymentmethodremove');
730+
simulateEvent('savedpaymentmethodremove', removeEventMock);
731+
expect(mockHandler2).toHaveBeenCalledWith(removeEventMock);
732+
expect(mockHandler).not.toHaveBeenCalled();
733+
});
734+
735+
it('propagates the Element`s savedpaymentmethodupdate event to the current onSavedPaymentMethodUpdate prop', () => {
736+
const mockHandler = jest.fn();
737+
const mockHandler2 = jest.fn();
738+
const {rerender} = render(
739+
<Elements stripe={mockStripe}>
740+
<PaymentElement onSavedPaymentMethodUpdate={mockHandler} />
741+
</Elements>
742+
);
743+
rerender(
744+
<Elements stripe={mockStripe}>
745+
<PaymentElement onSavedPaymentMethodUpdate={mockHandler2} />
746+
</Elements>
747+
);
748+
749+
const updateEventMock = Symbol('savedpaymentmethodupdate');
750+
simulateEvent('savedpaymentmethodupdate', updateEventMock);
751+
expect(mockHandler2).toHaveBeenCalledWith(updateEventMock);
752+
expect(mockHandler).not.toHaveBeenCalled();
753+
});
754+
715755
it('updates the Element when options change', () => {
716756
const {rerender} = render(
717757
<Elements stripe={mockStripe}>

src/components/createElementComponent.tsx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ interface PrivateElementProps {
3333
onCancel?: UnknownCallback;
3434
onShippingAddressChange?: UnknownCallback;
3535
onShippingRateChange?: UnknownCallback;
36+
onSavedPaymentMethodRemove?: UnknownCallback;
37+
onSavedPaymentMethodUpdate?: UnknownCallback;
3638
options?: UnknownOptions;
3739
}
3840

@@ -61,6 +63,8 @@ const createElementComponent = (
6163
onCancel,
6264
onShippingAddressChange,
6365
onShippingRateChange,
66+
onSavedPaymentMethodRemove,
67+
onSavedPaymentMethodUpdate,
6468
}) => {
6569
const ctx = useElementsOrCheckoutSdkContextWithUseCase(
6670
`mounts <${displayName}>`
@@ -87,6 +91,16 @@ const createElementComponent = (
8791
useAttachEvent(element, 'cancel', onCancel);
8892
useAttachEvent(element, 'shippingaddresschange', onShippingAddressChange);
8993
useAttachEvent(element, 'shippingratechange', onShippingRateChange);
94+
useAttachEvent(
95+
element,
96+
'savedpaymentmethodremove',
97+
onSavedPaymentMethodRemove
98+
);
99+
useAttachEvent(
100+
element,
101+
'savedpaymentmethodupdate',
102+
onSavedPaymentMethodUpdate
103+
);
90104
useAttachEvent(element, 'change', onChange);
91105

92106
let readyCallback: UnknownCallback | undefined;
@@ -228,6 +242,8 @@ const createElementComponent = (
228242
onCancel: PropTypes.func,
229243
onShippingAddressChange: PropTypes.func,
230244
onShippingRateChange: PropTypes.func,
245+
onSavedPaymentMethodRemove: PropTypes.func,
246+
onSavedPaymentMethodUpdate: PropTypes.func,
231247
options: PropTypes.object as any,
232248
};
233249

src/types/index.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,32 @@ export interface PaymentElementProps extends ElementProps {
388388
* Triggered when the [loader](https://stripe.com/docs/js/elements_object/create#stripe_elements-options-loader) UI is mounted to the DOM and ready to be displayed.
389389
*/
390390
onLoaderStart?: (event: {elementType: 'payment'}) => any;
391+
392+
/**
393+
* Requires beta access:
394+
* Contact [Stripe support](https://support.stripe.com/) for more information.
395+
*
396+
* Triggered when the user removes a saved payment method from the Payment Element.
397+
*/
398+
onSavedPaymentMethodRemove?: (event: {
399+
elementType: 'payment';
400+
success: boolean;
401+
error?: string;
402+
payment_method: stripeJs.StripePaymentElementChangeEvent['value']['payment_method'];
403+
}) => any;
404+
405+
/**
406+
* Requires beta access:
407+
* Contact [Stripe support](https://support.stripe.com/) for more information.
408+
*
409+
* Triggered when the user updates a saved payment method from the Payment Element.
410+
*/
411+
onSavedPaymentMethodUpdate?: (event: {
412+
elementType: 'payment';
413+
success: boolean;
414+
error?: string;
415+
payment_method: stripeJs.StripePaymentElementChangeEvent['value']['payment_method'];
416+
}) => any;
391417
}
392418

393419
export type PaymentElementComponent = FunctionComponent<PaymentElementProps>;

0 commit comments

Comments
 (0)