import React, { useEffect, useMemo } from 'react' import { View, Text, ScrollView } from '@tarojs/components' import type { ShopUserCoupon } from '@/api/shop/shopUserCoupon/model' interface CouponSelectProps { visible: boolean coupons: ShopUserCoupon[] minAmount?: number selectedCouponId?: string onClose: () => void onSelect: (coupon: ShopUserCoupon | null) => void } const CouponSelect: React.FC = ({ visible, coupons, minAmount = 0, selectedCouponId, onClose, onSelect, }) => { const [showOverlay, setShowOverlay] = React.useState(false) const [slideUp, setSlideUp] = React.useState(false) // 控制动画 React.useEffect(() => { if (visible) { setShowOverlay(true) setTimeout(() => setSlideUp(true), 10) } else { setSlideUp(false) setTimeout(() => setShowOverlay(false), 300) } }, [visible]) const handleClose = () => { setSlideUp(false) setTimeout(() => { setShowOverlay(false) onClose() }, 300) } const handleSelect = (coupon: ShopUserCoupon | null) => { handleClose() onSelect(coupon) } const availableCoupons = useMemo(() => { return coupons.filter(c => { if (c.status !== 0 && c.status !== undefined) return false if (c.endTime && new Date(c.endTime) < new Date()) return false return (Number(c.minPrice) || 0) <= minAmount }) }, [coupons, minAmount]) if (!showOverlay) return null return ( {/* 遮罩层 */} {/* 弹窗内容 */} {/* 关闭按钮 */} × 选择优惠券 handleSelect(null)} > 不使用优惠券 {availableCoupons.length === 0 ? ( 暂无可用优惠券 ) : ( {availableCoupons.map((coupon) => { const isSelected = selectedCouponId === coupon.id return ( handleSelect(coupon)} > {coupon.type === 20 ? ( {coupon.discount || 0}折 {coupon.minPrice && Number(coupon.minPrice) > 0 ? `满${coupon.minPrice}可用` : '无门槛'} ) : coupon.type === 50 ? ( {coupon.useCount && coupon.useCount > 0 ? `${coupon.useCount}次` : '不限次'} {coupon.useDuration && coupon.useDuration > 0 ? `${coupon.useDuration}分钟` : '场地使用'} ) : ( ¥ {coupon.reducePrice || 0} {coupon.type === 40 ? '无门槛' : (coupon.minPrice && Number(coupon.minPrice) > 0 ? `满${coupon.minPrice}可用` : '无门槛')} )} {coupon.name || coupon.description || '优惠券'} {coupon.startTime?.slice(0, 10)} ~ {coupon.endTime?.slice(0, 10)} {isSelected && ( {'✓'} )} ) })} )} ) } export default CouponSelect