Fix QR image not appearing for new codes; v1.1.4

Switch from toDataURL (which silently failed in browser) to toCanvas on
a real <canvas> ref — more reliable and renders immediately on mount.
Download PNG link appears once the canvas is drawn.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
nmemmert
2026-07-22 14:12:57 -04:00
parent 4e7905ae44
commit 71ff0e6842
2 changed files with 21 additions and 14 deletions
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "siteforge", "name": "siteforge",
"private": true, "private": true,
"version": "1.1.3", "version": "1.1.4",
"type": "module", "type": "module",
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
+20 -13
View File
@@ -1086,24 +1086,31 @@ function buildSiteContentForSave(siteContent: SiteContent): SiteContent {
} }
function QrCodeImage({ url, label }: { url: string; label: string }) { function QrCodeImage({ url, label }: { url: string; label: string }) {
const canvasRef = React.useRef<HTMLCanvasElement>(null)
const [dataUrl, setDataUrl] = React.useState<string>('') const [dataUrl, setDataUrl] = React.useState<string>('')
React.useEffect(() => { React.useEffect(() => {
QRCode.toDataURL(url, { width: 256, margin: 2, color: { dark: '#000000', light: '#ffffff' } }) const canvas = canvasRef.current
.then(setDataUrl) if (!canvas) return
.catch(() => {}) QRCode.toCanvas(canvas, url, { width: 256, margin: 2, color: { dark: '#000000', light: '#ffffff' } }, (err: Error | null | undefined) => {
if (err) { console.error('[QR]', err); return }
setDataUrl(canvas.toDataURL('image/png'))
})
}, [url]) }, [url])
if (!dataUrl) return null
return ( return (
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: 6, marginTop: 10 }}> <div style={{ display: 'flex', flexDirection: 'column', alignItems: 'flex-start', gap: 6, marginTop: 10 }}>
<img src={dataUrl} alt={`QR code for ${label}`} style={{ width: 128, height: 128, imageRendering: 'pixelated', border: '1px solid var(--admin-border, #ddd)', borderRadius: 4 }} /> <canvas ref={canvasRef} style={{ width: 128, height: 128, border: '1px solid var(--admin-border, #ddd)', borderRadius: 4 }} />
<a {dataUrl && (
href={dataUrl} <a
download={`qr-${label.toLowerCase().replace(/[^a-z0-9]+/g, '-')}.png`} href={dataUrl}
className="btn-admin-reset" download={`qr-${label.toLowerCase().replace(/[^a-z0-9]+/g, '-')}.png`}
style={{ fontSize: '0.8em' }} className="btn-admin-reset"
> style={{ fontSize: '0.8em' }}
Download PNG >
</a> Download PNG
</a>
)}
</div> </div>
) )
} }