All files / app/payment/paymentMethod HostedFieldPaymentMethod.tsx

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114  25x 25x   25x 25x 25x                               25x 25x 12x             24x                 25x 1x             2x                 25x   12x 12x 12x 12x 12x 12x 12x   12x                                                                                         25x  
import { CheckoutSelectors, PaymentInitializeOptions, PaymentMethod, PaymentRequestOptions } from '@bigcommerce/checkout-sdk';
import { noop } from 'lodash';
import React, { Component, ReactNode } from 'react';
 
import { TranslatedString } from '../../locale';
import { FormFieldContainer, Label } from '../../ui/form';
import { LoadingOverlay } from '../../ui/loading';
 
export interface HostedFieldPaymentMethodProps {
    cardCodeId?: string;
    cardExpiryId: string;
    cardNumberId: string;
    isInitializing?: boolean;
    method: PaymentMethod;
    postalCodeId?: string;
    walletButtons?: ReactNode;
    deinitializePayment(options: PaymentRequestOptions): Promise<CheckoutSelectors>;
    initializePayment(options: PaymentInitializeOptions): Promise<CheckoutSelectors>;
    onUnhandledError?(error: Error): void;
}
 
// TODO: Use HostedCreditCardFieldset
export default class HostedFieldPaymentMethod extends Component<HostedFieldPaymentMethodProps> {
    async componentDidMount(): Promise<void> {
        const {
            initializePayment,
            method,
            onUnhandledError = noop,
        } = this.props;
 
        try {
            await initializePayment({
                gatewayId: method.gateway,
                methodId: method.id,
            });
        } catch (error) {
            onUnhandledError(error);
        }
    }
 
    async componentWillUnmount(): Promise<void> {
        const {
            deinitializePayment,
            method,
            onUnhandledError = noop,
        } = this.props;
 
        try {
            await deinitializePayment({
                gatewayId: method.gateway,
                methodId: method.id,
            });
        } catch (error) {
            onUnhandledError(error);
        }
    }
 
    render(): ReactNode {
        const {
            cardCodeId,
            cardExpiryId,
            cardNumberId,
            isInitializing = false,
            postalCodeId,
            walletButtons,
        } = this.props;
 
        return (
            <LoadingOverlay
                hideContentWhenLoading
                isLoading={ isInitializing }
            >
                <div className="form-ccFields">
                    { walletButtons && <FormFieldContainer>
                        { walletButtons }
                    </FormFieldContainer> }
 
                    <FormFieldContainer additionalClassName="form-field--ccNumber">
                        <Label>
                            <TranslatedString id="payment.credit_card_number_label" />
                        </Label>
 
                        <div id={ cardNumberId } />
                    </FormFieldContainer>
 
                    <FormFieldContainer additionalClassName="form-field--ccExpiry">
                        <Label>
                            <TranslatedString id="payment.credit_card_expiration_label" />
                        </Label>
 
                        <div id={ cardExpiryId } />
                    </FormFieldContainer>
 
                    { cardCodeId && <FormFieldContainer additionalClassName="form-field--ccCvv">
                        <Label>
                            <TranslatedString id="payment.credit_card_cvv_label" />
                        </Label>
 
                        <div id={ cardCodeId } />
                    </FormFieldContainer> }
 
                    { postalCodeId && <FormFieldContainer additionalClassName="form-field--postCode">
                        <Label>
                            <TranslatedString id="payment.postal_code_label" />
                        </Label>
 
                        <div id={ postalCodeId } />
                    </FormFieldContainer> }
                </div>
            </LoadingOverlay>
        );
    }
}