import { useEffect, useState } from 'react'; import { View, Text, Input, Button } from '@tarojs/components'; import Taro from '@tarojs/taro'; import type { PromoCodeItem } from '@dukang/shared-types'; import HqHeader from '../../components/HqHeader'; import { request, toast } from '../../lib/api'; import { useHqSession } from '../../lib/session'; import { navTo } from '../../lib/session'; import { buildPromoQrDataUrl } from '../../lib/promo-qr'; import './index.css'; import './index.css'; export default function PromoGeneratePage() { useHqSession(); const [name, setName] = useState(''); const [code, setCode] = useState(''); const [creating, setCreating] = useState(false); const [created, setCreated] = useState(null); const [qrUrl, setQrUrl] = useState(''); useEffect(() => { if (!created?.landingUrl) { setQrUrl(''); return; } void buildPromoQrDataUrl(created.landingUrl).then(setQrUrl).catch(() => setQrUrl('')); }, [created]); async function handleGenerate() { const trimmed = name.trim(); if (!trimmed) { toast('请填写渠道名称'); return; } setCreating(true); try { const payload: { name: string; code?: string } = { name: trimmed }; if (code.trim()) payload.code = code.trim().toUpperCase(); const row = await request('/admin/promo-codes', { method: 'POST', data: payload, }); setCreated(row); toast('推广码已生成', 'success'); } catch (e) { toast(e instanceof Error ? e.message : '生成失败'); } finally { setCreating(false); } } function copyLink() { if (!created?.landingUrl) return; Taro.setClipboardData({ data: created.landingUrl }).then(() => toast('推广链接已复制', 'success')); } return ( 填写渠道信息,生成专属溯源推广码与落地链接。 渠道名称 * setName(e.detail.value)} /> 自定义码值(选填) setCode(e.detail.value.toUpperCase())} /> {created && ( {qrUrl ? ( ) : ( hourglass_top )} {created.name} 码值:{created.code} link 复制链接 navTo(`/pages/promo/detail?id=${created.id}`)} > 查看详情 )} ); }