import { useMemo, useState } from 'react'; import { useLocation, useNavigate } from 'react-router-dom'; import PageHeader from '@dukang/shared-ui/PageHeader'; import { request } from '../lib/api'; import { usePageView } from '../lib/usePageView'; type RedeemRecord = { id: string; redeemNo: string; amount: number; storeId: string; storeName: string; createdAt: string; }; function formatMoney(amount: number) { return amount.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }); } function StarRating({ label, value, onChange, }: { label: string; value: number; onChange: (score: number) => void; }) { return (
{label}
{[1, 2, 3, 4, 5].map((score) => ( ))}
); } export default function RedeemSuccessPage() { usePageView('redeem_success_view'); const navigate = useNavigate(); const location = useLocation(); const [serviceScore, setServiceScore] = useState(5); const [envScore, setEnvScore] = useState(5); const [loading, setLoading] = useState(false); const record = useMemo(() => { const fromState = (location.state as { record?: RedeemRecord })?.record; if (fromState) return fromState; try { const cached = sessionStorage.getItem('lastRedeemResult'); return cached ? (JSON.parse(cached) as RedeemRecord) : null; } catch { return null; } }, [location.state]); const amount = Number(record?.amount ?? 0); const storeName = record?.storeName || '门店'; const redeemNo = record?.redeemNo || '—'; const redeemedAt = record?.createdAt ? new Date(record.createdAt).toLocaleString('zh-CN') : new Date().toLocaleString('zh-CN'); async function submit() { setLoading(true); try { const redeemRecordId = record?.id || sessionStorage.getItem('lastRedeemRecordId'); if (redeemRecordId) { await request('USER_H5', '/redeem/ratings', { method: 'POST', body: JSON.stringify({ redeemRecordId, serviceScore, envScore, }), }); } } catch { /* 评价失败不阻塞返回 */ } finally { setLoading(false); sessionStorage.removeItem('lastRedeemRecordId'); sessionStorage.removeItem('lastRedeemResult'); navigate('/benefit', { replace: true }); } } return (
navigate('/benefit', { replace: true })} />

核销成功

¥ {formatMoney(amount)}

已在 {storeName} 完成核销

核销门店 {storeName}
核销时间 {redeemedAt}
核销单号 {redeemNo}

为门店服务评分

); }