import { useEffect, useState } from 'react'; import { View, Text, Button } from '@tarojs/components'; import Taro, { useRouter } from '@tarojs/taro'; import type { PromoCodeItem, PromoCodeStats } from '@dukang/shared-types'; import HqHeader from '../../components/HqHeader'; import { request, toast } from '../../lib/api'; import { useHqSession } from '../../lib/session'; import { buildPromoQrDataUrl, promoConversion } from '../../lib/promo-qr'; import './index.css'; import './index.css'; type PromoDetail = PromoCodeItem & { stats?: PromoCodeStats }; export default function PromoDetailPage() { useHqSession(); const router = useRouter(); const id = router.params.id ?? ''; const [row, setRow] = useState(null); const [loading, setLoading] = useState(true); const [updating, setUpdating] = useState(false); const [qrUrl, setQrUrl] = useState(''); useEffect(() => { if (!id) return; setLoading(true); request(`/admin/promo-codes/${id}`) .then(setRow) .catch(() => setRow(null)) .finally(() => setLoading(false)); }, [id]); useEffect(() => { if (!row?.landingUrl) { setQrUrl(''); return; } void buildPromoQrDataUrl(row.landingUrl).then(setQrUrl).catch(() => setQrUrl('')); }, [row?.landingUrl]); async function toggleStatus() { if (!row) return; const next = row.status === 'ACTIVE' ? 'DISABLED' : 'ACTIVE'; const label = next === 'DISABLED' ? '停用' : '启用'; const ok = await Taro.showModal({ title: `确认${label}`, content: next === 'DISABLED' ? '停用后扫码将不再追踪数据' : '启用后恢复追踪', }); if (!ok.confirm) return; setUpdating(true); try { const updated = await request(`/admin/promo-codes/${id}/status`, { method: 'PUT', data: { status: next }, }); setRow((prev) => (prev ? { ...prev, ...updated } : updated)); toast(`已${label}`, 'success'); } catch (e) { toast(e instanceof Error ? e.message : '操作失败'); } finally { setUpdating(false); } } function copyLink() { if (!row?.landingUrl) return; Taro.setClipboardData({ data: row.landingUrl }).then(() => toast('推广链接已复制', 'success')); } function downloadQr() { if (!qrUrl) return; if (process.env.TARO_ENV === 'h5') { const a = document.createElement('a'); a.href = qrUrl; a.download = `promo-${row?.code ?? 'qr'}.png`; a.click(); toast('已开始下载', 'success'); return; } Taro.previewImage({ urls: [qrUrl] }); } const stats = row?.stats ?? (row ? { scanCount: row.scanCount, orderCount: row.orderCount, conversionRate: parseFloat(promoConversion(row.scanCount, row.orderCount)) || 0, } : null); if (loading) { return ( 加载中… ); } if (!row) { return ( 推广码不存在 ); } return ( {qrUrl ? ( ) : null} {row.name} {row.status === 'ACTIVE' ? '运行中' : '已停用'} 码值 {row.code} {stats && ( visibility 扫码UV {stats.scanCount} shopping_cart 下单数 {stats.orderCount} trending_up 转化率 {stats.conversionRate}% schedule 创建时间 {new Date(row.createdAt).toLocaleDateString('zh-CN')} )} 落地链接 {row.landingUrl} ); }