fix: page Cart
This commit is contained in:
113
bo/src/stores/cart.ts
Normal file
113
bo/src/stores/cart.ts
Normal file
@@ -0,0 +1,113 @@
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, computed } from 'vue'
|
||||
|
||||
export interface CartItem {
|
||||
id: number
|
||||
productId: number
|
||||
name: string
|
||||
image: string
|
||||
price: number
|
||||
quantity: number
|
||||
}
|
||||
|
||||
export interface DeliveryMethod {
|
||||
id: number
|
||||
name: string
|
||||
price: number
|
||||
description: string
|
||||
}
|
||||
|
||||
export const useCartStore = defineStore('cart', () => {
|
||||
const items = ref<CartItem[]>([])
|
||||
const selectedAddressId = ref<number | null>(null)
|
||||
const selectedDeliveryMethodId = ref<number | null>(null)
|
||||
const shippingCost = ref(0)
|
||||
const vatRate = ref(0.23) // 23% VAT
|
||||
|
||||
const deliveryMethods = ref<DeliveryMethod[]>([
|
||||
{ id: 1, name: 'Standard Delivery', price: 0, description: '5-7 business days' },
|
||||
{ id: 2, name: 'Express Delivery', price: 15, description: '2-3 business days' },
|
||||
{ id: 3, name: 'Priority Delivery', price: 30, description: 'Next business day' }
|
||||
])
|
||||
|
||||
function initMockData() {
|
||||
items.value = [
|
||||
{ id: 1, productId: 101, name: 'Premium Widget Pro', image: '/img/product-1.jpg', price: 129.99, quantity: 2 },
|
||||
{ id: 2, productId: 102, name: 'Ultra Gadget X', image: '/img/product-2.jpg', price: 89.50, quantity: 1 },
|
||||
{ id: 3, productId: 103, name: 'Mega Tool Set', image: '/img/product-3.jpg', price: 249.00, quantity: 3 }
|
||||
]
|
||||
}
|
||||
|
||||
const productsTotal = computed(() => {
|
||||
return items.value.reduce((sum, item) => sum + (item.price * item.quantity), 0)
|
||||
})
|
||||
|
||||
const vatAmount = computed(() => {
|
||||
return productsTotal.value * vatRate.value
|
||||
})
|
||||
|
||||
const orderTotal = computed(() => {
|
||||
return productsTotal.value + shippingCost.value + vatAmount.value
|
||||
})
|
||||
|
||||
const itemCount = computed(() => {
|
||||
return items.value.reduce((sum, item) => sum + item.quantity, 0)
|
||||
})
|
||||
|
||||
function updateQuantity(itemId: number, quantity: number) {
|
||||
const item = items.value.find(i => i.id === itemId)
|
||||
if (item) {
|
||||
if (quantity <= 0) {
|
||||
removeItem(itemId)
|
||||
} else {
|
||||
item.quantity = quantity
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function removeItem(itemId: number) {
|
||||
const index = items.value.findIndex(i => i.id === itemId)
|
||||
if (index !== -1) {
|
||||
items.value.splice(index, 1)
|
||||
}
|
||||
}
|
||||
|
||||
function clearCart() {
|
||||
items.value = []
|
||||
selectedAddressId.value = null
|
||||
selectedDeliveryMethodId.value = null
|
||||
shippingCost.value = 0
|
||||
}
|
||||
|
||||
function setSelectedAddress(addressId: number | null) {
|
||||
selectedAddressId.value = addressId
|
||||
}
|
||||
|
||||
function setDeliveryMethod(methodId: number) {
|
||||
selectedDeliveryMethodId.value = methodId
|
||||
const method = deliveryMethods.value.find(m => m.id === methodId)
|
||||
if (method) {
|
||||
shippingCost.value = method.price
|
||||
}
|
||||
}
|
||||
|
||||
initMockData()
|
||||
|
||||
return {
|
||||
items,
|
||||
selectedAddressId,
|
||||
selectedDeliveryMethodId,
|
||||
shippingCost,
|
||||
vatRate,
|
||||
deliveryMethods,
|
||||
productsTotal,
|
||||
vatAmount,
|
||||
orderTotal,
|
||||
itemCount,
|
||||
updateQuantity,
|
||||
removeItem,
|
||||
clearCart,
|
||||
setSelectedAddress,
|
||||
setDeliveryMethod
|
||||
}
|
||||
})
|
||||
Reference in New Issue
Block a user