import { useState, type CSSProperties } from 'react'; import { useOutletContext } from 'react-router-dom'; import { Button, Card, Col, Descriptions, Form, Input, Modal, Popconfirm, Row, Select, Space, Statistic, Typography, message, } from 'antd'; import { PROMO_CODE_SCENE_LABELS, PROMO_CODE_STATUS_LABELS, promoConversion, } from '@dukang/shared-types'; import { request } from '../../lib/api'; import { fmtTime } from '../../lib/constants'; import type { PromoCodeDetailContext } from './PromoCodeDetailLayout'; import PromoCodeMetricsPanel from './PromoCodeMetricsPanel'; const descLabelStyle: CSSProperties = { whiteSpace: 'nowrap', width: 108, }; const descContentStyle: CSSProperties = { wordBreak: 'break-all', }; async function downloadQrcode(url: string, filename: string) { try { const res = await fetch(url); const blob = await res.blob(); const objectUrl = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = objectUrl; a.download = filename; a.click(); URL.revokeObjectURL(objectUrl); } catch { window.open(url, '_blank'); } } export default function PromoCodeDetailPage() { const { detail, reload } = useOutletContext(); const [editForm] = Form.useForm(); const [editOpen, setEditOpen] = useState(false); const [saving, setSaving] = useState(false); const stats = detail.stats; async function handleEdit(values: Record) { setSaving(true); try { await request(`/admin/promo-codes/${detail.id}`, { method: 'PUT', body: JSON.stringify({ name: values.name, scene: values.scene, ownerUserId: values.ownerUserId?.trim() || null, remark: values.remark?.trim() || null, }), }); message.success('已保存'); setEditOpen(false); await reload(); } catch (e) { message.error(e instanceof Error ? e.message : '保存失败'); } finally { setSaving(false); } } return ( <> { await request(`/admin/promo-codes/${detail.id}/status`, { method: 'PUT', body: JSON.stringify({ status: detail.status === 'ACTIVE' ? 'DISABLED' : 'ACTIVE', }), }); message.success('状态已更新'); await reload(); }} > )} > {detail.name} {detail.code} {PROMO_CODE_SCENE_LABELS[detail.scene] || detail.scene} {PROMO_CODE_STATUS_LABELS[detail.status] || detail.status} {detail.id} {detail.qrcodeId} {detail.qrcodeUrl ? ( {detail.qrcodeUrl} ) : '—'} {detail.ownerUser?.userNo || detail.ownerUser?.phone || '—'} {detail.remark || '—'} {fmtTime(detail.createdAt)} {fmtTime(detail.updatedAt)} {detail.qrcodeUrl ? ( <> 推广小程序码 scene={detail.id} ) : ( 暂无小程序码 )} setEditOpen(false)} footer={null} destroyOnClose >
); }