import { defineStore } from 'pinia'; import ProductType from '~~/types/productType'; export const useCartStore = defineStore('cart', { state: () => ({ cart_products: [] as ProductType[], orderQuantity: 1 as number, quantityCount: 0 as number, total: 0 as number, }), actions: { // add_cart_product add_cart_product(payload: ProductType) { const isExist = this.cart_products.some((i) => i.id === payload.id); if (!isExist) { const newItem = { ...payload, orderQuantity: 1, }; this.cart_products.push(newItem); useNuxtApp().$toast.success(`${payload.title} added to cart`); } else { this.cart_products.map((item) => { if (item.id === payload.id) { if (typeof item.orderQuantity !== 'undefined') { if (item.quantity >= item.orderQuantity + this.orderQuantity) { item.orderQuantity = this.orderQuantity !== 1 ? this.orderQuantity + item.orderQuantity : item.orderQuantity + 1; useNuxtApp().$toast.success(`${this.orderQuantity} ${item.title} added to cart`); } else { useNuxtApp().$toast.error(`No more quantity available for this product!`); this.orderQuantity = 1; } } } return { ...item }; }); } localStorage.setItem('cart_products', JSON.stringify(this.cart_products)); }, // quantityDecrement quantityDecrement(payload: ProductType) { this.cart_products.map((item) => { if (item.id === payload.id) { if(typeof item.orderQuantity !== 'undefined'){ if (item.orderQuantity > 1) { item.orderQuantity = item.orderQuantity - 1; } } } return { ...item }; }); localStorage.setItem('cart_products', JSON.stringify(this.cart_products)); }, // remover_cart_products remover_cart_products (payload: ProductType){ this.cart_products = this.cart_products.filter(p => p.id !== payload.id) useNuxtApp().$toast.error(`${payload.title} remove to cart`); localStorage.setItem('cart_products', JSON.stringify(this.cart_products)); }, clear_cart () { const confirmMsg = window.confirm('Are you sure deleted your all cart items ?'); if(confirmMsg){ this.cart_products = []; } localStorage.setItem('cart_products', JSON.stringify(this.cart_products)); }, initialOrderQuantity(){ this.orderQuantity = 1 } }, getters: { totalPriceQuantity: (state) => { return state.cart_products.reduce((cartTotal, cartItem) => { const { price, orderQuantity } = cartItem; if(typeof orderQuantity !== 'undefined'){ const itemTotal = price * orderQuantity; cartTotal.quantity += orderQuantity; cartTotal.total += itemTotal; } return cartTotal; }, { total: 0, quantity: 0, }) }, get_cart_products:(state) => { if (process.client) { const data = localStorage.getItem('cart_products'); if (data) { return state.cart_products = JSON.parse(data); } else { localStorage.setItem('cart_products', JSON.stringify([])); return state.cart_products = []; } } else { return state.cart_products; } } } })