woocommerce/plugins/woocommerce-blocks/assets/js/base/context/cart-checkout/payment-methods/reducer.js

135 lines
2.9 KiB
JavaScript

/**
* Internal dependencies
*/
import { ACTION_TYPES, DEFAULT_PAYMENT_DATA } from './constants';
const {
STARTED,
ERROR,
FAILED,
SUCCESS,
PROCESSING,
PRISTINE,
COMPLETE,
SET_REGISTERED_PAYMENT_METHODS,
SET_REGISTERED_EXPRESS_PAYMENT_METHODS,
SET_SHOULD_SAVE_PAYMENT_METHOD,
} = ACTION_TYPES;
const hasSavedPaymentToken = ( paymentMethodData ) => {
return !! (
typeof paymentMethodData === 'object' && paymentMethodData.isSavedToken
);
};
/**
* Reducer for payment data state
*
* @param {Object} state Current state.
* @param {Object} action Current action.
* @param {string} action.type Action type.
* @param {Object} action.paymentMethodData Payment method data payload.
* @param {boolean} action.shouldSavePaymentMethod Should save payment method flag.
* @param {string} action.errorMessage Error message to store in state.
* @param {Object} action.paymentMethods Registered payment methods.
*/
const reducer = (
state = DEFAULT_PAYMENT_DATA,
{
type,
paymentMethodData,
shouldSavePaymentMethod,
errorMessage,
paymentMethods,
}
) => {
switch ( type ) {
case STARTED:
return state.currentStatus !== STARTED
? {
...state,
currentStatus: STARTED,
}
: state;
case ERROR:
return state.currentStatus !== ERROR
? {
...state,
currentStatus: ERROR,
errorMessage: errorMessage || state.errorMessage,
}
: state;
case FAILED:
return state.currentStatus !== FAILED
? {
...state,
currentStatus: FAILED,
paymentMethodData:
paymentMethodData || state.paymentMethodData,
errorMessage: errorMessage || state.errorMessage,
}
: state;
case SUCCESS:
return state.currentStatus !== SUCCESS
? {
...state,
currentStatus: SUCCESS,
paymentMethodData:
paymentMethodData || state.paymentMethodData,
hasSavedToken: hasSavedPaymentToken(
paymentMethodData
),
}
: state;
case PROCESSING:
return state.currentStatus !== PROCESSING
? {
...state,
currentStatus: PROCESSING,
errorMessage: '',
}
: state;
case COMPLETE:
return state.currentStatus !== COMPLETE
? {
...state,
currentStatus: COMPLETE,
}
: state;
case PRISTINE:
return {
...DEFAULT_PAYMENT_DATA,
currentStatus: PRISTINE,
// keep payment method registration state
paymentMethods: {
...state.paymentMethods,
},
expressPaymentMethods: {
...state.expressPaymentMethods,
},
shouldSavePaymentMethod: state.shouldSavePaymentMethod,
};
case SET_REGISTERED_PAYMENT_METHODS:
return {
...state,
paymentMethods,
};
case SET_REGISTERED_EXPRESS_PAYMENT_METHODS:
return {
...state,
expressPaymentMethods: {
...state.expressPaymentMethods,
...paymentMethods,
},
};
case SET_SHOULD_SAVE_PAYMENT_METHOD:
return {
...state,
shouldSavePaymentMethod,
};
}
return state;
};
export default reducer;