114 lines
2.9 KiB
TypeScript
114 lines
2.9 KiB
TypeScript
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
|
|
}
|
|
})
|