{"version":3,"file":"index.mjs","sources":["../../../../../../packages/components/qr-code/src/index.ts"],"sourcesContent":["import {\n  computed,\n  defineComponent,\n  h,\n  mergeProps,\n  onMounted,\n  ref,\n  watch,\n} from 'vue'\nimport { useNamespace } from 'element-plus'\nimport { useQRCode } from '@vueuse/integrations/useQRCode'\nimport QRCode from 'qrcode'\nimport { DIV_TAG } from '@element-plus/constants'\nimport { isDef } from '@element-plus/utils'\nimport {\n  ColorType,\n  IconConfig,\n  getDefaultIconConfig,\n  qrCodeEmits,\n  qrCodeProps,\n} from './qr-code'\n\nconst QRCodeComp = defineComponent({\n  name: 'QRCodeComp',\n  inheritAttrs: false,\n  props: qrCodeProps,\n  setup(props) {\n    const qrcode = useQRCode(props.text, props.options)\n\n    const hasIcon = computed(() => !!props.iconSrc)\n    const canvasRef = ref()\n\n    const loadImage = (src: string): Promise<HTMLImageElement> => {\n      return new Promise((resolve, reject) => {\n        const img = new Image()\n        img.src = src\n        img.crossOrigin = 'anonymous'\n        img.onload = () => {\n          return resolve(img)\n        }\n        img.onerror = () => {\n          return reject(img)\n        }\n      })\n    }\n\n    const drawCanvas = async () => {\n      const canvas = canvasRef.value\n      if (!canvas) return\n      const options: QRCode.QRCodeToDataURLOptions = props.options\n\n      await QRCode.toCanvas(canvas, props.text, options)\n\n      const icon: HTMLImageElement = await loadImage(props.iconSrc as string)\n\n      const ctx = canvas.getContext('2d')\n\n      const iconConfig: IconConfig = Object.assign(\n        getDefaultIconConfig(),\n        props.iconConfig\n      )\n      const { backgroundColor, radius, size, padding } = iconConfig\n      const paddingSize = padding * 2\n      const centerX = (canvas.width - size) / 2\n      const centerY = (canvas.height - size) / 2\n      ctx.fillStyle = backgroundColor\n      ctx.beginPath()\n      ctx.roundRect(centerX, centerY, size, size, radius)\n      ctx.fill()\n      const ratio = icon.width / icon.height\n      const scaledWidth = ratio >= 1 ? size : size * ratio\n      const scaledHeight = ratio <= 1 ? size : size / ratio\n      const left = centerX + (size - scaledWidth) / 2\n      const top = centerY + (size - scaledHeight) / 2\n      ctx.drawImage(\n        icon,\n        left + padding,\n        top + padding,\n        scaledWidth - paddingSize,\n        scaledHeight - paddingSize\n      )\n    }\n\n    onMounted(() => {\n      drawCanvas()\n    })\n\n    return () => {\n      const { text } = props\n\n      const renderImage = () => {\n        return text ? [h('img', { src: qrcode.value, alt: text })] : ''\n      }\n\n      const renderCanvas = () => {\n        return text ? h('canvas', { ref: canvasRef }) : ''\n      }\n\n      return hasIcon.value ? renderCanvas() : renderImage()\n    }\n  },\n})\n\nexport default defineComponent({\n  name: 'ElQrCode',\n  inheritAttrs: false,\n  props: qrCodeProps,\n  emits: qrCodeEmits,\n  setup(props, { attrs, slots, expose }) {\n    const ns = useNamespace('qr-code')\n    const containerRef = ref()\n\n    const options = computed(() => {\n      const color: ColorType = {\n        dark: '#000000ff',\n        light: '#ffffffff',\n      }\n      if (isDef(props.color)) {\n        color.dark = props.color as string\n      }\n      if (isDef(props.backgroundColor)) {\n        color.light = props.backgroundColor as string\n      }\n      return {\n        width: Number(props.size),\n        margin: Number(props.margin),\n        color,\n        ...props.options,\n      }\n    })\n\n    const key = ref(1)\n\n    watch(\n      () => [props.text, options.value],\n      () => {\n        key.value += 1\n      }\n    )\n\n    const downloadQRCode = (name?: string) => {\n      const hasIcon = !!props.iconSrc\n      const dom = containerRef.value.querySelector(hasIcon ? 'canvas' : 'img')\n      if (dom) {\n        const url = hasIcon ? dom.toDataURL() : dom.src\n        const a = document.createElement('a')\n        a.download = name ?? 'QRCode.png'\n        a.href = url\n        document.body.appendChild(a)\n        a.click()\n        document.body.removeChild(a)\n      }\n    }\n\n    expose({\n      downloadQRCode,\n    })\n\n    return () => {\n      return h(\n        DIV_TAG,\n        {\n          ...mergeProps(\n            {\n              class: ns.b(),\n            },\n            attrs\n          ),\n          ref: containerRef,\n        },\n        [\n          h(\n            QRCodeComp,\n            {\n              text: props.text,\n              options: options.value,\n              iconSrc: props.iconSrc,\n              iconConfig: props.iconConfig,\n              key: key.value,\n            },\n            slots\n          ),\n        ]\n      )\n    }\n  },\n})\n"],"names":[],"mappings":"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"}