import { useEffect, useRef, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import BrandLogo from '@dukang/shared-ui/BrandLogo'; import { request } from '../lib/api'; type BenefitSummary = { totalBalance: number; maxRedeemAmount: number; activeCouponCount: number; }; type CouponItem = { id: string; couponNo: string; totalAmount: number; usedAmount: number; balance: number; status: string; sourceProduct: string; }; function formatMoney(amount: number) { return amount.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } function formatCouponNo(no: string) { const tail = no.replace(/^BC/i, '').slice(-6); return `NO. DK${tail}`; } function usagePercent(coupon: CouponItem) { const total = Number(coupon.totalAmount); if (total <= 0) return 0; return Math.min(100, Math.round((Number(coupon.usedAmount) / total) * 100)); } function buildRedeemUrl(coupon?: CouponItem) { if (!coupon) return '/redeem'; const params = new URLSearchParams({ couponId: coupon.id, amount: String(coupon.balance), }); return `/redeem?${params.toString()}`; } export default function BenefitPage() { const navigate = useNavigate(); const listRef = useRef(null); const [summary, setSummary] = useState(null); const [coupons, setCoupons] = useState([]); const [tab, setTab] = useState<'available' | 'history'>('available'); useEffect(() => { Promise.all([ request('USER_H5', '/benefit/summary'), request('USER_H5', '/benefit/coupons'), ]) .then(([s, list]) => { setSummary(s); setCoupons( list.map((c) => ({ id: String(c.id), couponNo: String(c.couponNo), totalAmount: Number(c.totalAmount), usedAmount: Number(c.usedAmount), balance: Number(c.balance), status: String(c.status), sourceProduct: String(c.sourceProduct), })), ); }) .catch(() => {}); }, []); const available = coupons.filter((c) => c.status === 'ACTIVE' && c.balance > 0); const history = coupons.filter((c) => c.status === 'USED_UP' || c.status === 'VOID'); const visible = tab === 'available' ? available : history; function scrollToList() { listRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' }); } function goRedeem(coupon?: CouponItem) { navigate(buildRedeemUrl(coupon)); } return (

好客权益

当前好客权益余额

¥ {summary ? formatMoney(summary.totalBalance) : '--'}
{visible.length > 0 ? (
{visible.map((c) => (
0 ? ' benefit-card--clickable' : ''}`} role={tab === 'available' && c.balance > 0 ? 'button' : undefined} tabIndex={tab === 'available' && c.balance > 0 ? 0 : undefined} onClick={() => { if (tab === 'available' && c.balance > 0) goRedeem(c); }} onKeyDown={(e) => { if (tab === 'available' && c.balance > 0 && (e.key === 'Enter' || e.key === ' ')) { e.preventDefault(); goRedeem(c); } }} >
好客权益
¥ {Math.round(c.totalAmount)}

{c.sourceProduct}

永久有效

适用于合作酒店餐饮消费,到店核销使用

已使用 ¥{formatMoney(c.usedAmount)} 未使用 ¥{formatMoney(c.balance)}
e.stopPropagation()} > {formatCouponNo(c.couponNo)} {tab === 'available' && c.balance > 0 && ( )}
))}
) : (
{tab === 'available' ? ( <> card_giftcard

暂无可用权益,购酒后自动发放

) : ( <> history_edu

暂无过期或已使用的权益记录

)}
)}
); }