/**
* External dependencies
*/
import { useCallback, useMemo } from '@wordpress/element';
/**
* Internal dependencies
*/
import { actions, ActionType } from './actions';
import { STATUS } from './constants';
import type {
PaymentStatusDispatchers,
PaymentMethodDispatchers,
} from './types';
import { useCustomerData } from '../../../hooks/use-customer-data';
export const usePaymentMethodDataDispatchers = (
dispatch: React.Dispatch< ActionType >
): {
dispatchActions: PaymentMethodDispatchers;
setPaymentStatus: () => PaymentStatusDispatchers;
} => {
const { setBillingAddress, setShippingAddress } = useCustomerData();
const dispatchActions = useMemo(
(): PaymentMethodDispatchers => ( {
setRegisteredPaymentMethods: ( paymentMethods ) =>
void dispatch(
actions.setRegisteredPaymentMethods( paymentMethods )
),
setRegisteredExpressPaymentMethods: ( paymentMethods ) =>
void dispatch(
actions.setRegisteredExpressPaymentMethods( paymentMethods )
),
setShouldSavePayment: ( shouldSave ) =>
void dispatch(
actions.setShouldSavePaymentMethod( shouldSave )
),
setActivePaymentMethod: ( paymentMethod, paymentMethodData = {} ) =>
void dispatch(
actions.setActivePaymentMethod(
paymentMethod,
paymentMethodData
)
),
} ),
[ dispatch ]
);
const setPaymentStatus = useCallback(
(): PaymentStatusDispatchers => ( {
pristine: () => dispatch( actions.statusOnly( STATUS.PRISTINE ) ),
started: () => dispatch( actions.statusOnly( STATUS.STARTED ) ),
processing: () =>
dispatch( actions.statusOnly( STATUS.PROCESSING ) ),
completed: () => dispatch( actions.statusOnly( STATUS.COMPLETE ) ),
error: ( errorMessage ) =>
dispatch( actions.error( errorMessage ) ),
failed: (
errorMessage,
paymentMethodData,
billingAddress = undefined
) => {
if ( billingAddress ) {
setBillingAddress( billingAddress );
}
dispatch(
actions.failed( {
errorMessage: errorMessage || '',
paymentMethodData: paymentMethodData || {},
} )
);
},
success: (
paymentMethodData,
billingAddress = undefined,
shippingData = undefined
) => {
if ( billingAddress ) {
setBillingAddress( billingAddress );
}
if (
typeof shippingData !== undefined &&
shippingData?.address
) {
setShippingAddress(
shippingData.address as Record< string, unknown >
);
}
dispatch(
actions.success( {
paymentMethodData,
} )
);
},
} ),
[ dispatch, setBillingAddress, setShippingAddress ]
);
return {
dispatchActions,
setPaymentStatus,
};
};