import { get, type MaybeRef } from '@vueuse/core'; import QRCode, { type QRCodeErrorCorrectionLevel, type QRCodeToDataURLOptions } from 'qrcode'; import { ref, watch, isRef } from 'vue'; export function useQRCode({ text, color: { background, foreground }, errorCorrectionLevel, options, }: { text: MaybeRef; color: { foreground: MaybeRef; background: MaybeRef }; errorCorrectionLevel?: MaybeRef; options?: QRCodeToDataURLOptions; }) { const qrcode = ref(''); watch( [text, background, foreground, errorCorrectionLevel].filter(isRef), async () => { if (get(text)) qrcode.value = await QRCode.toDataURL(get(text), { color: { dark: get(foreground), light: get(background), ...options?.color, }, errorCorrectionLevel: get(errorCorrectionLevel) ?? 'M', ...options, }); }, { immediate: true }, ); return { qrcode }; }