You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.4 KiB
99 lines
2.4 KiB
import React from 'react'
|
|
import { View, ScrollView } from '@tarojs/components'
|
|
import CouponCard, { CouponCardProps } from './CouponCard'
|
|
|
|
export interface CouponListProps {
|
|
/** 优惠券列表数据 */
|
|
coupons: CouponCardProps[]
|
|
/** 列表标题 */
|
|
title?: string
|
|
/** 布局方式:vertical-垂直布局 horizontal-水平滚动 */
|
|
layout?: 'vertical' | 'horizontal'
|
|
/** 是否显示空状态 */
|
|
showEmpty?: boolean
|
|
/** 空状态文案 */
|
|
emptyText?: string
|
|
/** 优惠券点击事件 */
|
|
onCouponClick?: (coupon: CouponCardProps, index: number) => void
|
|
}
|
|
|
|
const CouponList: React.FC<CouponListProps> = ({
|
|
coupons = [],
|
|
title,
|
|
layout = 'vertical',
|
|
showEmpty = true,
|
|
emptyText = '暂无优惠券',
|
|
onCouponClick
|
|
}) => {
|
|
const handleCouponClick = (coupon: CouponCardProps, index: number) => {
|
|
onCouponClick?.(coupon, index)
|
|
}
|
|
|
|
// 垂直布局
|
|
if (layout === 'vertical') {
|
|
return (
|
|
<View className="p-4">
|
|
{title && (
|
|
<View className="text-lg font-semibold text-gray-800 mb-4">{title}</View>
|
|
)}
|
|
|
|
{coupons.length === 0 ? (
|
|
showEmpty && (
|
|
<View className="text-center py-10 px-5 text-gray-500 text-sm">
|
|
{emptyText}
|
|
</View>
|
|
)
|
|
) : (
|
|
coupons.map((coupon, index) => (
|
|
<View
|
|
key={index}
|
|
onClick={() => handleCouponClick(coupon, index)}
|
|
>
|
|
<CouponCard {...coupon} />
|
|
</View>
|
|
))
|
|
)}
|
|
</View>
|
|
)
|
|
}
|
|
|
|
// 水平滚动布局
|
|
return (
|
|
<View>
|
|
{title && (
|
|
<View className="text-lg font-semibold text-gray-800 mb-4 pl-4">
|
|
{title}
|
|
</View>
|
|
)}
|
|
|
|
{coupons.length === 0 ? (
|
|
showEmpty && (
|
|
<View className="text-center py-10 px-5 text-gray-500 text-sm">
|
|
{emptyText}
|
|
</View>
|
|
)
|
|
) : (
|
|
<ScrollView
|
|
scrollX
|
|
className="flex p-4 gap-2 overflow-x-auto"
|
|
showScrollbar={false}
|
|
style={{
|
|
WebkitOverflowScrolling: 'touch'
|
|
}}
|
|
>
|
|
{coupons.map((coupon, index) => (
|
|
<View
|
|
key={index}
|
|
className="flex-shrink-0 w-60 mb-0"
|
|
onClick={() => handleCouponClick(coupon, index)}
|
|
>
|
|
<CouponCard {...coupon} />
|
|
</View>
|
|
))}
|
|
</ScrollView>
|
|
)}
|
|
</View>
|
|
)
|
|
}
|
|
|
|
export default CouponList
|