105 lines
2.7 KiB
JavaScript
105 lines
2.7 KiB
JavaScript
/**
|
|
* External dependencies
|
|
*/
|
|
import {
|
|
usePaymentMethods,
|
|
usePaymentMethodInterface,
|
|
useEmitResponse,
|
|
useStoreEvents,
|
|
} from '@woocommerce/base-context/hooks';
|
|
import { cloneElement, useCallback } from '@wordpress/element';
|
|
import {
|
|
useEditorContext,
|
|
usePaymentMethodDataContext,
|
|
} from '@woocommerce/base-context';
|
|
import classNames from 'classnames';
|
|
import RadioControlAccordion from '@woocommerce/base-components/radio-control-accordion';
|
|
import { useDispatch } from '@wordpress/data';
|
|
|
|
/**
|
|
* Internal dependencies
|
|
*/
|
|
import PaymentMethodCard from './payment-method-card';
|
|
|
|
/**
|
|
* Component used to render all non-saved payment method options.
|
|
*
|
|
* @return {*} The rendered component.
|
|
*/
|
|
const PaymentMethodOptions = () => {
|
|
const {
|
|
setActivePaymentMethod,
|
|
activeSavedToken,
|
|
isExpressPaymentMethodActive,
|
|
customerPaymentMethods,
|
|
} = usePaymentMethodDataContext();
|
|
const { paymentMethods } = usePaymentMethods();
|
|
const {
|
|
activePaymentMethod,
|
|
...paymentMethodInterface
|
|
} = usePaymentMethodInterface();
|
|
const { noticeContexts } = useEmitResponse();
|
|
const { removeNotice } = useDispatch( 'core/notices' );
|
|
const { dispatchCheckoutEvent } = useStoreEvents();
|
|
const { isEditor } = useEditorContext();
|
|
|
|
const options = Object.keys( paymentMethods ).map( ( name ) => {
|
|
const { edit, content, label, supports } = paymentMethods[ name ];
|
|
const component = isEditor ? edit : content;
|
|
return {
|
|
value: name,
|
|
label:
|
|
typeof label === 'string'
|
|
? label
|
|
: cloneElement( label, {
|
|
components: paymentMethodInterface.components,
|
|
} ),
|
|
name: `wc-saved-payment-method-token-${ name }`,
|
|
content: (
|
|
<PaymentMethodCard showSaveOption={ supports.showSaveOption }>
|
|
{ cloneElement( component, {
|
|
activePaymentMethod,
|
|
...paymentMethodInterface,
|
|
} ) }
|
|
</PaymentMethodCard>
|
|
),
|
|
};
|
|
} );
|
|
|
|
const onChange = useCallback(
|
|
( value ) => {
|
|
setActivePaymentMethod( value );
|
|
removeNotice( 'wc-payment-error', noticeContexts.PAYMENTS );
|
|
dispatchCheckoutEvent( 'set-active-payment-method', {
|
|
value,
|
|
} );
|
|
},
|
|
[
|
|
dispatchCheckoutEvent,
|
|
noticeContexts.PAYMENTS,
|
|
removeNotice,
|
|
setActivePaymentMethod,
|
|
]
|
|
);
|
|
|
|
const isSinglePaymentMethod =
|
|
Object.keys( customerPaymentMethods ).length === 0 &&
|
|
Object.keys( paymentMethods ).length === 1;
|
|
|
|
const singleOptionClass = classNames( {
|
|
'disable-radio-control': isSinglePaymentMethod,
|
|
} );
|
|
|
|
return isExpressPaymentMethodActive ? null : (
|
|
<RadioControlAccordion
|
|
id={ 'wc-payment-method-options' }
|
|
className={ singleOptionClass }
|
|
selected={ activeSavedToken ? null : activePaymentMethod }
|
|
onChange={ onChange }
|
|
options={ options }
|
|
/>
|
|
);
|
|
};
|
|
|
|
export default PaymentMethodOptions;
|