Files
old-new-wiaas/frontend/src/reducers/cart/cartReducers.js
2018-06-14 16:49:28 +02:00

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;