'use client'; import { useEffect, useRef } from 'react'; interface Props { data: string; size?: number; } /** * Renders a styled QR code for `data`. `qr-code-styling` touches the DOM, so it * is imported lazily inside the effect to stay clear of SSR. */ export function QrCode({ data, size = 240 }: Props) { const containerRef = useRef(null); // biome-ignore lint/suspicious/noExplicitAny: qr-code-styling instance type loaded lazily const instanceRef = useRef(null); // biome-ignore lint/correctness/useExhaustiveDependencies: initial data is read once here; later changes go through update() in the next effect useEffect(() => { let cancelled = false; (async () => { const { default: QRCodeStyling } = await import('qr-code-styling'); if (cancelled) return; instanceRef.current = new QRCodeStyling({ width: size, height: size, type: 'svg', data, dotsOptions: { type: 'rounded' }, }); if (containerRef.current) { containerRef.current.replaceChildren(); instanceRef.current.append(containerRef.current); } })(); return () => { cancelled = true; }; }, [size]); useEffect(() => { instanceRef.current?.update({ data }); }, [data]); return
; }