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'; import { fromWCCartItems } from '../../helpers/CartHelper'; 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 => { dispatch(requestShopCartCount()); return client.fetch({url: `${API_SERVER}/wp-json/wiaas/cart/count`}).then(response => { if (typeof response.data !== 'undefined' && 'count' in response.data) { dispatch(receiveShopCartCount(response.data.count)); } }).catch(error => { client.onError(error, dispatch); }); } } export const fetchCartItems = (isForSteps = false) => { return dispatch => { dispatch(requestShopCartItems()); return client.fetch({url: `${API_SERVER}/wp-json/wiaas/cart/items`}).then(response => { if (typeof response.data !== 'undefined' && 'items' in response.data) { const cartItems = response.data.items.map(wcCartItem => fromWCCartItems(wcCartItem)); dispatch(receiveShopCartItems(cartItems)); dispatch(fetchCartDocuments(cartItems.map((cartItem) => cartItem.idPackage), isForSteps)); dispatch(updateOrderTotalPrice(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) => { return dispatch => { return client.fetch({ url: `${API_SERVER}/wp-json/wiaas/cart/items/${cartItem.key}`, method: 'post', data: { quantity } }).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 = (cartItemKey) => { return dispatch => { return client.fetch({ url: `${API_SERVER}/wp-json/wiaas/cart/items/${cartItemKey}`, method: 'delete', }).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 => { dispatch(receiveCustomerDetails({ "companyName": "Coor Service Management AB", "vatCode": "556084-6783", "details": { "idBillingAddress": null, "idDeliveryAddress": null, "idProject": null, "reference": null, "tender": null }, "billing": [ { "id": 1, "city": "Göteborg", "countryName": "SE", "detailedAddress": "Lilla Bommen 2", "firstName": "Customer", "lastName": "User", "zipCode": "12323" } ], "deliveryAddresses": [ { "id": 1, "city": "Göteborg", "countryName": "Göteborg", "detailedAddress": "Lilla Bommen 2", "zipCode": "12323" } ] })); // return client.fetch({url: `${API_SERVER}/wp-json/wiaas/cart/customer-details`}) // .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 = (packageCartKey, idDocumentType, file, packages) => { return dispatch => { dispatch(uploadDocumnet()); return client.uploadFile(file, { url: `${API_SERVER}/wp-json/wiaas/cart/documents`, data: { 'doc_type': idDocumentType, 'package_key': packageCartKey } }).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}/wp-json/wiaas/cart/documents`, method: 'get', 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 => { dispatch(getCustomerDetails()); dispatch(setOrderInfo(orderInfo)); // 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}/wp-json/wiaas/cart/checkout`, method: 'post', data: { vat: orderDetails.vatCode, company: orderDetails.companyName, reference: orderDetails.details.reference, tender: orderDetails.details.tender, project_id: orderDetails.details.idProject, delivery_address_id: orderDetails.delivery.id, billing_address_id: orderDetails.billing.id, } }).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});