import {API_SERVER} from '../../config'; import HtmlClient from '../../helpers/HtmlClient'; import { REQUEST_SHOP_CART_COUNT, 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, cartSteps, UPLOAD_DOCUMENT, 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, cartMessages } from '../../constants/cartConstants'; import {updateMessages} from '../notification/notificationActions'; const client = new HtmlClient(); export const requestShopCartCount = () => ({type: REQUEST_SHOP_CART_COUNT}); export const receiveShopCartCount = (json) => ({type: RECEIVE_SHOP_CART_COUNT, cartCount: json}); export const requestShopCartItems = () => ({ type: REQUEST_SHOP_CART_ITEMS, isLoading: true }); export const receiveShopCartItems = (json) => ({ type: RECEIVE_SHOP_CART_ITEMS, isLoading: false, cartItems: json }); export const requestCustomerDetails = () => ({ type: REQUEST_CUSTOMER_DETAILS, isLoading: true }); export const receiveCustomerDetails = (json) => ({ type: RECEIVE_CUSTOMER_DETAILS, isLoading: false, customerDetails: json }); export const fetchCartCount = () => { return dispatch => { <<<<<<< HEAD dispatch(requestShopCartCount()); //TODO : fetch cart count from woocommerce (requires plugin) dispatch(receiveShopCartCount(0)); /* return client.fetch({url: `${API_SERVER}/cart/api/getCartCount`}).then(response => { if (typeof response.data !== 'undefined' && 'cartItemsCount' in response.data) { dispatch(receiveShopCartCount(response.data.cartItemsCount)); } }).catch(error => { client.onError(error, dispatch); }); */ ======= // TODO Fetch correct cart count after adding support to cart on API // dispatch(requestShopCartCount()); // return client.fetch({url: `${API_SERVER}/cart/api/getCartCount`}).then(response => { // if (typeof response.data !== 'undefined' && 'cartItemsCount' in response.data) { dispatch(receiveShopCartCount(0)); // } // }).catch(error => { // client.onError(error, dispatch); // }); >>>>>>> 6e0c26d... Connected and enabled co-maket } } export const fetchCartItems = (isForSteps = false) => { return dispatch => { dispatch(requestShopCartItems()); return client.fetch({url: `${API_SERVER}/cart/api/getCartItems`}).then(response => { if (typeof response.data !== 'undefined' && 'cartItems' in response.data) { dispatch(receiveShopCartItems(response.data.cartItems)); dispatch(fetchCartDocuments(response.data.cartItems.map((cartItem) => cartItem.idPackage), isForSteps)); dispatch(updateOrderTotalPrice(response.data.cartItems)); } }).catch(error => { client.onError(error, dispatch); }); } } const updateOrderTotalPrice = (cartItems) => ({type: RECEIVE_ORDER_TOTAL_PRICE, cartItems}); const updateCartItems = (newItem)=>( {type: UPDATE_CART_ITEMS, newItem} ); export const updateQuantity = (cartItem, quantity, updateCartAllItems) => { const params = { idPackage: cartItem.idPackage || 0, idCustomerInstance: cartItem.idCustomerInstance || 0, idPrice: cartItem.idPrice || 0, quantity }; return dispatch => { return client.fetch({ url: `${API_SERVER}/cart/api/updateQuantity`, method: 'post', data: params }).then(response => { if (typeof response.data !== 'undefined' && 'messages' in response.data) { const filteredMessages = response.data.messages.filter(message => { return message.code === 'error'; }); if(filteredMessages.length > 0){ dispatch(updateMessages(filteredMessages, cartMessages)); }else{ cartItem.quantity = quantity; dispatch(updateCartItems(cartItem)); } } }).catch(error => { client.onError(error, dispatch); }); } } export const removeCartItem = (idCart) => { return dispatch => { return client.fetch({ url: `${API_SERVER}/cart/api/removeFromCart`, method: 'post', data: {idCart} }).then(response => { if (typeof response.data !== 'undefined' && 'messages' in response.data) { dispatch(updateMessages(response.data.messages, cartMessages)); response.data.messages.forEach(messageObject => { if (messageObject.code === 'success') { dispatch(fetchCartCount()); dispatch(fetchCartItems(true)); } }) } }).catch(error => { client.onError(error, dispatch); }); } } const getSteps = (whitoutUploadDoc) => { const newSteps = Object.assign({}, cartSteps()); if(whitoutUploadDoc) { delete newSteps.cartUploadDocuments; newSteps.cartCustomerDetails.previous = null; newSteps.cartCustomerDetails.status = 'active'; } return { type: LOAD_CART_STEPS, cartSteps: newSteps }; }; export const loadSteps = (whitoutUploadDoc) => { const firstStep = whitoutUploadDoc ? 'cartCustomerDetails' : 'cartUploadDocuments'; return dispatch => { dispatch(getSteps(whitoutUploadDoc)); dispatch(selectStep(firstStep)); dispatch(resetSteps()); dispatch(setCartItemsDisabled(false)); } } export const selectStep = (step, params={}) => { return {type: SET_CURRENT_STEP, currentStep: step, params}; } const resetSteps = () => ({type: RESET_STEPS}); export const getCustomerDetails = () => { return dispatch => { return client.fetch({url: `${API_SERVER}/cart/api/getCustomerDetails`}) .then(response => { if (typeof response.data !== 'undefined' && response.data.customerDetails) { const customerDetails = response.data.customerDetails; dispatch(receiveCustomerDetails(customerDetails)); } }).catch(error => { client.onError(error, dispatch); }); } } export const nextStep = (step) => ({type: GO_TO_NEXT_STEP}); export const previousStep = (params) => ({type: GO_TO_PREVIOUS_STEP, params}); export const uploadDocumnet = () => ({type: UPLOAD_DOCUMENT}); export const uploadOrderDocument = (idPackage, idDocumentType, file, packages) => { return dispatch => { dispatch(uploadDocumnet()); return client.uploadFile(file, { url: `${API_SERVER}/cart/api/uploadOrderDocument`, data: { idDocumentType, idPackage } }).then(response => { if (typeof response.data !== 'undefined' && 'messages' in response.data) { dispatch(updateMessages(response.data.messages, cartMessages)); dispatch(fetchCartDocuments(packages)); } }).catch(error => { client.onError(error, dispatch); }); } } export const badFile = () =>{ return dispatch => { dispatch(updateMessages([{code: 'warning', message: 'INVALID_FILE'}], cartMessages)); } } export const requestCartDocuments = () => ({ type: REQUEST_CART_DOCUMENTS, isLoading: true }); export const receiveCartDocuments = (json) => ({ type: RECEIVE_CART_DOCUMENTS, isLoading: false, cartDocuments: json }); export const fetchCartDocuments = (packages, isForSteps = false) => { return dispatch => { dispatch(requestCartDocuments()); return client.fetch({ url: `${API_SERVER}/cart/api/getCartDocuments`, method: 'post', data: {packages} }).then(response => { if (response.data) { dispatch(receiveCartDocuments(response.data)); if(isForSteps) { const whitoutUploadDoc = response.data.templates.length === 0; dispatch(loadSteps(whitoutUploadDoc)); } } }).catch(error => { client.onError(error, dispatch); }); } } export const selectCountryDelivery = (country) => ({type: SELECT_COUNTRY_DELIVERY, selectedCountryDelivery: country}); export const selectCountryBilling = (country) => ({type: SELECT_COUNTRY_BILLING, selectedCountryBilling: country}); export const saveOrderDetails = (orderDetails, cartItems) => { const orderInfo = {orderDetails, cartItems}; return dispatch => { return client.fetch({ url: `${API_SERVER}/cart/api/saveOrderDetails`, method: 'post', data: {orderDetails, cartItems} }).then(response => { if (typeof response.data !== 'undefined' && 'messages' in response.data) { dispatch(getCustomerDetails()); dispatch(setOrderInfo(orderInfo)); } }).catch(error => { client.onError(error, dispatch); }); } } export const setOrderInfo = (info) => ({type: SET_ORDER_INFO, orderInfo: info}); export const setOrderPlacedFlag = (flag) => ({type: SET_ORDER_PLACED, orderPlaced: flag}); export const setOrderPlacedRedirectFlag = (flag) => ({type: SET_ORDER_PLACED_REDIRECT, orderPlacedRedirect: flag}); export const placeOrder = (orderInfo) => { const {orderDetails, cartItems} = orderInfo; return dispatch => { return client.fetch({ url: `${API_SERVER}/cart/api/placeOrder`, method: 'post', data: {orderDetails, cartItems} }).then(response => { if (typeof response.data !== 'undefined' && 'messages' in response.data) { dispatch(updateMessages(response.data.messages, cartMessages)); if(!checkIfErrorMessageExists(response.data.messages)) { dispatch(fetchCartCount()); dispatch(setOrderPlacedFlag(true)); dispatch(setOrderPlacedRedirectFlag(true)); } } }).catch(error => { client.onError(error, dispatch); }); } } const checkIfErrorMessageExists = (messagesArray) => { return messagesArray.some(messageObj => { return messageObj.code === 'error'; }); } export const setCartItemsDisabled = (flag) => ({type: IS_CART_ITEMS_DISABLED, isCartItemsDisabled: flag}); export const setNextActionFct = (fct) => ({type: SET_NEXT_STEP, nextStepAction: fct}); export const setPrevActionFct = (fct) => ({type: SET_PREV_STEP, prevStepAction: fct});