import {useEffect, useState} from "react"; import Taro, {useShareAppMessage, useShareTimeline} from '@tarojs/taro'; import { NavBar, Checkbox, Image, InputNumber, Button, Empty, Divider } from '@nutui/nutui-react-taro'; import {ArrowLeft, Del, Shopping} from '@nutui/icons-react-taro'; import {View} from '@tarojs/components'; import {CartItem, useCart} from "@/hooks/useCart"; function Cart() { const [statusBarHeight, setStatusBarHeight] = useState(0); const [selectedItems, setSelectedItems] = useState([]); const [isAllSelected, setIsAllSelected] = useState(false); const { cartItems, cartCount, updateQuantity, removeFromCart, clearCart } = useCart(); useShareTimeline(() => { return { title: '购物车 - 网宿小店' }; }); useShareAppMessage(() => { return { title: '购物车 - 网宿小店', success: function (res) { console.log('分享成功', res); }, fail: function (res) { console.log('分享失败', res); } }; }); useEffect(() => { Taro.getSystemInfo({ success: (res) => { setStatusBarHeight(res.statusBarHeight || 0); }, }); // 设置导航栏背景色 Taro.setNavigationBarColor({ backgroundColor: '#ffffff', frontColor: 'black', }); }, []); // 处理单个商品选择 const handleItemSelect = (goodsId: number, checked: boolean) => { if (checked) { setSelectedItems([...selectedItems, goodsId]); } else { setSelectedItems(selectedItems.filter(id => id !== goodsId)); setIsAllSelected(false); } }; // 处理全选 const handleSelectAll = (checked: boolean) => { setIsAllSelected(checked); if (checked) { setSelectedItems(cartItems.map((item: CartItem) => item.goodsId)); } else { setSelectedItems([]); } }; // 更新商品数量 const handleQuantityChange = (goodsId: number, value: number) => { updateQuantity(goodsId, value); }; // 删除商品 const handleRemoveItem = (goodsId: number) => { Taro.showModal({ title: '确认删除', content: '确定要删除这个商品吗?', success: (res) => { if (res.confirm) { removeFromCart(goodsId); setSelectedItems(selectedItems.filter(id => id !== goodsId)); } } }); }; // 计算选中商品的总价 const getSelectedTotalPrice = () => { return cartItems .filter((item: CartItem) => selectedItems.includes(item.goodsId)) .reduce((total: number, item: CartItem) => total + (parseFloat(item.price) * item.quantity), 0) .toFixed(2); }; // 去结算 const handleCheckout = () => { if (selectedItems.length === 0) { Taro.showToast({ title: '请选择要结算的商品', icon: 'none' }); return; } // 获取选中的商品 const selectedCartItems = cartItems.filter((item: CartItem) => selectedItems.includes(item.goodsId) ); // 将选中的商品信息存储到本地,供结算页面使用 Taro.setStorageSync('checkout_items', JSON.stringify(selectedCartItems)); // 跳转到购物车结算页面 Taro.navigateTo({ url: '/shop/orderConfirmCart/index' }); }; // 检查是否全选 useEffect(() => { if (cartItems.length > 0 && selectedItems.length === cartItems.length) { setIsAllSelected(true); } else { setIsAllSelected(false); } }, [selectedItems, cartItems]); return ( <> Taro.navigateBack()}/>} right={ cartItems.length > 0 && ( ) } > 购物车({cartCount}) {/* 购物车内容 */} {cartItems.length === 0 ? ( // 空购物车 } description="购物车空空如也" > ) : ( <> {/* 商品列表 */} {cartItems.map((item: CartItem, index: number) => ( {/* 选择框 */} handleItemSelect(item.goodsId, checked)} /> {/* 商品图片 */} {/* 商品信息 */} {item.name} {item.price} handleQuantityChange(item.goodsId, Number(value))} className="w-24" /> handleRemoveItem(item.goodsId)}/> {index < cartItems.length - 1 && } ))} {/* 底部结算栏 */} 全选 已选 {selectedItems.length} 件 合计:
{getSelectedTotalPrice()}
{/* 底部安全区域占位 */} )}
); } export default Cart;