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}
为门店服务评分
);
}