import { useState, useEffect, useRef } from "react"; import { useParams, Link } from "react-router-dom"; import { adminFetch } from "./adminApi"; type QRData = { qrDataUrl: string; musicUrl: string; musicTitle: string; }; export default function MusicQRCode() { const { id } = useParams(); const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [copied, setCopied] = useState(false); const canvasRef = useRef(null); useEffect(() => { if (!id) return; adminFetch(`/music/${id}/qrcode`) .then(setData) .finally(() => setLoading(false)); }, [id]); useEffect(() => { if (!data || !canvasRef.current) return; const canvas = canvasRef.current; const ctx = canvas.getContext("2d")!; const img = new Image(); img.onload = () => { const padding = 20; const textHeight = 40; canvas.width = img.width + padding * 2; canvas.height = img.height + padding * 2 + textHeight; ctx.fillStyle = "#ffffff"; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.drawImage(img, padding, padding); ctx.fillStyle = "#666666"; ctx.font = "12px sans-serif"; ctx.textAlign = "center"; ctx.fillText(data.musicUrl, canvas.width / 2, img.height + padding * 2 + 12); }; img.src = data.qrDataUrl; }, [data]); const handleDownload = () => { if (!canvasRef.current || !data) return; const link = document.createElement("a"); link.download = `${data.musicTitle}-二维码.png`; link.href = canvasRef.current.toDataURL("image/png"); link.click(); }; const handleCopy = async () => { if (!data) return; try { await navigator.clipboard.writeText(data.musicUrl); setCopied(true); setTimeout(() => setCopied(false), 1800); } catch { const ta = document.createElement("textarea"); ta.value = data.musicUrl; document.body.appendChild(ta); ta.select(); document.execCommand("copy"); document.body.removeChild(ta); setCopied(true); setTimeout(() => setCopied(false), 1800); } }; if (loading) return

加载中...

; if (!data) return

音乐不存在

; return (

{data.musicTitle} — 点位链接

二维码

{data.musicUrl}

点位主要通过 NFC 触碰分发,二维码作为备用方式保留

); }