diff --git a/packages/nc-gui/components/virtual-cell/QrCode.vue b/packages/nc-gui/components/virtual-cell/QrCode.vue index bc95dfc7a0..b5aeb9ab52 100644 --- a/packages/nc-gui/components/virtual-cell/QrCode.vue +++ b/packages/nc-gui/components/virtual-cell/QrCode.vue @@ -3,7 +3,7 @@ import { useQRCode } from '@vueuse/integrations/useQRCode' import { message } from 'ant-design-vue' import type QRCode from 'qrcode' import { type ColumnType, isVirtualCol } from 'nocodb-sdk' -import { base64ToPNG } from '~/utils/svgToPng' +import { base64ToBlob, copyPNGToClipboard } from '~/utils/svgToPng' const { t } = useI18n() @@ -58,20 +58,15 @@ const cellIcon = (column: ColumnType) => columnMeta: column, }) -const copyAsPng = () => { +const copyAsPng = async () => { if (!qrCodeLarge.value) return - base64ToPNG(qrCodeLarge.value).then((blob) => { - try { - navigator.clipboard.write([ - new ClipboardItem({ - 'image/png': blob, - }), - ]) - message.success(t('msg.info.copiedToClipboard')) - } catch { - message.error(t('msg.error.notSupported')) - } - }) + const blob = await base64ToBlob(qrCodeLarge.value) + const success = await copyPNGToClipboard(blob) + if (success) { + message.success(t('msg.info.copiedToClipboard')) + } else { + message.error(t('msg.error.notSupported')) + } } diff --git a/packages/nc-gui/utils/svgToPng.ts b/packages/nc-gui/utils/svgToPng.ts index 7e2b17a8ad..a38143a66e 100644 --- a/packages/nc-gui/utils/svgToPng.ts +++ b/packages/nc-gui/utils/svgToPng.ts @@ -65,9 +65,25 @@ function downloadSvg(svg: SVGGraphicsElement, fileName: string) { const imgURI = canvas.toDataURL('image/png').replace('image/png', 'image/octet-stream') triggerDownload(imgURI, fileName) } - console.log(canvas) - // TODO: Somehow canvas dom element is getting deleted - // document.removeChild(canvas) + }) +} + +function copyPNGToClipboard(blob: Blob | null) { + return new Promise((resolve) => { + if (!blob) { + resolve(false) + return + } + try { + navigator.clipboard.write([ + new ClipboardItem({ + 'image/png': blob, + }), + ]) + resolve(true) + } catch { + resolve(false) + } }) } @@ -75,28 +91,15 @@ function copySVGToClipboard(svg: SVGGraphicsElement) { return new Promise((resolve) => { processSVG(svg, (canvas) => { canvas.toBlob((blob) => { - if (!blob) { - resolve(false) - return - } - try { - navigator.clipboard.write([ - new ClipboardItem({ - 'image/png': blob, - }), - ]) - resolve(true) - } catch { - resolve(false) - } + copyPNGToClipboard(blob).then(resolve) }) }) }) } -async function base64ToPNG(base64String: string): Promise { +async function base64ToBlob(base64String: string): Promise { const blob = await fetch(base64String).then((res) => res.blob()) return blob } -export { downloadSvg, copySVGToClipboard, base64ToPNG } +export { downloadSvg, copySVGToClipboard, copyPNGToClipboard, base64ToBlob }