first commit
This commit is contained in:
129
lib/cart.ts
Normal file
129
lib/cart.ts
Normal file
@@ -0,0 +1,129 @@
|
||||
interface CartItem {
|
||||
id: string
|
||||
name: string
|
||||
price: number
|
||||
quantity: number
|
||||
image: string | null
|
||||
}
|
||||
|
||||
interface Product {
|
||||
id: string
|
||||
name: string
|
||||
price: number
|
||||
discount: number
|
||||
images: string[]
|
||||
stock: number
|
||||
}
|
||||
|
||||
class CartManager {
|
||||
private cartKey = 'shopping-cart'
|
||||
|
||||
private getDiscountedPrice(price: number, discount: number): number {
|
||||
return price - (price * discount / 100)
|
||||
}
|
||||
|
||||
getCart(): CartItem[] {
|
||||
if (typeof window === 'undefined') return []
|
||||
|
||||
try {
|
||||
const cart = localStorage.getItem(this.cartKey)
|
||||
return cart ? JSON.parse(cart) : []
|
||||
} catch (error) {
|
||||
console.error('Error getting cart:', error)
|
||||
return []
|
||||
}
|
||||
}
|
||||
|
||||
saveCart(cart: CartItem[]): void {
|
||||
if (typeof window === 'undefined') return
|
||||
|
||||
try {
|
||||
localStorage.setItem(this.cartKey, JSON.stringify(cart))
|
||||
// Dispatch custom event to notify components about cart updates
|
||||
window.dispatchEvent(new CustomEvent('cartUpdated', { detail: cart }))
|
||||
} catch (error) {
|
||||
console.error('Error saving cart:', error)
|
||||
}
|
||||
}
|
||||
|
||||
addToCart(product: Product, quantity: number = 1): boolean {
|
||||
if (product.stock < quantity) {
|
||||
return false
|
||||
}
|
||||
|
||||
const cart = this.getCart()
|
||||
const existingItemIndex = cart.findIndex(item => item.id === product.id)
|
||||
|
||||
if (existingItemIndex >= 0) {
|
||||
const newQuantity = cart[existingItemIndex].quantity + quantity
|
||||
if (newQuantity > product.stock) {
|
||||
return false
|
||||
}
|
||||
cart[existingItemIndex].quantity = newQuantity
|
||||
} else {
|
||||
cart.push({
|
||||
id: product.id,
|
||||
name: product.name,
|
||||
price: this.getDiscountedPrice(product.price, product.discount),
|
||||
quantity,
|
||||
image: product.images[0] || null
|
||||
})
|
||||
}
|
||||
|
||||
this.saveCart(cart)
|
||||
return true
|
||||
}
|
||||
|
||||
removeFromCart(productId: string): void {
|
||||
const cart = this.getCart()
|
||||
const updatedCart = cart.filter(item => item.id !== productId)
|
||||
this.saveCart(updatedCart)
|
||||
}
|
||||
|
||||
updateQuantity(productId: string, quantity: number): boolean {
|
||||
if (quantity <= 0) {
|
||||
this.removeFromCart(productId)
|
||||
return true
|
||||
}
|
||||
|
||||
const cart = this.getCart()
|
||||
const itemIndex = cart.findIndex(item => item.id === productId)
|
||||
|
||||
if (itemIndex >= 0) {
|
||||
cart[itemIndex].quantity = quantity
|
||||
this.saveCart(cart)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
clearCart(): void {
|
||||
this.saveCart([])
|
||||
}
|
||||
|
||||
getTotalPrice(): number {
|
||||
const cart = this.getCart()
|
||||
return cart.reduce((total, item) => total + (item.price * item.quantity), 0)
|
||||
}
|
||||
|
||||
// Add alias for compatibility
|
||||
getCartTotal(): number {
|
||||
return this.getTotalPrice()
|
||||
}
|
||||
|
||||
getTotalItems(): number {
|
||||
const cart = this.getCart()
|
||||
return cart.reduce((total, item) => total + item.quantity, 0)
|
||||
}
|
||||
|
||||
getItemCount(): number {
|
||||
return this.getCart().length
|
||||
}
|
||||
|
||||
getCartCount(): number {
|
||||
const cart = this.getCart()
|
||||
return cart.reduce((total, item) => total + item.quantity, 0)
|
||||
}
|
||||
}
|
||||
|
||||
export const cartManager = new CartManager()
|
||||
Reference in New Issue
Block a user