Files
dukang/apps/h5-shop/src/pages/RedeemSuccessPage.tsx
T
jacy fc2e5b65de
CI / verify (pull_request) Has been cancelled
v3.5.3版本更新1
2026-08-20 18:54:15 +08:00

107 lines
4.5 KiB
TypeScript

import { useEffect, useMemo } from 'react';
import { useLocation, useNavigate } from 'react-router-dom';
import { notifyRedeemSuccess } from '../lib/useRedeemSuccessBus';
import { formatMoney, toMoneyNumber } from '../lib/money';
export default function RedeemSuccessPage() {
const navigate = useNavigate();
const location = useLocation();
const result = useMemo(() => {
const stateResult = (location.state as { result?: Record<string, unknown> })?.result;
if (stateResult) return stateResult;
try {
const cached = sessionStorage.getItem('lastRedeemResult');
return cached ? (JSON.parse(cached) as Record<string, unknown>) : null;
} catch {
return null;
}
}, [location.state]);
const storeName = (location.state as { storeName?: string })?.storeName || '当前门店';
const user = (location.state as { user?: { nickname?: string; phone?: string; userNo?: string } })?.user;
const userLabel = user?.nickname || user?.phone || '—';
const amount = toMoneyNumber(result?.amount);
const redeemNo = String(result?.redeemNo || '—');
const createdAt = result?.createdAt
? new Date(String(result.createdAt)).toLocaleString('zh-CN')
: new Date().toLocaleString('zh-CN');
// v3.5.1 #2:核销成功后广播事件,通知门店信息页 / 提现页即时刷新
useEffect(() => {
notifyRedeemSuccess({
redeemNo: redeemNo !== '—' ? redeemNo : undefined,
amount,
});
}, [redeemNo, amount]);
return (
<div className="shop-success-page">
<header className="shop-success-header">
<button type="button" className="shop-redeem-back" onClick={() => navigate('/')} aria-label="返回">
<span className="material-symbols-outlined">arrow_back</span>
</button>
<h1 className="app-page-title">杜康好客</h1>
</header>
<section className="shop-success-hero">
<div className="shop-success-icon-wrap">
<span className="material-symbols-outlined">check_circle</span>
</div>
<h2 className="shop-success-title">核销成功</h2>
<p className="shop-success-amount">¥ {formatMoney(amount)}</p>
<p className="shop-success-sub">已入账到余额</p>
<p className="shop-success-note">核销成功,账单通知已发送至老板手机</p>
</section>
<div className="shop-success-details">
<div className="shop-success-detail-row">
<span className="shop-success-detail-label">核销门店</span>
<span className="shop-success-detail-value">{storeName}</span>
</div>
<div className="shop-success-detail-row">
<span className="shop-success-detail-label">核销用户</span>
<div className="shop-success-user">
<div className="shop-success-user-avatar">
<span className="material-symbols-outlined">person</span>
</div>
<div style={{ textAlign: 'right' }}>
<div className="shop-success-detail-value">{userLabel}</div>
</div>
</div>
</div>
<div className="shop-success-detail-row">
<span className="shop-success-detail-label">核销时间</span>
<span className="shop-success-detail-value" style={{ fontWeight: 400, color: 'var(--color-on-surface-variant)' }}>
{createdAt}
</span>
</div>
<div className="shop-success-detail-row">
<span className="shop-success-detail-label">订单编号</span>
<span className="shop-success-detail-value" style={{ fontFamily: 'monospace', fontWeight: 400 }}>
{redeemNo}
</span>
</div>
</div>
<div className="shop-success-actions">
<button type="button" className="shop-success-primary-btn" onClick={() => navigate('/')}>
<span>继续核销</span>
<span className="material-symbols-outlined" style={{ fontSize: 20 }}>qr_code_scanner</span>
</button>
<button type="button" className="shop-success-outline-btn" onClick={() => navigate('/')}>
<span>返回首页</span>
<span className="material-symbols-outlined" style={{ fontSize: 20 }}>home</span>
</button>
</div>
<div className="shop-success-brand">
<div className="shop-success-brand-icon">
<span className="material-symbols-outlined shop-fill-icon" style={{ fontSize: 12 }}>verified</span>
</div>
<p className="shop-success-brand-text">山西领势酒业有限责任公司</p>
</div>
</div>
);
}