woocommerce/plugins/woocommerce-blocks/assets/js/base/context/hooks/use-checkout-submit.js

76 lines
2.1 KiB
JavaScript

/**
* External dependencies
*/
import {
CHECKOUT_STORE_KEY,
PAYMENT_METHOD_DATA_STORE_KEY,
} from '@woocommerce/block-data';
import { useSelect } from '@wordpress/data';
import { __ } from '@wordpress/i18n';
import { __experimentalApplyCheckoutFilter } from '@woocommerce/blocks-checkout';
/**
* Internal dependencies
*/
import { useCheckoutEventsContext } from '../providers';
import { usePaymentMethods } from './payment-methods/use-payment-methods';
/**
* Returns the submitButtonText, onSubmit interface from the checkout context,
* and an indication of submission status.
*/
export const useCheckoutSubmit = () => {
const {
isCalculating,
isBeforeProcessing,
isProcessing,
isAfterProcessing,
isComplete,
hasError,
} = useSelect( ( select ) => {
const store = select( CHECKOUT_STORE_KEY );
return {
isCalculating: store.isCalculating(),
isBeforeProcessing: store.isBeforeProcessing(),
isProcessing: store.isProcessing(),
isAfterProcessing: store.isAfterProcessing(),
isComplete: store.isComplete(),
hasError: store.hasError(),
};
} );
const { currentStatus: paymentStatus, activePaymentMethod } = useSelect(
( select ) => {
const store = select( PAYMENT_METHOD_DATA_STORE_KEY );
return {
currentStatus: store.getCurrentStatus(),
activePaymentMethod: store.getActivePaymentMethod(),
};
}
);
const { onSubmit } = useCheckoutEventsContext();
const { paymentMethods = {} } = usePaymentMethods();
const paymentMethod = paymentMethods[ activePaymentMethod ] || {};
const waitingForProcessing =
isProcessing || isAfterProcessing || isBeforeProcessing;
const waitingForRedirect = isComplete && ! hasError;
const defaultLabel =
paymentMethod.placeOrderButtonLabel ||
__( 'Place Order', 'woo-gutenberg-products-block' );
const label = __experimentalApplyCheckoutFilter( {
filterName: 'placeOrderButtonLabel',
defaultValue: defaultLabel,
} );
return {
submitButtonText: label,
onSubmit,
isCalculating,
isDisabled: isProcessing || paymentStatus.isDoingExpressPayment,
waitingForProcessing,
waitingForRedirect,
};
};