61 lines
2.1 KiB
JavaScript
61 lines
2.1 KiB
JavaScript
export const useCartStore = defineStore('cart', {
|
|
state: () => {
|
|
return {
|
|
items: [],
|
|
loading: false
|
|
}
|
|
},
|
|
getters: {
|
|
count: (state) => state.items.reduce((sum, item) => sum + item.quantity, 0) || 0,
|
|
find: (state) => (id) => state.items.find((item) => item.product?.id == id)
|
|
},
|
|
actions: {
|
|
async get() {
|
|
const { status, data } = await useFetch('/api/users/current/cart', {
|
|
headers: { Authorization: useCookie('token') }
|
|
})
|
|
|
|
if (status.value == 'success') {
|
|
this.items = data.value.cart
|
|
}
|
|
},
|
|
async clear() {
|
|
const { status } = await useFetch('/api/users/cart', {
|
|
headers: { Authorization: useCookie('token') }, method: 'delete', body: {}
|
|
})
|
|
|
|
if (status.value == 'success') {
|
|
this.items = []
|
|
}
|
|
},
|
|
async update(product, quantity = 0) {
|
|
this.loading = true
|
|
const cart = { product }
|
|
if (quantity > 0) {
|
|
//update
|
|
let item = this.find(product)
|
|
if (item) item.quantity = quantity
|
|
|
|
cart.quantity = quantity
|
|
const { status, data } = await useFetch('/api/users/cart', {
|
|
headers: { Authorization: useCookie('token') }, method: 'put', body: { cart }
|
|
})
|
|
if (status.value == 'success') {
|
|
const temp = { product: data.value, quantity }
|
|
if (item) item = temp
|
|
else this.items.push(temp)
|
|
}
|
|
} else {
|
|
//remove
|
|
const { status } = await useFetch('/api/users/cart', {
|
|
headers: { Authorization: useCookie('token') }, method: 'patch', body: { cart }
|
|
})
|
|
if (status.value == 'success') {
|
|
this.items = this.items.filter((item) => item.product.id != product)
|
|
}
|
|
}
|
|
this.loading = false
|
|
}
|
|
}
|
|
})
|