import { useEffect, useState } from "react"; import QRCode from "qrcode"; /** * QR-Inhalt für ein Einzelstück. Bewusst das Custom-Scheme `vorrania://` statt * einer https-URL: Die normale Kamera-App öffnet damit trotzdem die App, aber * OHNE an eine feste Domain gebunden zu sein. Das ist für einen selbstgehosteten * Dienst nötig (jede Instanz hat eine andere URL) und der QR verrät keinen Server. * Die App öffnet die UID am gerade aktiven Server. */ export const itemDeepLink = (uid) => `vorrania://i/${uid}`; /** Kleines QR-Bild für einen Wert (asynchron erzeugt). */ export function QrImg({ text, size = 60 }) { const [url, setUrl] = useState(null); useEffect(() => { let ok = true; QRCode.toDataURL(text, { margin: 1, width: size * 2 }) .then((u) => { if (ok) setUrl(u); }) .catch(() => {}); return () => { ok = false; }; }, [text, size]); return url ? QR : ; } const esc = (s) => (s || "").replace(/[<>&]/g, ""); /** Druckt QR-Etiketten in einem neuen Fenster. entries: [{ text, line1, line2 }]. */ export async function printQrLabels(title, entries) { const labels = await Promise.all(entries.map(async (e) => { const url = await QRCode.toDataURL(e.text, { margin: 1, width: 260 }); return `
${esc(e.line1)}
` + `
${esc(e.line2)}
`; })); const w = window.open("", "_blank"); if (!w) return false; w.document.write( `${esc(title)}${labels.join("")} `, ); w.document.close(); return true; }