woocommerce/plugins/woocommerce-blocks/assets/js/data/payment-methods/reducers.ts

137 lines
3.3 KiB
TypeScript

/**
* External dependencies
*/
import type { Reducer } from 'redux';
import { objectHasProp } from '@woocommerce/types';
/**
* Internal dependencies
*/
import {
defaultPaymentMethodDataState,
PaymentMethodDataState,
} from './default-state';
import { ACTION_TYPES } from './action-types';
const reducer: Reducer< PaymentMethodDataState > = (
state = defaultPaymentMethodDataState,
action
) => {
let newState = state;
switch ( action.type ) {
case ACTION_TYPES.SET_SHOULD_SAVE_PAYMENT_METHOD:
newState = {
...state,
shouldSavePaymentMethod: action.shouldSavePaymentMethod,
};
break;
case ACTION_TYPES.SET_PAYMENT_METHOD_DATA:
newState = {
...state,
paymentMethodData: action.paymentMethodData,
};
break;
case ACTION_TYPES.SET_PAYMENT_STATUS:
newState = {
...state,
currentStatus: {
// When the status is changed to pristine, we need to reset the currentStatus properties
// to their default initial values
...( action.status?.isPristine === true
? defaultPaymentMethodDataState.currentStatus
: state.currentStatus ),
...action.status,
isFinished:
action.status.hasError ||
action.status.hasFailed ||
action.status.isSuccessful,
isDoingExpressPayment:
! action.status.isPristine &&
! state.currentStatus.isPristine &&
state.isExpressPaymentMethodActive,
},
paymentMethodData:
action.paymentMethodData || state.paymentMethodData,
};
break;
case ACTION_TYPES.REMOVE_AVAILABLE_PAYMENT_METHOD:
const previousAvailablePaymentMethods = {
...state.availablePaymentMethods,
};
delete previousAvailablePaymentMethods[ action.name ];
newState = {
...state,
availablePaymentMethods: {
...previousAvailablePaymentMethods,
},
};
break;
case ACTION_TYPES.REMOVE_AVAILABLE_EXPRESS_PAYMENT_METHOD:
const previousAvailableExpressPaymentMethods = {
...state.availablePaymentMethods,
};
delete previousAvailableExpressPaymentMethods[ action.name ];
newState = {
...state,
availableExpressPaymentMethods: {
...previousAvailableExpressPaymentMethods,
},
};
break;
case ACTION_TYPES.SET_PAYMENT_METHODS_INITIALIZED:
newState = {
...state,
paymentMethodsInitialized: action.initialized,
};
break;
case ACTION_TYPES.SET_EXPRESS_PAYMENT_METHODS_INITIALIZED:
newState = {
...state,
expressPaymentMethodsInitialized: action.initialized,
};
break;
case ACTION_TYPES.SET_AVAILABLE_PAYMENT_METHODS:
newState = {
...state,
availablePaymentMethods: action.paymentMethods,
};
break;
case ACTION_TYPES.SET_AVAILABLE_EXPRESS_PAYMENT_METHODS:
newState = {
...state,
availableExpressPaymentMethods: action.paymentMethods,
};
break;
case ACTION_TYPES.SET_ACTIVE_PAYMENT_METHOD:
const activeSavedToken =
typeof state.paymentMethodData === 'object' &&
objectHasProp( action.paymentMethodData, 'token' )
? action.paymentMethodData.token + ''
: '';
newState = {
...state,
activeSavedToken,
activePaymentMethod: action.activePaymentMethod,
paymentMethodData:
action.paymentMethodData || state.paymentMethodData,
};
break;
default:
return newState;
}
return newState;
};
export type State = ReturnType< typeof reducer >;
export default reducer;