Files
market_page/miniprogram/src/utils/cart.ts
jeremygan2021 96d5598fb5 vb
2026-02-11 03:00:38 +08:00

91 lines
2.1 KiB
TypeScript

import Taro from '@tarojs/taro'
const CART_KEY = 'MARKET_CART'
export interface CartItem {
id: number
name: string
price: number
image: string
quantity: number
selected: boolean
stock: number
description: string
}
export const getCart = (): CartItem[] => {
return Taro.getStorageSync(CART_KEY) || []
}
export const setCart = (cart: CartItem[]) => {
Taro.setStorageSync(CART_KEY, cart)
}
export const addToCart = (product: any, quantity: number = 1) => {
const cart = getCart()
const existing = cart.find(item => item.id === product.id)
if (existing) {
existing.quantity += quantity
if (existing.quantity > product.stock) existing.quantity = product.stock
} else {
cart.push({
id: product.id,
name: product.name,
price: product.price,
image: product.static_image_url || product.detail_image_url,
quantity: quantity,
selected: true,
stock: product.stock,
description: product.description
})
}
setCart(cart)
Taro.showToast({ title: '已加入购物车', icon: 'success' })
}
export const updateQuantity = (id: number, quantity: number) => {
const cart = getCart()
const item = cart.find(i => i.id === id)
if (item) {
item.quantity = quantity
if (item.quantity > item.stock) item.quantity = item.stock
if (item.quantity < 1) item.quantity = 1
setCart(cart)
}
return cart
}
export const removeItem = (id: number) => {
const cart = getCart()
const newCart = cart.filter(i => i.id !== id)
setCart(newCart)
return newCart
}
export const toggleSelect = (id: number) => {
const cart = getCart()
const item = cart.find(i => i.id === id)
if (item) {
item.selected = !item.selected
setCart(cart)
}
return cart
}
export const toggleSelectAll = (selected: boolean) => {
const cart = getCart()
cart.forEach(item => item.selected = selected)
setCart(cart)
return cart
}
export const getSelectedItems = () => {
return getCart().filter(item => item.selected)
}
export const getCartCount = () => {
return getCart().reduce((sum, item) => sum + item.quantity, 0)
}