import { SET_CART, PUSH_TO_CART, PULL_FROM_CART, SET_CART_TOTAL, SET_ITEM_TO_DISCOUNT, SET_ITEM_PRICE } from '@/constants/mutationTypes' import { ADD_TO_CART, DECREASE_FROM_CART, CHANGE_PRICE, APPLY_PRICE, REMOVE_FROM_CART, CHANGE_CART_TOTAL, RESET_CART } from '@/constants/actionTypes' const initialState = { cartItems: [], cartTotal: 0, itemToDiscount: null } const state = { cartItems: initialState.cartItems, cartTotal: initialState.cartTotal, itemToDiscount: null } const getters = { /** * * @param {*} state */ cartItems(state) { return state.cartItems }, /** * * @param {*} state */ cartTotal(state) { return state.cartTotal }, /** * * @param {*} state */ itemToDiscount(state) { return state.itemToDiscount } } const mutations = { /** * * @param {*} state * @param {*} payload */ [SET_CART] (state, payload) { state.cartItems = payload }, /** * * @param {*} state * @param {*} payload */ [PUSH_TO_CART] (state, payload) { let productFound = state.cartItems.find(item => item.id === payload.id) if (productFound) { if (payload.quantity > 1) { if (productFound.quantity === payload.quantity) { productFound.quantity = productFound.quantity + 1 } else { productFound.quantity = payload.quantity } } else { productFound.quantity = productFound.quantity + payload.quantity } return } state.cartItems = [payload, ...state.cartItems] }, /** * * @param {*} state * @param {*} payload */ [PULL_FROM_CART] (state, payload) { let productFoundIndex = state.cartItems.findIndex(item => item.id === payload.item.id) if (state.cartItems[productFoundIndex].quantity === 1) { payload.mode = 'full' } if (payload.mode === 'partial') { if (payload.item.quantity !== -1) { state.cartItems[productFoundIndex].quantity = payload.item.quantity } else { state.cartItems[productFoundIndex].quantity = state.cartItems[productFoundIndex].quantity - 1 } } else { state.cartItems.splice(productFoundIndex, 1) } }, /** * * @param {*} state * @param {*} payload */ [SET_CART_TOTAL] (state, payload) { state.cartTotal = payload }, /** * * @param {*} state * @param {*} payload */ [SET_ITEM_TO_DISCOUNT] (state, payload) { state.itemToDiscount = payload }, /** * * @param {*} state * @param {*} payload */ [SET_ITEM_PRICE] (state, payload) { let foundProduct = state.cartItems.find(item => item.id === state.itemToDiscount.id) foundProduct.price = payload } } const actions = { /** * * @param {*} param0 * @param {*} payload */ [ADD_TO_CART] ({ commit }, payload) { commit(PUSH_TO_CART, payload) }, /** * * @param {*} param0 * @param {*} payload */ [DECREASE_FROM_CART] ({ commit }, payload) { commit(PULL_FROM_CART, { item: payload, mode: 'partial' }) }, /** * * @param {*} param0 * @param {*} payload */ [CHANGE_PRICE] ({ commit }, payload) { commit(SET_ITEM_TO_DISCOUNT, payload) }, /** * * @param {*} param0 * @param {*} payload */ [APPLY_PRICE] ({ commit }, payload) { if (payload) { commit(SET_ITEM_PRICE, payload) } commit(SET_ITEM_TO_DISCOUNT, null) }, /** * * @param {*} param0 * @param {*} payload */ [REMOVE_FROM_CART] ({ commit }, payload) { commit(PULL_FROM_CART, { item: payload, mode: 'full' }) }, /** * * @param {*} param0 * @param {*} payload */ [CHANGE_CART_TOTAL] ({ commit }, payload) { commit(SET_CART_TOTAL, payload) }, /** * * @param {*} param0 * @param {*} payload */ [RESET_CART] ({ commit }) { commit(SET_CART, []) commit(SET_CART_TOTAL, 0) } } export default { state, getters, mutations, actions }