226 lines
6.2 KiB
JavaScript
226 lines
6.2 KiB
JavaScript
import {
|
|
RECEIVE_SHOP_CART_COUNT,
|
|
REQUEST_SHOP_CART_ITEMS,
|
|
RECEIVE_SHOP_CART_ITEMS,
|
|
SET_CURRENT_STEP,
|
|
RESET_STEPS,
|
|
GO_TO_NEXT_STEP,
|
|
GO_TO_PREVIOUS_STEP,
|
|
LOAD_CART_STEPS,
|
|
REQUEST_CART_DOCUMENTS,
|
|
RECEIVE_CART_DOCUMENTS,
|
|
REQUEST_CUSTOMER_DETAILS,
|
|
RECEIVE_CUSTOMER_DETAILS,
|
|
SELECT_COUNTRY_DELIVERY,
|
|
SELECT_COUNTRY_BILLING,
|
|
SET_ORDER_INFO,
|
|
IS_CART_ITEMS_DISABLED,
|
|
RECEIVE_ORDER_TOTAL_PRICE,
|
|
UPDATE_CART_ITEMS,
|
|
SET_NEXT_STEP,
|
|
SET_PREV_STEP,
|
|
SET_ORDER_PLACED,
|
|
SET_ORDER_PLACED_REDIRECT
|
|
} from '../../constants/cartConstants';
|
|
import PriceHelper from '../../helpers/coMarket/PriceHelper';
|
|
|
|
const priceHelper = new PriceHelper();
|
|
const moduleReducers = {};
|
|
|
|
const calculateTotalPrice = (cartItems) => {
|
|
let fixedPrice = priceHelper.sumPrices(cartItems.map(item => { return item.quantity * item.totalPrices.fixedPrice}));
|
|
let recurrentPrice = priceHelper.sumPrices(cartItems.map(item => { return item.quantity * item.totalPrices.recurrentPrice})) || 0;
|
|
let servicesPrice = priceHelper.sumPrices(cartItems.map(item => { return item.quantity * item.totalPrices.servicesPrice})) || 0;
|
|
|
|
return {
|
|
fixedPrice,
|
|
recurrentPrice: priceHelper.sumPrices([recurrentPrice, servicesPrice]),
|
|
periodUnit: cartItems[0].periodUnit,
|
|
currency: cartItems[0].country.currency
|
|
}
|
|
}
|
|
|
|
moduleReducers[RECEIVE_SHOP_CART_COUNT] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
cartCount: action.cartCount
|
|
});
|
|
};
|
|
|
|
moduleReducers[UPDATE_CART_ITEMS] = (state, action) => {
|
|
const newState = Object.assign({}, state);
|
|
newState.cartItems.forEach((item) => {
|
|
if(item.idCart === action.newItem.idCart){
|
|
item = action.newItem;
|
|
}
|
|
});
|
|
|
|
return Object.assign({}, state, {
|
|
cartItems: newState.cartItems,
|
|
orderTotalPrice: calculateTotalPrice(newState.cartItems)
|
|
});
|
|
};
|
|
|
|
moduleReducers[REQUEST_SHOP_CART_ITEMS] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
isLoading: action.isLoading
|
|
});
|
|
};
|
|
|
|
moduleReducers[RECEIVE_SHOP_CART_ITEMS] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
cartItems: action.cartItems,
|
|
isLoading: action.isLoading
|
|
});
|
|
};
|
|
|
|
moduleReducers[LOAD_CART_STEPS] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
cartSteps: action.cartSteps
|
|
});
|
|
};
|
|
|
|
moduleReducers[REQUEST_CUSTOMER_DETAILS] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
isLoading: action.isLoading
|
|
});
|
|
};
|
|
|
|
|
|
moduleReducers[RECEIVE_CUSTOMER_DETAILS] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
customerDetails: action.customerDetails,
|
|
isLoading: action.isLoading
|
|
});
|
|
};
|
|
|
|
moduleReducers[SET_CURRENT_STEP] = (state, action) => {
|
|
const cartSteps = Object.assign({}, state.cartSteps);
|
|
|
|
if(state.currentStep && cartSteps[state.currentStep]){
|
|
cartSteps[state.currentStep].status = 'completed';
|
|
}
|
|
cartSteps[action.currentStep].status = 'active';
|
|
|
|
return Object.assign({}, state, {
|
|
currentStep: action.currentStep,
|
|
cartSteps
|
|
});
|
|
};
|
|
|
|
moduleReducers[RESET_STEPS] = (state, action) => {
|
|
const cartSteps = Object.assign({}, state.cartSteps);
|
|
Object.keys(cartSteps).forEach(stepName => {
|
|
cartSteps[stepName].status = cartSteps[stepName].previous ? 'inactive' : 'active';
|
|
});
|
|
|
|
return Object.assign({}, state, {
|
|
cartSteps
|
|
});
|
|
};
|
|
|
|
moduleReducers[GO_TO_NEXT_STEP] = (state, action) => {
|
|
const cartSteps = Object.assign({}, state.cartSteps);
|
|
const nextStep = cartSteps[state.currentStep].next || '';
|
|
|
|
if(nextStep && nextStep !== ''){
|
|
cartSteps[nextStep].status = 'active';
|
|
cartSteps[state.currentStep].status = 'completed';
|
|
}
|
|
|
|
return Object.assign({}, state, {
|
|
currentStep: nextStep,
|
|
cartSteps
|
|
});
|
|
};
|
|
|
|
moduleReducers[GO_TO_PREVIOUS_STEP] = (state, action) => {
|
|
const cartSteps = Object.assign({}, state.cartSteps);
|
|
const previousStep = cartSteps[state.currentStep].previous || '';
|
|
|
|
if(previousStep && previousStep !== ''){
|
|
cartSteps[previousStep].status = 'active';
|
|
cartSteps[state.currentStep].status = 'completed';
|
|
}
|
|
|
|
return Object.assign({}, state, {
|
|
currentStep: previousStep,
|
|
cartSteps
|
|
});
|
|
};
|
|
|
|
moduleReducers[REQUEST_CART_DOCUMENTS] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
isLoading: action.isLoading
|
|
});
|
|
};
|
|
|
|
|
|
moduleReducers[RECEIVE_CART_DOCUMENTS] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
cartDocuments: action.cartDocuments,
|
|
isLoading: action.isLoading
|
|
});
|
|
};
|
|
|
|
moduleReducers[SELECT_COUNTRY_DELIVERY] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
selectedCountryDelivery: action.selectedCountryDelivery
|
|
});
|
|
};
|
|
|
|
moduleReducers[SELECT_COUNTRY_BILLING] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
selectedCountryBilling: action.selectedCountryBilling
|
|
});
|
|
};
|
|
|
|
moduleReducers[SET_ORDER_INFO] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
orderInfo: action.orderInfo
|
|
});
|
|
};
|
|
|
|
moduleReducers[IS_CART_ITEMS_DISABLED] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
isCartItemsDisabled: action.isCartItemsDisabled
|
|
});
|
|
};
|
|
|
|
moduleReducers[RECEIVE_ORDER_TOTAL_PRICE] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
orderTotalPrice: calculateTotalPrice(action.cartItems)
|
|
});
|
|
};
|
|
|
|
moduleReducers[SET_NEXT_STEP] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
nextStepAction: action.nextStepAction
|
|
});
|
|
};
|
|
|
|
moduleReducers[SET_PREV_STEP] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
prevStepAction: action.prevStepAction
|
|
});
|
|
};
|
|
|
|
moduleReducers[SET_ORDER_PLACED] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
orderPlaced: action.orderPlaced
|
|
});
|
|
};
|
|
|
|
moduleReducers[SET_ORDER_PLACED_REDIRECT] = (state, action) => {
|
|
return Object.assign({}, state, {
|
|
orderPlacedRedirect: action.orderPlacedRedirect
|
|
});
|
|
};
|
|
|
|
const cartReducer = (state = {}, action) => {
|
|
return moduleReducers[action.type] ?
|
|
moduleReducers[action.type](state, action) :
|
|
state;
|
|
};
|
|
|
|
export default cartReducer;
|