import { useRef, useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { request } from '../lib/api'; import { uploadRedeemPendingPhoto } from '../lib/upload'; import { isWechatEnv, weixinSdk } from '../lib/weixin'; import type { RedeemPendingSubmitResult } from '@dukang/shared-types'; type Props = { redeemToken: string; failCount: number; }; export default function WeakNetFallbackPanel({ redeemToken, failCount }: Props) { const navigate = useNavigate(); const inputRef = useRef(null); const [uploading, setUploading] = useState(false); const [submitting, setSubmitting] = useState(false); const [previewUrl, setPreviewUrl] = useState(''); const [photoResourceId, setPhotoResourceId] = useState(''); const [result, setResult] = useState(null); const [msg, setMsg] = useState(''); async function handleFile(file: File) { setUploading(true); setMsg(''); try { const registered = await uploadRedeemPendingPhoto(file); setPhotoResourceId(registered.id); setPreviewUrl(registered.url); } catch (e) { setMsg(e instanceof Error ? e.message : '上传失败'); } finally { setUploading(false); } } async function pickPhoto() { setMsg(''); if (isWechatEnv()) { try { setUploading(true); await weixinSdk.init(); const files = await weixinSdk.chooseImages({ count: 1, sourceType: ['album', 'camera'], }); if (files?.[0]) { await handleFile(files[0]); } } catch (e) { const text = e instanceof Error ? e.message : '选图失败'; if (!/cancel/i.test(text)) setMsg(text); } finally { setUploading(false); } return; } inputRef.current?.click(); } async function submitPending() { if (!photoResourceId) { setMsg('请先拍摄或上传核销码照片'); return; } setSubmitting(true); setMsg(''); try { const res = await request('SHOP_H5', '/shop/redeem/pending', { method: 'POST', body: JSON.stringify({ token: redeemToken, photoResourceId, failCount, }), }); setResult(res); } catch (e) { setMsg(e instanceof Error ? e.message : '提交失败'); } finally { setSubmitting(false); } } function copyText(text: string) { void navigator.clipboard?.writeText(text).then( () => setMsg('已复制'), () => setMsg('复制失败,请手动长按复制'), ); } return (

弱网核销兜底

扫码核销网络失败已达 {failCount} 次。请记录用户手机号尝试「手机号核销」, 或拍下用户核销码照片提交客服人工处理。

核销码 ID(追查用)
{result ? (

已提交客服,待处理单号:

请告知用户保留核销码编号,客服将尽快人工补核销。

) : ( <> { const file = e.target.files?.[0]; if (file) void handleFile(file); }} /> {previewUrl && ( 核销码照片预览 )}
)} {msg &&

{msg}

}
); }