@react-pdf-levelup/qr 1.1.20 → 1.1.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
- 'use strict';var react=require('react'),renderer=require('@react-pdf/renderer'),C=require('qrcode'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var C__default=/*#__PURE__*/_interopDefault(C);var y=async({value:e,size:o=150,colorDark:l="#000000",colorLight:d="#ffffff",margin:s=0,errorCorrectionLevel:g="M"})=>{try{let r={errorCorrectionLevel:g,type:"image/png",quality:.92,margin:s,color:{dark:l,light:d},width:o};return C__default.default.toDataURL(e,r)}catch(r){return console.error("Error generando QR:",r),""}},b=async(e,o,l,d)=>new Promise(async s=>{if(!e||!o){s(e);return}try{let g=typeof window<"u"&&typeof window.document<"u",r,c,i;if(g)r=document.createElement("canvas"),c=r.getContext("2d"),i=window.Image;else try{let{createCanvas:n,Image:a}=await import('canvas');r=n(100,100),c=r.getContext("2d"),i=a;}catch(n){console.error("Canvas not available in Node environment for addLogoToQR",n),s(e);return}if(!c){s(e);return}let t=new i;g&&(t.crossOrigin="anonymous"),t.onload=()=>{r.width=t.width,r.height=t.height,c.drawImage(t,0,0,r.width,r.height);let n=new i;g&&(n.crossOrigin="anonymous"),n.onload=()=>{let a=(r.width-l)/2,m=(r.height-d)/2;c.fillStyle="#FFFFFF",c.fillRect(a-5,m-5,l+10,d+10),c.drawImage(n,a,m,l,d);let p=r.toDataURL("image/png");s(p);},n.onerror=a=>{console.error("Error cargando el logo:",a),s(e);},n.src=o;},t.onerror=n=>{console.error("Error cargando el QR:",n),s("");},t.src=e;}catch(g){console.error("Error procesando el QR con logo:",g),s(e);}});var x=renderer.StyleSheet.create({qrContainer:{display:"flex",alignItems:"center",justifyContent:"center",margin:10}}),S={0:"L",1:"M",2:"Q",3:"H"},V=({value:e,size:o=150,style:l,colorDark:d="#000000",colorLight:s="#ffffff",margin:g=0,logo:r="",logoWidth:c=30,logoHeight:i=30,errorCorrectionLevel:t=r?"H":"M"})=>{let[n,a]=react.useState("");react.useEffect(()=>{(async()=>{try{let f=await y({value:e,size:o,colorDark:d,colorLight:s,margin:g,errorCorrectionLevel:typeof t=="number"?S[t]||"M":t});if(r&&c&&i){let u=await b(f,r,c,i);a(u);}else a(f);}catch(f){console.error("Error generando QR:",f);let u=`https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(e)}&size=${o}x${o}&color=${encodeURIComponent(d.replace("#",""))}&bgcolor=${encodeURIComponent(s.replace("#",""))}`;a(u);}})();},[e,o,d,s,g,r,c,i,t]);let m=`https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(e)}&size=${o}x${o}`;return jsxRuntime.jsx(renderer.View,{style:[x.qrContainer,l],children:jsxRuntime.jsx(renderer.Image,{src:n||m,style:{width:o,height:o}})})},I=V;var h=async e=>{try{let o=typeof window<"u"&&typeof window.document<"u",l,d={};if(o)try{let t=await import('qr-code-styling');l=t.default||t;}catch(t){throw console.error("Failed to load qr-code-styling in browser",t),t}else {let t="jsdom",n="canvas",a="qr-code-styling/lib/qr-code-styling.common.js";try{let[m,p,f]=await Promise.all([import(t),import(n),import(a)]),{JSDOM:u}=m,O=p.default||p,{QRCodeStyling:Q}=f;l=Q,d={jsdom:u,nodeCanvas:O};}catch(m){throw console.error("Failed to load Node dependencies for QR generation",m),m}}let s=typeof e.width=="number"&&isFinite(e.width)?Math.round(e.width):300,g=typeof e.height=="number"&&isFinite(e.height)?Math.round(e.height):300,r={width:s,height:g,data:e.value,image:e.image,dotsOptions:e.dotsOptions,backgroundOptions:{color:e.backgroundOptions?.color||"#ffffff",...e.backgroundOptions},imageOptions:{crossOrigin:"anonymous",margin:typeof e.imageOptions?.margin=="number"&&isFinite(e.imageOptions.margin)?e.imageOptions.margin:0,saveAsBlob:!0,imageSize:typeof e.imageOptions?.imageSize=="number"&&isFinite(e.imageOptions.imageSize)?Math.max(0,Math.min(1,e.imageOptions.imageSize)):.4},cornersSquareOptions:e.cornersSquareOptions,cornersDotOptions:e.cornersDotOptions},i=await new l({type:"png",...d,...r}).getRawData("png");if(!i)throw new Error("Failed to generate raw data from qr-code-styling");if(o){if(i instanceof Blob)return new Promise((t,n)=>{let a=new FileReader;a.onloadend=()=>{typeof a.result=="string"?t(a.result):n(new Error("Failed to convert blob to base64"));},a.onerror=n,a.readAsDataURL(i);});console.warn("Unexpected rawData type in browser:",i);}if(typeof Buffer<"u"&&Buffer.isBuffer(i))return `data:image/png;base64,${i.toString("base64")}`;throw new Error(`Unexpected raw data type: ${typeof i}`)}catch(o){return console.error("Error generating QR V2, falling back to V1:",o),y({value:e.value,size:e.width,colorDark:e.fallbackColorDark||e.dotsOptions?.color,colorLight:e.fallbackColorLight||e.backgroundOptions?.color,margin:e.fallbackMargin||0,errorCorrectionLevel:e.fallbackErrorCorrectionLevel||"M"})}};var B=renderer.StyleSheet.create({qrContainer:{display:"flex",alignItems:"center",justifyContent:"center"}}),P=({value:e,size:o=300,style:l,image:d,dotsOptions:s,backgroundOptions:g,imageOptions:r,cornersSquareOptions:c,cornersDotOptions:i,colorDark:t,colorLight:n,margin:a,errorCorrectionLevel:m})=>jsxRuntime.jsx(renderer.View,{style:[B.qrContainer,l],children:jsxRuntime.jsx(renderer.Image,{style:{width:o,height:o},src:h({value:e,width:o,height:o,image:d,dotsOptions:s||(t?{color:t}:void 0),backgroundOptions:g||(n?{color:n}:void 0),imageOptions:{...r,margin:r?.margin!==void 0?r.margin:a},cornersSquareOptions:c,cornersDotOptions:i,fallbackColorDark:t,fallbackColorLight:n,fallbackMargin:a,fallbackErrorCorrectionLevel:m})})}),U=P;
1
+ 'use strict';var react=require('react'),renderer=require('@react-pdf/renderer'),C=require('qrcode'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var C__default=/*#__PURE__*/_interopDefault(C);var y=async({url:e,size:o=150,colorDark:l="#000000",colorLight:d="#ffffff",margin:s=0,errorCorrectionLevel:g="M"})=>{try{let r={errorCorrectionLevel:g,type:"image/png",quality:.92,margin:s,color:{dark:l,light:d},width:o};return C__default.default.toDataURL(e,r)}catch(r){return console.error("Error generando QR:",r),""}},b=async(e,o,l,d)=>new Promise(async s=>{if(!e||!o){s(e);return}try{let g=typeof window<"u"&&typeof window.document<"u",r,c,i;if(g)r=document.createElement("canvas"),c=r.getContext("2d"),i=window.Image;else try{let{createCanvas:n,Image:a}=await import('canvas');r=n(100,100),c=r.getContext("2d"),i=a;}catch(n){console.error("Canvas not available in Node environment for addLogoToQR",n),s(e);return}if(!c){s(e);return}let t=new i;g&&(t.crossOrigin="anonymous"),t.onload=()=>{r.width=t.width,r.height=t.height,c.drawImage(t,0,0,r.width,r.height);let n=new i;g&&(n.crossOrigin="anonymous"),n.onload=()=>{let a=(r.width-l)/2,m=(r.height-d)/2;c.fillStyle="#FFFFFF",c.fillRect(a-5,m-5,l+10,d+10),c.drawImage(n,a,m,l,d);let p=r.toDataURL("image/png");s(p);},n.onerror=a=>{console.error("Error cargando el logo:",a),s(e);},n.src=o;},t.onerror=n=>{console.error("Error cargando el QR:",n),s("");},t.src=e;}catch(g){console.error("Error procesando el QR con logo:",g),s(e);}});var S=renderer.StyleSheet.create({qrContainer:{display:"flex",alignItems:"center",justifyContent:"center",margin:10}}),V={0:"L",1:"M",2:"Q",3:"H"},v=({url:e,size:o=150,style:l,colorDark:d="#000000",colorLight:s="#ffffff",margin:g=0,logo:r="",logoWidth:c=30,logoHeight:i=30,errorCorrectionLevel:t=r?"H":"M"})=>{let[n,a]=react.useState("");react.useEffect(()=>{(async()=>{try{let f=await y({url:e,size:o,colorDark:d,colorLight:s,margin:g,errorCorrectionLevel:typeof t=="number"?V[t]||"M":t});if(r&&c&&i){let u=await b(f,r,c,i);a(u);}else a(f);}catch(f){console.error("Error generando QR:",f);let u=`https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(e)}&size=${o}x${o}&color=${encodeURIComponent(d.replace("#",""))}&bgcolor=${encodeURIComponent(s.replace("#",""))}`;a(u);}})();},[e,o,d,s,g,r,c,i,t]);let m=`https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(e)}&size=${o}x${o}`;return jsxRuntime.jsx(renderer.View,{style:[S.qrContainer,l],children:jsxRuntime.jsx(renderer.Image,{src:n||m,style:{width:o,height:o}})})},I=v;var h=async e=>{try{let o=typeof window<"u"&&typeof window.document<"u",l,d={};if(o)try{let t=await import('qr-code-styling');l=t.default||t;}catch(t){throw console.error("Failed to load qr-code-styling in browser",t),t}else {let t="jsdom",n="canvas",a="qr-code-styling/lib/qr-code-styling.common.js";try{let[m,p,f]=await Promise.all([import(t),import(n),import(a)]),{JSDOM:u}=m,O=p.default||p,{QRCodeStyling:Q}=f;l=Q,d={jsdom:u,nodeCanvas:O};}catch(m){throw console.error("Failed to load Node dependencies for QR generation",m),m}}let s=typeof e.width=="number"&&isFinite(e.width)?Math.round(e.width):300,g=typeof e.height=="number"&&isFinite(e.height)?Math.round(e.height):300,r={width:s,height:g,data:e.url,image:e.image,dotsOptions:e.dotsOptions,backgroundOptions:{color:e.backgroundOptions?.color||"#ffffff",...e.backgroundOptions},imageOptions:{crossOrigin:"anonymous",margin:typeof e.imageOptions?.margin=="number"&&isFinite(e.imageOptions.margin)?e.imageOptions.margin:0,saveAsBlob:!0,imageSize:typeof e.imageOptions?.imageSize=="number"&&isFinite(e.imageOptions.imageSize)?Math.max(0,Math.min(1,e.imageOptions.imageSize)):.4},cornersSquareOptions:e.cornersSquareOptions,cornersDotOptions:e.cornersDotOptions},i=await new l({type:"png",...d,...r}).getRawData("png");if(!i)throw new Error("Failed to generate raw data from qr-code-styling");if(o){if(i instanceof Blob)return new Promise((t,n)=>{let a=new FileReader;a.onloadend=()=>{typeof a.result=="string"?t(a.result):n(new Error("Failed to convert blob to base64"));},a.onerror=n,a.readAsDataURL(i);});console.warn("Unexpected rawData type in browser:",i);}if(typeof Buffer<"u"&&Buffer.isBuffer(i))return `data:image/png;base64,${i.toString("base64")}`;throw new Error(`Unexpected raw data type: ${typeof i}`)}catch(o){return console.error("Error generating QR V2, falling back to V1:",o),y({url:e.url,size:e.width,colorDark:e.fallbackColorDark||e.dotsOptions?.color,colorLight:e.fallbackColorLight||e.backgroundOptions?.color,margin:e.fallbackMargin||0,errorCorrectionLevel:e.fallbackErrorCorrectionLevel||"M"})}};var B=renderer.StyleSheet.create({qrContainer:{display:"flex",alignItems:"center",justifyContent:"center"}}),P=({url:e,size:o=300,style:l,image:d,dotsOptions:s,backgroundOptions:g,imageOptions:r,cornersSquareOptions:c,cornersDotOptions:i,colorDark:t,colorLight:n,margin:a,errorCorrectionLevel:m})=>jsxRuntime.jsx(renderer.View,{style:[B.qrContainer,l],children:jsxRuntime.jsx(renderer.Image,{style:{width:o,height:o},src:h({url:e,width:o,height:o,image:d,dotsOptions:s||(t?{color:t}:void 0),backgroundOptions:g||(n?{color:n}:void 0),imageOptions:{...r,margin:r?.margin!==void 0?r.margin:a},cornersSquareOptions:c,cornersDotOptions:i,fallbackColorDark:t,fallbackColorLight:n,fallbackMargin:a,fallbackErrorCorrectionLevel:m})})}),U=P;
2
2
  exports.QR=I;exports.QRstyle=U;//# sourceMappingURL=index.cjs.map
3
3
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../frontend/src/components/core/qr/QRGenerator.ts","../../../frontend/src/components/core/qr/QR.tsx","../../../frontend/src/components/core/qr/QRstyleGenerator.ts","../../../frontend/src/components/core/qr/QRstyle.tsx"],"names":["generateQRAsBase64","value","size","colorDark","colorLight","margin","errorCorrectionLevel","options","QRCode","error","addLogoToQR","qrDataUrl","logoUrl","logoWidth","logoHeight","resolve","isBrowser","canvas","ctx","ImageConstructor","createCanvas","Image","e","qrImage","logoImage","x","y","finalQrDataUrl","err","styles","StyleSheet","errorLevelMap","QR","style","logo","setQrDataUrl","useState","useEffect","baseQrDataUrl","qrWithLogo","fallbackUrl","jsx","View","QR_default","generateQRV2AsBase64","QRCodeStylingConstructor","extraOptions","mod","jsdomName","canvasName","qrCommonName","jsdomMod","canvasMod","qrCommonMod","JSDOM","nodeCanvas","QRCodeStyling","width","height","qrOptions","rawData","reject","reader","QRV2","image","dotsOptions","backgroundOptions","imageOptions","cornersSquareOptions","cornersDotOptions","QRstyle_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import QRCode from \"qrcode\"\r\n\r\ninterface QROptions {\r\n value: string\r\n size?: number\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n logoImage?: string\r\n logoWidth?: number\r\n logoHeight?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nexport const generateQRAsBase64 = async ({\r\n value,\r\n size = 150,\r\n colorDark = \"#000000\",\r\n colorLight = \"#ffffff\",\r\n margin = 0,\r\n errorCorrectionLevel = \"M\",\r\n}: QROptions): Promise<string> => {\r\n try {\r\n // Configuración para QRCode\r\n const options = {\r\n errorCorrectionLevel: errorCorrectionLevel,\r\n type: \"image/png\" as const,\r\n quality: 0.92,\r\n margin: margin,\r\n color: {\r\n dark: colorDark,\r\n light: colorLight,\r\n },\r\n width: size,\r\n }\r\n\r\n // Generar el código QR como base64\r\n const qrDataUrl = QRCode.toDataURL(value, options)\r\n return qrDataUrl\r\n } catch (error) {\r\n console.error(\"Error generando QR:\", error)\r\n return \"\"\r\n }\r\n}\r\n\r\n// Función para añadir un logo al QR generado\r\nexport const addLogoToQR = async (\r\n qrDataUrl: string,\r\n logoUrl: string,\r\n logoWidth: number,\r\n logoHeight: number,\r\n): Promise<string> => {\r\n return new Promise(async (resolve) => {\r\n if (!qrDataUrl || !logoUrl) {\r\n resolve(qrDataUrl)\r\n return\r\n }\r\n\r\n try {\r\n const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\r\n let canvas: any;\r\n let ctx: any;\r\n let ImageConstructor: any;\r\n\r\n if (isBrowser) {\r\n canvas = document.createElement(\"canvas\")\r\n ctx = canvas.getContext(\"2d\")\r\n ImageConstructor = window.Image;\r\n } else {\r\n // Node environment\r\n try {\r\n // Use dynamic imports to avoid bundling canvas in browser build if possible\r\n // although typically 'canvas' is excluded from browser bundles or shimmed.\r\n const { createCanvas, Image } = await import('canvas');\r\n canvas = createCanvas(100, 100); // Initial size, will be resized\r\n ctx = canvas.getContext(\"2d\");\r\n ImageConstructor = Image;\r\n } catch (e) {\r\n console.error(\"Canvas not available in Node environment for addLogoToQR\", e);\r\n resolve(qrDataUrl);\r\n return;\r\n }\r\n }\r\n\r\n if (!ctx) {\r\n resolve(qrDataUrl)\r\n return\r\n }\r\n\r\n // Cargar la imagen del QR\r\n const qrImage = new ImageConstructor()\r\n // crossOrigin is only needed in browser usually, but node-canvas might support/ignore it\r\n if (isBrowser) qrImage.crossOrigin = \"anonymous\"\r\n \r\n qrImage.onload = () => {\r\n // Establecer el tamaño del canvas\r\n canvas.width = qrImage.width\r\n canvas.height = qrImage.height\r\n\r\n // Dibujar el QR en el canvas\r\n ctx.drawImage(qrImage, 0, 0, canvas.width, canvas.height)\r\n\r\n // Cargar el logo\r\n const logoImage = new ImageConstructor()\r\n if (isBrowser) logoImage.crossOrigin = \"anonymous\"\r\n \r\n logoImage.onload = () => {\r\n // Calcular la posición central para el logo\r\n const x = (canvas.width - logoWidth) / 2\r\n const y = (canvas.height - logoHeight) / 2\r\n\r\n // Dibujar un fondo blanco para el logo (opcional)\r\n ctx.fillStyle = \"#FFFFFF\"\r\n ctx.fillRect(x - 5, y - 5, logoWidth + 10, logoHeight + 10)\r\n\r\n // Dibujar el logo\r\n ctx.drawImage(logoImage, x, y, logoWidth, logoHeight)\r\n\r\n // Convertir el canvas a base64\r\n const finalQrDataUrl = canvas.toDataURL(\"image/png\")\r\n resolve(finalQrDataUrl)\r\n }\r\n\r\n logoImage.onerror = (err: any) => {\r\n console.error(\"Error cargando el logo:\", err)\r\n resolve(qrDataUrl) // Devolver el QR sin logo en caso de error\r\n }\r\n\r\n logoImage.src = logoUrl\r\n }\r\n\r\n qrImage.onerror = (err: any) => {\r\n console.error(\"Error cargando el QR:\", err)\r\n resolve(\"\")\r\n }\r\n\r\n qrImage.src = qrDataUrl\r\n } catch (error) {\r\n console.error(\"Error procesando el QR con logo:\", error)\r\n resolve(qrDataUrl) // Devolver el QR sin logo en caso de error\r\n }\r\n })\r\n}\r\n","import React,{ useEffect, useState } from \"react\"\r\nimport { Image, StyleSheet, View } from \"@react-pdf/renderer\"\r\nimport { generateQRAsBase64, addLogoToQR } from \"./QRGenerator\"\r\n\r\n// Define the props for the QR component\r\ninterface QRProps {\r\n value: string\r\n size?: number\r\n style?: any\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n logo?: string\r\n logoWidth?: number\r\n logoHeight?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n qrContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n margin: 10,\r\n },\r\n})\r\n\r\n// Mapa para convertir niveles de corrección numéricos a letras\r\nconst errorLevelMap: Record<number, \"L\" | \"M\" | \"Q\" | \"H\"> = {\r\n 0: \"L\",\r\n 1: \"M\",\r\n 2: \"Q\",\r\n 3: \"H\",\r\n}\r\n\r\n// Este componente funciona con React PDF\r\nconst QR: React.FC<QRProps> = ({\r\n value,\r\n size = 150,\r\n style,\r\n colorDark = \"#000000\",\r\n colorLight = \"#ffffff\",\r\n margin = 0,\r\n logo = \"\",\r\n logoWidth = 30,\r\n logoHeight = 30,\r\n errorCorrectionLevel = logo ? \"H\" : \"M\",\r\n}) => {\r\n const [qrDataUrl, setQrDataUrl] = useState<string>(\"\")\r\n\r\n // Generar el código QR cuando el componente se monta o cuando cambian las props\r\n useEffect(() => {\r\n const generateQR = async () => {\r\n try {\r\n // Primero generamos el QR básico\r\n const baseQrDataUrl = await generateQRAsBase64({\r\n value,\r\n size,\r\n colorDark,\r\n colorLight,\r\n margin,\r\n errorCorrectionLevel:\r\n typeof errorCorrectionLevel === \"number\"\r\n ? errorLevelMap[errorCorrectionLevel] || \"M\"\r\n : errorCorrectionLevel,\r\n })\r\n\r\n // Si hay un logo, lo añadimos al QR\r\n if (logo && logoWidth && logoHeight) {\r\n const qrWithLogo = await addLogoToQR(baseQrDataUrl, logo, logoWidth, logoHeight)\r\n setQrDataUrl(qrWithLogo)\r\n } else {\r\n setQrDataUrl(baseQrDataUrl)\r\n }\r\n } catch (error) {\r\n console.error(\"Error generando QR:\", error)\r\n // En caso de error, generamos un QR básico usando una API externa\r\n const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(\r\n value,\r\n )}&size=${size}x${size}&color=${encodeURIComponent(colorDark.replace(\"#\", \"\"))}&bgcolor=${encodeURIComponent(\r\n colorLight.replace(\"#\", \"\"),\r\n )}`\r\n setQrDataUrl(fallbackUrl)\r\n }\r\n }\r\n\r\n generateQR()\r\n }, [value, size, colorDark, colorLight, margin, logo, logoWidth, logoHeight, errorCorrectionLevel])\r\n\r\n // Mostrar un QR de respaldo mientras se genera el QR personalizado\r\n const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(\r\n value,\r\n )}&size=${size}x${size}`\r\n\r\n return (\r\n <View style={[styles.qrContainer, style]}>\r\n <Image src={qrDataUrl || fallbackUrl} style={{ width: size, height: size }} />\r\n </View>\r\n )\r\n}\r\n\r\nexport default QR\r\n\r\n","import { generateQRAsBase64 } from \"./QRGenerator\"\r\n\r\nexport interface QRV2Options {\r\n value: string\r\n width?: number\r\n height?: number\r\n image?: string\r\n dotsOptions?: {\r\n color?: string\r\n type?: \"rounded\" | \"dots\" | \"classy\" | \"classy-rounded\" | \"square\" | \"extra-rounded\"\r\n }\r\n backgroundOptions?: {\r\n color?: string\r\n }\r\n imageOptions?: {\r\n crossOrigin?: string\r\n margin?: number\r\n imageSize?: number // 0-1 (e.g., 0.4)\r\n }\r\n cornersSquareOptions?: {\r\n type?: \"dot\" | \"square\" | \"extra-rounded\"\r\n color?: string\r\n }\r\n cornersDotOptions?: {\r\n type?: \"dot\" | \"square\"\r\n color?: string\r\n }\r\n // Fallback options\r\n fallbackColorDark?: string\r\n fallbackColorLight?: string\r\n fallbackMargin?: number\r\n fallbackErrorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nexport const generateQRV2AsBase64 = async (options: QRV2Options): Promise<string> => {\r\n try {\r\n const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\r\n \r\n let QRCodeStylingConstructor: any;\r\n let extraOptions = {};\r\n\r\n if (isBrowser) {\r\n // Dynamic import for browser\r\n try {\r\n const mod = await import('qr-code-styling');\r\n QRCodeStylingConstructor = mod.default || mod;\r\n } catch (e) {\r\n console.error(\"Failed to load qr-code-styling in browser\", e);\r\n throw e;\r\n }\r\n } else {\r\n // Node environment\r\n // We use variable names to prevent bundlers (like Vite) from analyzing/bundling these dependencies\r\n // when building for the browser.\r\n const jsdomName = \"jsdom\";\r\n const canvasName = \"canvas\";\r\n const qrCommonName = \"qr-code-styling/lib/qr-code-styling.common.js\";\r\n \r\n try {\r\n const [jsdomMod, canvasMod, qrCommonMod] = await Promise.all([\r\n import(/* @vite-ignore */ jsdomName),\r\n import(/* @vite-ignore */ canvasName),\r\n import(/* @vite-ignore */ qrCommonName)\r\n ]);\r\n\r\n const { JSDOM } = jsdomMod;\r\n // canvas might be default export or named export depending on version/bundling\r\n const nodeCanvas = canvasMod.default || canvasMod;\r\n const { QRCodeStyling } = qrCommonMod;\r\n\r\n QRCodeStylingConstructor = QRCodeStyling;\r\n extraOptions = {\r\n jsdom: JSDOM,\r\n nodeCanvas: nodeCanvas\r\n };\r\n } catch (e) {\r\n console.error(\"Failed to load Node dependencies for QR generation\", e);\r\n throw e;\r\n }\r\n }\r\n\r\n const width = typeof options.width === \"number\" && isFinite(options.width) ? Math.round(options.width) : 300;\r\n const height = typeof options.height === \"number\" && isFinite(options.height) ? Math.round(options.height) : 300;\r\n \r\n\r\n const qrOptions = {\r\n width,\r\n height,\r\n data: options.value,\r\n image: options.image,\r\n dotsOptions: options.dotsOptions,\r\n backgroundOptions: {\r\n // Default to white background if not specified to prevent transparency issues\r\n // The \"blue stripe\" or weird artifacts can happen if the background is transparent or handled incorrectly\r\n color: options.backgroundOptions?.color || \"#ffffff\",\r\n ...options.backgroundOptions\r\n },\r\n imageOptions: {\r\n crossOrigin: \"anonymous\",\r\n margin: typeof options.imageOptions?.margin === \"number\" && isFinite(options.imageOptions.margin) ? options.imageOptions.margin : 0,\r\n saveAsBlob: true,\r\n imageSize: typeof options.imageOptions?.imageSize === \"number\" && isFinite(options.imageOptions.imageSize)\r\n ? Math.max(0, Math.min(1, options.imageOptions.imageSize))\r\n : 0.4,\r\n },\r\n cornersSquareOptions: options.cornersSquareOptions,\r\n cornersDotOptions: options.cornersDotOptions,\r\n }\r\n\r\n // @ts-ignore\r\n const qrCodeImage = new QRCodeStylingConstructor({\r\n type: \"png\", // Force PNG type\r\n ...extraOptions,\r\n ...qrOptions,\r\n })\r\n\r\n const rawData = await qrCodeImage.getRawData(\"png\")\r\n \r\n if (!rawData) throw new Error(\"Failed to generate raw data from qr-code-styling\")\r\n\r\n // Handle Blob (Browser) vs Buffer (Node)\r\n if (isBrowser) {\r\n if (rawData instanceof Blob) {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n if (typeof reader.result === 'string') {\r\n resolve(reader.result);\r\n } else {\r\n reject(new Error(\"Failed to convert blob to base64\"));\r\n }\r\n };\r\n reader.onerror = reject;\r\n reader.readAsDataURL(rawData);\r\n });\r\n } else {\r\n // Sometimes in browser it might return something else if configured differently?\r\n // But usually Blob.\r\n console.warn(\"Unexpected rawData type in browser:\", rawData);\r\n }\r\n } \r\n \r\n // Node environment usually returns Buffer\r\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(rawData)) {\r\n return `data:image/png;base64,${rawData.toString(\"base64\")}`;\r\n }\r\n \r\n // Fallback if type is unexpected\r\n // Try to handle if it's a blob-like object in Node (unlikely but possible with polyfills)\r\n throw new Error(`Unexpected raw data type: ${typeof rawData}`);\r\n\r\n } catch (error) {\r\n console.error(\"Error generating QR V2, falling back to V1:\", error)\r\n \r\n // Fallback to existing implementation\r\n return generateQRAsBase64({\r\n value: options.value,\r\n size: options.width,\r\n colorDark: options.fallbackColorDark || options.dotsOptions?.color,\r\n colorLight: options.fallbackColorLight || options.backgroundOptions?.color,\r\n margin: options.fallbackMargin || 0,\r\n errorCorrectionLevel: options.fallbackErrorCorrectionLevel || \"M\",\r\n })\r\n }\r\n}\r\n","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { Image, StyleSheet, View } from \"@react-pdf/renderer\"\r\nimport { generateQRV2AsBase64, type QRV2Options } from \"./QRstyleGenerator\"\r\n\r\n// Define props\r\nexport interface QRV2Props {\r\n value: string\r\n size?: number\r\n style?: any\r\n image?: string\r\n dotsOptions?: QRV2Options[\"dotsOptions\"]\r\n backgroundOptions?: QRV2Options[\"backgroundOptions\"]\r\n imageOptions?: QRV2Options[\"imageOptions\"]\r\n cornersSquareOptions?: QRV2Options[\"cornersSquareOptions\"]\r\n cornersDotOptions?: QRV2Options[\"cornersDotOptions\"]\r\n // Fallback/Compatibility props\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n qrContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n})\r\n\r\nconst QRV2: React.FC<QRV2Props> = ({\r\n value,\r\n size = 300,\r\n style,\r\n image,\r\n dotsOptions,\r\n backgroundOptions,\r\n imageOptions,\r\n cornersSquareOptions,\r\n cornersDotOptions,\r\n colorDark,\r\n colorLight,\r\n margin,\r\n errorCorrectionLevel,\r\n}) => {\r\n return (\r\n <View style={[styles.qrContainer, style]}>\r\n {/* We pass a function that returns the promise/result or use the state if available. \r\n Actually, we can pass the promise directly to src! */}\r\n <Image \r\n style={{ width: size, height: size }} \r\n src={generateQRV2AsBase64({\r\n value,\r\n width: size,\r\n height: size,\r\n image,\r\n dotsOptions: dotsOptions || (colorDark ? { color: colorDark } : undefined),\r\n backgroundOptions: backgroundOptions || (colorLight ? { color: colorLight } : undefined),\r\n imageOptions: {\r\n ...imageOptions,\r\n margin: imageOptions?.margin !== undefined ? imageOptions.margin : margin\r\n },\r\n cornersSquareOptions,\r\n cornersDotOptions,\r\n fallbackColorDark: colorDark,\r\n fallbackColorLight: colorLight,\r\n fallbackMargin: margin,\r\n fallbackErrorCorrectionLevel: errorCorrectionLevel,\r\n })} \r\n />\r\n </View>\r\n )\r\n}\r\n\r\nexport default QRV2\r\n"]}
1
+ {"version":3,"sources":["../../../frontend/src/components/core/qr/QRGenerator.ts","../../../frontend/src/components/core/qr/QR.tsx","../../../frontend/src/components/core/qr/QRstyleGenerator.ts","../../../frontend/src/components/core/qr/QRstyle.tsx"],"names":["generateQRAsBase64","url","size","colorDark","colorLight","margin","errorCorrectionLevel","options","QRCode","error","addLogoToQR","qrDataUrl","logoUrl","logoWidth","logoHeight","resolve","isBrowser","canvas","ctx","ImageConstructor","createCanvas","Image","e","qrImage","logoImage","x","y","finalQrDataUrl","err","styles","StyleSheet","errorLevelMap","QR","style","logo","setQrDataUrl","useState","useEffect","baseQrDataUrl","qrWithLogo","fallbackUrl","jsx","View","QR_default","generateQRV2AsBase64","QRCodeStylingConstructor","extraOptions","mod","jsdomName","canvasName","qrCommonName","jsdomMod","canvasMod","qrCommonMod","JSDOM","nodeCanvas","QRCodeStyling","width","height","qrOptions","rawData","reject","reader","QRV2","image","dotsOptions","backgroundOptions","imageOptions","cornersSquareOptions","cornersDotOptions","QRstyle_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import QRCode from \"qrcode\"\r\n\r\ninterface QROptions {\r\n url: string\r\n size?: number\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n logoImage?: string\r\n logoWidth?: number\r\n logoHeight?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nexport const generateQRAsBase64 = async ({\r\n url,\r\n size = 150,\r\n colorDark = \"#000000\",\r\n colorLight = \"#ffffff\",\r\n margin = 0,\r\n errorCorrectionLevel = \"M\",\r\n}: QROptions): Promise<string> => {\r\n try {\r\n // Configuración para QRCode\r\n const options = {\r\n errorCorrectionLevel: errorCorrectionLevel,\r\n type: \"image/png\" as const,\r\n quality: 0.92,\r\n margin: margin,\r\n color: {\r\n dark: colorDark,\r\n light: colorLight,\r\n },\r\n width: size,\r\n }\r\n\r\n // Generar el código QR como base64\r\n const qrDataUrl = QRCode.toDataURL(url, options)\r\n return qrDataUrl\r\n } catch (error) {\r\n console.error(\"Error generando QR:\", error)\r\n return \"\"\r\n }\r\n}\r\n\r\n// Función para añadir un logo al QR generado\r\nexport const addLogoToQR = async (\r\n qrDataUrl: string,\r\n logoUrl: string,\r\n logoWidth: number,\r\n logoHeight: number,\r\n): Promise<string> => {\r\n return new Promise(async (resolve) => {\r\n if (!qrDataUrl || !logoUrl) {\r\n resolve(qrDataUrl)\r\n return\r\n }\r\n\r\n try {\r\n const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\r\n let canvas: any;\r\n let ctx: any;\r\n let ImageConstructor: any;\r\n\r\n if (isBrowser) {\r\n canvas = document.createElement(\"canvas\")\r\n ctx = canvas.getContext(\"2d\")\r\n ImageConstructor = window.Image;\r\n } else {\r\n // Node environment\r\n try {\r\n // Use dynamic imports to avoid bundling canvas in browser build if possible\r\n // although typically 'canvas' is excluded from browser bundles or shimmed.\r\n const { createCanvas, Image } = await import('canvas');\r\n canvas = createCanvas(100, 100); // Initial size, will be resized\r\n ctx = canvas.getContext(\"2d\");\r\n ImageConstructor = Image;\r\n } catch (e) {\r\n console.error(\"Canvas not available in Node environment for addLogoToQR\", e);\r\n resolve(qrDataUrl);\r\n return;\r\n }\r\n }\r\n\r\n if (!ctx) {\r\n resolve(qrDataUrl)\r\n return\r\n }\r\n\r\n // Cargar la imagen del QR\r\n const qrImage = new ImageConstructor()\r\n // crossOrigin is only needed in browser usually, but node-canvas might support/ignore it\r\n if (isBrowser) qrImage.crossOrigin = \"anonymous\"\r\n \r\n qrImage.onload = () => {\r\n // Establecer el tamaño del canvas\r\n canvas.width = qrImage.width\r\n canvas.height = qrImage.height\r\n\r\n // Dibujar el QR en el canvas\r\n ctx.drawImage(qrImage, 0, 0, canvas.width, canvas.height)\r\n\r\n // Cargar el logo\r\n const logoImage = new ImageConstructor()\r\n if (isBrowser) logoImage.crossOrigin = \"anonymous\"\r\n \r\n logoImage.onload = () => {\r\n // Calcular la posición central para el logo\r\n const x = (canvas.width - logoWidth) / 2\r\n const y = (canvas.height - logoHeight) / 2\r\n\r\n // Dibujar un fondo blanco para el logo (opcional)\r\n ctx.fillStyle = \"#FFFFFF\"\r\n ctx.fillRect(x - 5, y - 5, logoWidth + 10, logoHeight + 10)\r\n\r\n // Dibujar el logo\r\n ctx.drawImage(logoImage, x, y, logoWidth, logoHeight)\r\n\r\n // Convertir el canvas a base64\r\n const finalQrDataUrl = canvas.toDataURL(\"image/png\")\r\n resolve(finalQrDataUrl)\r\n }\r\n\r\n logoImage.onerror = (err: any) => {\r\n console.error(\"Error cargando el logo:\", err)\r\n resolve(qrDataUrl) // Devolver el QR sin logo en caso de error\r\n }\r\n\r\n logoImage.src = logoUrl\r\n }\r\n\r\n qrImage.onerror = (err: any) => {\r\n console.error(\"Error cargando el QR:\", err)\r\n resolve(\"\")\r\n }\r\n\r\n qrImage.src = qrDataUrl\r\n } catch (error) {\r\n console.error(\"Error procesando el QR con logo:\", error)\r\n resolve(qrDataUrl) // Devolver el QR sin logo en caso de error\r\n }\r\n })\r\n}\r\n","import React,{ useEffect, useState } from \"react\"\r\nimport { Image, StyleSheet, View } from \"@react-pdf/renderer\"\r\nimport { generateQRAsBase64, addLogoToQR } from \"./QRGenerator\"\r\n\r\n// Define the props for the QR component\r\ninterface QRProps {\r\n url: string\r\n size?: number\r\n style?: any\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n logo?: string\r\n logoWidth?: number\r\n logoHeight?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n qrContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n margin: 10,\r\n },\r\n})\r\n\r\n// Mapa para convertir niveles de corrección numéricos a letras\r\nconst errorLevelMap: Record<number, \"L\" | \"M\" | \"Q\" | \"H\"> = {\r\n 0: \"L\",\r\n 1: \"M\",\r\n 2: \"Q\",\r\n 3: \"H\",\r\n}\r\n\r\n// Este componente funciona con React PDF\r\nconst QR: React.FC<QRProps> = ({\r\n url,\r\n size = 150,\r\n style,\r\n colorDark = \"#000000\",\r\n colorLight = \"#ffffff\",\r\n margin = 0,\r\n logo = \"\",\r\n logoWidth = 30,\r\n logoHeight = 30,\r\n errorCorrectionLevel = logo ? \"H\" : \"M\",\r\n}) => {\r\n const [qrDataUrl, setQrDataUrl] = useState<string>(\"\")\r\n\r\n // Generar el código QR cuando el componente se monta o cuando cambian las props\r\n useEffect(() => {\r\n const generateQR = async () => {\r\n try {\r\n // Primero generamos el QR básico\r\n const baseQrDataUrl = await generateQRAsBase64({\r\n url,\r\n size,\r\n colorDark,\r\n colorLight,\r\n margin,\r\n errorCorrectionLevel:\r\n typeof errorCorrectionLevel === \"number\"\r\n ? errorLevelMap[errorCorrectionLevel] || \"M\"\r\n : errorCorrectionLevel,\r\n })\r\n\r\n // Si hay un logo, lo añadimos al QR\r\n if (logo && logoWidth && logoHeight) {\r\n const qrWithLogo = await addLogoToQR(baseQrDataUrl, logo, logoWidth, logoHeight)\r\n setQrDataUrl(qrWithLogo)\r\n } else {\r\n setQrDataUrl(baseQrDataUrl)\r\n }\r\n } catch (error) {\r\n console.error(\"Error generando QR:\", error)\r\n // En caso de error, generamos un QR básico usando una API externa\r\n const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(\r\n url,\r\n )}&size=${size}x${size}&color=${encodeURIComponent(colorDark.replace(\"#\", \"\"))}&bgcolor=${encodeURIComponent(\r\n colorLight.replace(\"#\", \"\"),\r\n )}`\r\n setQrDataUrl(fallbackUrl)\r\n }\r\n }\r\n\r\n generateQR()\r\n }, [url, size, colorDark, colorLight, margin, logo, logoWidth, logoHeight, errorCorrectionLevel])\r\n\r\n // Mostrar un QR de respaldo mientras se genera el QR personalizado\r\n const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(\r\n url,\r\n )}&size=${size}x${size}`\r\n\r\n return (\r\n <View style={[styles.qrContainer, style]}>\r\n <Image src={qrDataUrl || fallbackUrl} style={{ width: size, height: size }} />\r\n </View>\r\n )\r\n}\r\n\r\nexport default QR\r\n\r\n","import { generateQRAsBase64 } from \"./QRGenerator\"\r\n\r\nexport interface QRV2Options {\r\n url: string\r\n width?: number\r\n height?: number\r\n image?: string\r\n dotsOptions?: {\r\n color?: string\r\n type?: \"rounded\" | \"dots\" | \"classy\" | \"classy-rounded\" | \"square\" | \"extra-rounded\"\r\n }\r\n backgroundOptions?: {\r\n color?: string\r\n }\r\n imageOptions?: {\r\n crossOrigin?: string\r\n margin?: number\r\n imageSize?: number // 0-1 (e.g., 0.4)\r\n }\r\n cornersSquareOptions?: {\r\n type?: \"dot\" | \"square\" | \"extra-rounded\"\r\n color?: string\r\n }\r\n cornersDotOptions?: {\r\n type?: \"dot\" | \"square\"\r\n color?: string\r\n }\r\n // Fallback options\r\n fallbackColorDark?: string\r\n fallbackColorLight?: string\r\n fallbackMargin?: number\r\n fallbackErrorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nexport const generateQRV2AsBase64 = async (options: QRV2Options): Promise<string> => {\r\n try {\r\n const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\r\n \r\n let QRCodeStylingConstructor: any;\r\n let extraOptions = {};\r\n\r\n if (isBrowser) {\r\n // Dynamic import for browser\r\n try {\r\n const mod = await import('qr-code-styling');\r\n QRCodeStylingConstructor = mod.default || mod;\r\n } catch (e) {\r\n console.error(\"Failed to load qr-code-styling in browser\", e);\r\n throw e;\r\n }\r\n } else {\r\n // Node environment\r\n // We use variable names to prevent bundlers (like Vite) from analyzing/bundling these dependencies\r\n // when building for the browser.\r\n const jsdomName = \"jsdom\";\r\n const canvasName = \"canvas\";\r\n const qrCommonName = \"qr-code-styling/lib/qr-code-styling.common.js\";\r\n \r\n try {\r\n const [jsdomMod, canvasMod, qrCommonMod] = await Promise.all([\r\n import(/* @vite-ignore */ jsdomName),\r\n import(/* @vite-ignore */ canvasName),\r\n import(/* @vite-ignore */ qrCommonName)\r\n ]);\r\n\r\n const { JSDOM } = jsdomMod;\r\n // canvas might be default export or named export depending on version/bundling\r\n const nodeCanvas = canvasMod.default || canvasMod;\r\n const { QRCodeStyling } = qrCommonMod;\r\n\r\n QRCodeStylingConstructor = QRCodeStyling;\r\n extraOptions = {\r\n jsdom: JSDOM,\r\n nodeCanvas: nodeCanvas\r\n };\r\n } catch (e) {\r\n console.error(\"Failed to load Node dependencies for QR generation\", e);\r\n throw e;\r\n }\r\n }\r\n\r\n const width = typeof options.width === \"number\" && isFinite(options.width) ? Math.round(options.width) : 300;\r\n const height = typeof options.height === \"number\" && isFinite(options.height) ? Math.round(options.height) : 300;\r\n \r\n\r\n const qrOptions = {\r\n width,\r\n height,\r\n data: options.url,\r\n image: options.image,\r\n dotsOptions: options.dotsOptions,\r\n backgroundOptions: {\r\n // Default to white background if not specified to prevent transparency issues\r\n // The \"blue stripe\" or weird artifacts can happen if the background is transparent or handled incorrectly\r\n color: options.backgroundOptions?.color || \"#ffffff\",\r\n ...options.backgroundOptions\r\n },\r\n imageOptions: {\r\n crossOrigin: \"anonymous\",\r\n margin: typeof options.imageOptions?.margin === \"number\" && isFinite(options.imageOptions.margin) ? options.imageOptions.margin : 0,\r\n saveAsBlob: true,\r\n imageSize: typeof options.imageOptions?.imageSize === \"number\" && isFinite(options.imageOptions.imageSize)\r\n ? Math.max(0, Math.min(1, options.imageOptions.imageSize))\r\n : 0.4,\r\n },\r\n cornersSquareOptions: options.cornersSquareOptions,\r\n cornersDotOptions: options.cornersDotOptions,\r\n }\r\n\r\n // @ts-ignore\r\n const qrCodeImage = new QRCodeStylingConstructor({\r\n type: \"png\", // Force PNG type\r\n ...extraOptions,\r\n ...qrOptions,\r\n })\r\n\r\n const rawData = await qrCodeImage.getRawData(\"png\")\r\n \r\n if (!rawData) throw new Error(\"Failed to generate raw data from qr-code-styling\")\r\n\r\n // Handle Blob (Browser) vs Buffer (Node)\r\n if (isBrowser) {\r\n if (rawData instanceof Blob) {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n if (typeof reader.result === 'string') {\r\n resolve(reader.result);\r\n } else {\r\n reject(new Error(\"Failed to convert blob to base64\"));\r\n }\r\n };\r\n reader.onerror = reject;\r\n reader.readAsDataURL(rawData);\r\n });\r\n } else {\r\n // Sometimes in browser it might return something else if configured differently?\r\n // But usually Blob.\r\n console.warn(\"Unexpected rawData type in browser:\", rawData);\r\n }\r\n } \r\n \r\n // Node environment usually returns Buffer\r\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(rawData)) {\r\n return `data:image/png;base64,${rawData.toString(\"base64\")}`;\r\n }\r\n \r\n // Fallback if type is unexpected\r\n // Try to handle if it's a blob-like object in Node (unlikely but possible with polyfills)\r\n throw new Error(`Unexpected raw data type: ${typeof rawData}`);\r\n\r\n } catch (error) {\r\n console.error(\"Error generating QR V2, falling back to V1:\", error)\r\n \r\n // Fallback to existing implementation\r\n return generateQRAsBase64({\r\n url: options.url,\r\n size: options.width,\r\n colorDark: options.fallbackColorDark || options.dotsOptions?.color,\r\n colorLight: options.fallbackColorLight || options.backgroundOptions?.color,\r\n margin: options.fallbackMargin || 0,\r\n errorCorrectionLevel: options.fallbackErrorCorrectionLevel || \"M\",\r\n })\r\n }\r\n}\r\n","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { Image, StyleSheet, View } from \"@react-pdf/renderer\"\r\nimport { generateQRV2AsBase64, type QRV2Options } from \"./QRstyleGenerator\"\r\n\r\n// Define props\r\nexport interface QRV2Props {\r\n url: string\r\n size?: number\r\n style?: any\r\n image?: string\r\n dotsOptions?: QRV2Options[\"dotsOptions\"]\r\n backgroundOptions?: QRV2Options[\"backgroundOptions\"]\r\n imageOptions?: QRV2Options[\"imageOptions\"]\r\n cornersSquareOptions?: QRV2Options[\"cornersSquareOptions\"]\r\n cornersDotOptions?: QRV2Options[\"cornersDotOptions\"]\r\n // Fallback/Compatibility props\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n qrContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n})\r\n\r\nconst QRV2: React.FC<QRV2Props> = ({\r\n url,\r\n size = 300,\r\n style,\r\n image,\r\n dotsOptions,\r\n backgroundOptions,\r\n imageOptions,\r\n cornersSquareOptions,\r\n cornersDotOptions,\r\n colorDark,\r\n colorLight,\r\n margin,\r\n errorCorrectionLevel,\r\n}) => {\r\n return (\r\n <View style={[styles.qrContainer, style]}>\r\n {/* We pass a function that returns the promise/result or use the state if available. \r\n Actually, we can pass the promise directly to src! */}\r\n <Image \r\n style={{ width: size, height: size }} \r\n src={generateQRV2AsBase64({\r\n url,\r\n width: size,\r\n height: size,\r\n image,\r\n dotsOptions: dotsOptions || (colorDark ? { color: colorDark } : undefined),\r\n backgroundOptions: backgroundOptions || (colorLight ? { color: colorLight } : undefined),\r\n imageOptions: {\r\n ...imageOptions,\r\n margin: imageOptions?.margin !== undefined ? imageOptions.margin : margin\r\n },\r\n cornersSquareOptions,\r\n cornersDotOptions,\r\n fallbackColorDark: colorDark,\r\n fallbackColorLight: colorLight,\r\n fallbackMargin: margin,\r\n fallbackErrorCorrectionLevel: errorCorrectionLevel,\r\n })} \r\n />\r\n </View>\r\n )\r\n}\r\n\r\nexport default QRV2\r\n"]}
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
 
3
3
  interface QRProps {
4
- value: string;
4
+ url: string;
5
5
  size?: number;
6
6
  style?: any;
7
7
  colorDark?: string;
@@ -15,7 +15,7 @@ interface QRProps {
15
15
  declare const QR: React.FC<QRProps>;
16
16
 
17
17
  interface QRV2Options {
18
- value: string;
18
+ url: string;
19
19
  width?: number;
20
20
  height?: number;
21
21
  image?: string;
@@ -46,7 +46,7 @@ interface QRV2Options {
46
46
  }
47
47
 
48
48
  interface QRV2Props {
49
- value: string;
49
+ url: string;
50
50
  size?: number;
51
51
  style?: any;
52
52
  image?: string;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
 
3
3
  interface QRProps {
4
- value: string;
4
+ url: string;
5
5
  size?: number;
6
6
  style?: any;
7
7
  colorDark?: string;
@@ -15,7 +15,7 @@ interface QRProps {
15
15
  declare const QR: React.FC<QRProps>;
16
16
 
17
17
  interface QRV2Options {
18
- value: string;
18
+ url: string;
19
19
  width?: number;
20
20
  height?: number;
21
21
  image?: string;
@@ -46,7 +46,7 @@ interface QRV2Options {
46
46
  }
47
47
 
48
48
  interface QRV2Props {
49
- value: string;
49
+ url: string;
50
50
  size?: number;
51
51
  style?: any;
52
52
  image?: string;
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import {useState,useEffect}from'react';import {StyleSheet,View,Image}from'@react-pdf/renderer';import C from'qrcode';import {jsx}from'react/jsx-runtime';var y=async({value:e,size:o=150,colorDark:l="#000000",colorLight:d="#ffffff",margin:s=0,errorCorrectionLevel:g="M"})=>{try{let r={errorCorrectionLevel:g,type:"image/png",quality:.92,margin:s,color:{dark:l,light:d},width:o};return C.toDataURL(e,r)}catch(r){return console.error("Error generando QR:",r),""}},b=async(e,o,l,d)=>new Promise(async s=>{if(!e||!o){s(e);return}try{let g=typeof window<"u"&&typeof window.document<"u",r,c,i;if(g)r=document.createElement("canvas"),c=r.getContext("2d"),i=window.Image;else try{let{createCanvas:n,Image:a}=await import('canvas');r=n(100,100),c=r.getContext("2d"),i=a;}catch(n){console.error("Canvas not available in Node environment for addLogoToQR",n),s(e);return}if(!c){s(e);return}let t=new i;g&&(t.crossOrigin="anonymous"),t.onload=()=>{r.width=t.width,r.height=t.height,c.drawImage(t,0,0,r.width,r.height);let n=new i;g&&(n.crossOrigin="anonymous"),n.onload=()=>{let a=(r.width-l)/2,m=(r.height-d)/2;c.fillStyle="#FFFFFF",c.fillRect(a-5,m-5,l+10,d+10),c.drawImage(n,a,m,l,d);let p=r.toDataURL("image/png");s(p);},n.onerror=a=>{console.error("Error cargando el logo:",a),s(e);},n.src=o;},t.onerror=n=>{console.error("Error cargando el QR:",n),s("");},t.src=e;}catch(g){console.error("Error procesando el QR con logo:",g),s(e);}});var x=StyleSheet.create({qrContainer:{display:"flex",alignItems:"center",justifyContent:"center",margin:10}}),S={0:"L",1:"M",2:"Q",3:"H"},V=({value:e,size:o=150,style:l,colorDark:d="#000000",colorLight:s="#ffffff",margin:g=0,logo:r="",logoWidth:c=30,logoHeight:i=30,errorCorrectionLevel:t=r?"H":"M"})=>{let[n,a]=useState("");useEffect(()=>{(async()=>{try{let f=await y({value:e,size:o,colorDark:d,colorLight:s,margin:g,errorCorrectionLevel:typeof t=="number"?S[t]||"M":t});if(r&&c&&i){let u=await b(f,r,c,i);a(u);}else a(f);}catch(f){console.error("Error generando QR:",f);let u=`https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(e)}&size=${o}x${o}&color=${encodeURIComponent(d.replace("#",""))}&bgcolor=${encodeURIComponent(s.replace("#",""))}`;a(u);}})();},[e,o,d,s,g,r,c,i,t]);let m=`https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(e)}&size=${o}x${o}`;return jsx(View,{style:[x.qrContainer,l],children:jsx(Image,{src:n||m,style:{width:o,height:o}})})},I=V;var h=async e=>{try{let o=typeof window<"u"&&typeof window.document<"u",l,d={};if(o)try{let t=await import('qr-code-styling');l=t.default||t;}catch(t){throw console.error("Failed to load qr-code-styling in browser",t),t}else {let t="jsdom",n="canvas",a="qr-code-styling/lib/qr-code-styling.common.js";try{let[m,p,f]=await Promise.all([import(t),import(n),import(a)]),{JSDOM:u}=m,O=p.default||p,{QRCodeStyling:Q}=f;l=Q,d={jsdom:u,nodeCanvas:O};}catch(m){throw console.error("Failed to load Node dependencies for QR generation",m),m}}let s=typeof e.width=="number"&&isFinite(e.width)?Math.round(e.width):300,g=typeof e.height=="number"&&isFinite(e.height)?Math.round(e.height):300,r={width:s,height:g,data:e.value,image:e.image,dotsOptions:e.dotsOptions,backgroundOptions:{color:e.backgroundOptions?.color||"#ffffff",...e.backgroundOptions},imageOptions:{crossOrigin:"anonymous",margin:typeof e.imageOptions?.margin=="number"&&isFinite(e.imageOptions.margin)?e.imageOptions.margin:0,saveAsBlob:!0,imageSize:typeof e.imageOptions?.imageSize=="number"&&isFinite(e.imageOptions.imageSize)?Math.max(0,Math.min(1,e.imageOptions.imageSize)):.4},cornersSquareOptions:e.cornersSquareOptions,cornersDotOptions:e.cornersDotOptions},i=await new l({type:"png",...d,...r}).getRawData("png");if(!i)throw new Error("Failed to generate raw data from qr-code-styling");if(o){if(i instanceof Blob)return new Promise((t,n)=>{let a=new FileReader;a.onloadend=()=>{typeof a.result=="string"?t(a.result):n(new Error("Failed to convert blob to base64"));},a.onerror=n,a.readAsDataURL(i);});console.warn("Unexpected rawData type in browser:",i);}if(typeof Buffer<"u"&&Buffer.isBuffer(i))return `data:image/png;base64,${i.toString("base64")}`;throw new Error(`Unexpected raw data type: ${typeof i}`)}catch(o){return console.error("Error generating QR V2, falling back to V1:",o),y({value:e.value,size:e.width,colorDark:e.fallbackColorDark||e.dotsOptions?.color,colorLight:e.fallbackColorLight||e.backgroundOptions?.color,margin:e.fallbackMargin||0,errorCorrectionLevel:e.fallbackErrorCorrectionLevel||"M"})}};var B=StyleSheet.create({qrContainer:{display:"flex",alignItems:"center",justifyContent:"center"}}),P=({value:e,size:o=300,style:l,image:d,dotsOptions:s,backgroundOptions:g,imageOptions:r,cornersSquareOptions:c,cornersDotOptions:i,colorDark:t,colorLight:n,margin:a,errorCorrectionLevel:m})=>jsx(View,{style:[B.qrContainer,l],children:jsx(Image,{style:{width:o,height:o},src:h({value:e,width:o,height:o,image:d,dotsOptions:s||(t?{color:t}:void 0),backgroundOptions:g||(n?{color:n}:void 0),imageOptions:{...r,margin:r?.margin!==void 0?r.margin:a},cornersSquareOptions:c,cornersDotOptions:i,fallbackColorDark:t,fallbackColorLight:n,fallbackMargin:a,fallbackErrorCorrectionLevel:m})})}),U=P;
1
+ import {useState,useEffect}from'react';import {StyleSheet,View,Image}from'@react-pdf/renderer';import C from'qrcode';import {jsx}from'react/jsx-runtime';var y=async({url:e,size:o=150,colorDark:l="#000000",colorLight:d="#ffffff",margin:s=0,errorCorrectionLevel:g="M"})=>{try{let r={errorCorrectionLevel:g,type:"image/png",quality:.92,margin:s,color:{dark:l,light:d},width:o};return C.toDataURL(e,r)}catch(r){return console.error("Error generando QR:",r),""}},b=async(e,o,l,d)=>new Promise(async s=>{if(!e||!o){s(e);return}try{let g=typeof window<"u"&&typeof window.document<"u",r,c,i;if(g)r=document.createElement("canvas"),c=r.getContext("2d"),i=window.Image;else try{let{createCanvas:n,Image:a}=await import('canvas');r=n(100,100),c=r.getContext("2d"),i=a;}catch(n){console.error("Canvas not available in Node environment for addLogoToQR",n),s(e);return}if(!c){s(e);return}let t=new i;g&&(t.crossOrigin="anonymous"),t.onload=()=>{r.width=t.width,r.height=t.height,c.drawImage(t,0,0,r.width,r.height);let n=new i;g&&(n.crossOrigin="anonymous"),n.onload=()=>{let a=(r.width-l)/2,m=(r.height-d)/2;c.fillStyle="#FFFFFF",c.fillRect(a-5,m-5,l+10,d+10),c.drawImage(n,a,m,l,d);let p=r.toDataURL("image/png");s(p);},n.onerror=a=>{console.error("Error cargando el logo:",a),s(e);},n.src=o;},t.onerror=n=>{console.error("Error cargando el QR:",n),s("");},t.src=e;}catch(g){console.error("Error procesando el QR con logo:",g),s(e);}});var S=StyleSheet.create({qrContainer:{display:"flex",alignItems:"center",justifyContent:"center",margin:10}}),V={0:"L",1:"M",2:"Q",3:"H"},v=({url:e,size:o=150,style:l,colorDark:d="#000000",colorLight:s="#ffffff",margin:g=0,logo:r="",logoWidth:c=30,logoHeight:i=30,errorCorrectionLevel:t=r?"H":"M"})=>{let[n,a]=useState("");useEffect(()=>{(async()=>{try{let f=await y({url:e,size:o,colorDark:d,colorLight:s,margin:g,errorCorrectionLevel:typeof t=="number"?V[t]||"M":t});if(r&&c&&i){let u=await b(f,r,c,i);a(u);}else a(f);}catch(f){console.error("Error generando QR:",f);let u=`https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(e)}&size=${o}x${o}&color=${encodeURIComponent(d.replace("#",""))}&bgcolor=${encodeURIComponent(s.replace("#",""))}`;a(u);}})();},[e,o,d,s,g,r,c,i,t]);let m=`https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(e)}&size=${o}x${o}`;return jsx(View,{style:[S.qrContainer,l],children:jsx(Image,{src:n||m,style:{width:o,height:o}})})},I=v;var h=async e=>{try{let o=typeof window<"u"&&typeof window.document<"u",l,d={};if(o)try{let t=await import('qr-code-styling');l=t.default||t;}catch(t){throw console.error("Failed to load qr-code-styling in browser",t),t}else {let t="jsdom",n="canvas",a="qr-code-styling/lib/qr-code-styling.common.js";try{let[m,p,f]=await Promise.all([import(t),import(n),import(a)]),{JSDOM:u}=m,O=p.default||p,{QRCodeStyling:Q}=f;l=Q,d={jsdom:u,nodeCanvas:O};}catch(m){throw console.error("Failed to load Node dependencies for QR generation",m),m}}let s=typeof e.width=="number"&&isFinite(e.width)?Math.round(e.width):300,g=typeof e.height=="number"&&isFinite(e.height)?Math.round(e.height):300,r={width:s,height:g,data:e.url,image:e.image,dotsOptions:e.dotsOptions,backgroundOptions:{color:e.backgroundOptions?.color||"#ffffff",...e.backgroundOptions},imageOptions:{crossOrigin:"anonymous",margin:typeof e.imageOptions?.margin=="number"&&isFinite(e.imageOptions.margin)?e.imageOptions.margin:0,saveAsBlob:!0,imageSize:typeof e.imageOptions?.imageSize=="number"&&isFinite(e.imageOptions.imageSize)?Math.max(0,Math.min(1,e.imageOptions.imageSize)):.4},cornersSquareOptions:e.cornersSquareOptions,cornersDotOptions:e.cornersDotOptions},i=await new l({type:"png",...d,...r}).getRawData("png");if(!i)throw new Error("Failed to generate raw data from qr-code-styling");if(o){if(i instanceof Blob)return new Promise((t,n)=>{let a=new FileReader;a.onloadend=()=>{typeof a.result=="string"?t(a.result):n(new Error("Failed to convert blob to base64"));},a.onerror=n,a.readAsDataURL(i);});console.warn("Unexpected rawData type in browser:",i);}if(typeof Buffer<"u"&&Buffer.isBuffer(i))return `data:image/png;base64,${i.toString("base64")}`;throw new Error(`Unexpected raw data type: ${typeof i}`)}catch(o){return console.error("Error generating QR V2, falling back to V1:",o),y({url:e.url,size:e.width,colorDark:e.fallbackColorDark||e.dotsOptions?.color,colorLight:e.fallbackColorLight||e.backgroundOptions?.color,margin:e.fallbackMargin||0,errorCorrectionLevel:e.fallbackErrorCorrectionLevel||"M"})}};var B=StyleSheet.create({qrContainer:{display:"flex",alignItems:"center",justifyContent:"center"}}),P=({url:e,size:o=300,style:l,image:d,dotsOptions:s,backgroundOptions:g,imageOptions:r,cornersSquareOptions:c,cornersDotOptions:i,colorDark:t,colorLight:n,margin:a,errorCorrectionLevel:m})=>jsx(View,{style:[B.qrContainer,l],children:jsx(Image,{style:{width:o,height:o},src:h({url:e,width:o,height:o,image:d,dotsOptions:s||(t?{color:t}:void 0),backgroundOptions:g||(n?{color:n}:void 0),imageOptions:{...r,margin:r?.margin!==void 0?r.margin:a},cornersSquareOptions:c,cornersDotOptions:i,fallbackColorDark:t,fallbackColorLight:n,fallbackMargin:a,fallbackErrorCorrectionLevel:m})})}),U=P;
2
2
  export{I as QR,U as QRstyle};//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../frontend/src/components/core/qr/QRGenerator.ts","../../../frontend/src/components/core/qr/QR.tsx","../../../frontend/src/components/core/qr/QRstyleGenerator.ts","../../../frontend/src/components/core/qr/QRstyle.tsx"],"names":["generateQRAsBase64","value","size","colorDark","colorLight","margin","errorCorrectionLevel","options","QRCode","error","addLogoToQR","qrDataUrl","logoUrl","logoWidth","logoHeight","resolve","isBrowser","canvas","ctx","ImageConstructor","createCanvas","Image","e","qrImage","logoImage","x","y","finalQrDataUrl","err","styles","StyleSheet","errorLevelMap","QR","style","logo","setQrDataUrl","useState","useEffect","baseQrDataUrl","qrWithLogo","fallbackUrl","jsx","View","QR_default","generateQRV2AsBase64","QRCodeStylingConstructor","extraOptions","mod","jsdomName","canvasName","qrCommonName","jsdomMod","canvasMod","qrCommonMod","JSDOM","nodeCanvas","QRCodeStyling","width","height","qrOptions","rawData","reject","reader","QRV2","image","dotsOptions","backgroundOptions","imageOptions","cornersSquareOptions","cornersDotOptions","QRstyle_default"],"mappings":"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","file":"index.js","sourcesContent":["import QRCode from \"qrcode\"\r\n\r\ninterface QROptions {\r\n value: string\r\n size?: number\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n logoImage?: string\r\n logoWidth?: number\r\n logoHeight?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nexport const generateQRAsBase64 = async ({\r\n value,\r\n size = 150,\r\n colorDark = \"#000000\",\r\n colorLight = \"#ffffff\",\r\n margin = 0,\r\n errorCorrectionLevel = \"M\",\r\n}: QROptions): Promise<string> => {\r\n try {\r\n // Configuración para QRCode\r\n const options = {\r\n errorCorrectionLevel: errorCorrectionLevel,\r\n type: \"image/png\" as const,\r\n quality: 0.92,\r\n margin: margin,\r\n color: {\r\n dark: colorDark,\r\n light: colorLight,\r\n },\r\n width: size,\r\n }\r\n\r\n // Generar el código QR como base64\r\n const qrDataUrl = QRCode.toDataURL(value, options)\r\n return qrDataUrl\r\n } catch (error) {\r\n console.error(\"Error generando QR:\", error)\r\n return \"\"\r\n }\r\n}\r\n\r\n// Función para añadir un logo al QR generado\r\nexport const addLogoToQR = async (\r\n qrDataUrl: string,\r\n logoUrl: string,\r\n logoWidth: number,\r\n logoHeight: number,\r\n): Promise<string> => {\r\n return new Promise(async (resolve) => {\r\n if (!qrDataUrl || !logoUrl) {\r\n resolve(qrDataUrl)\r\n return\r\n }\r\n\r\n try {\r\n const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\r\n let canvas: any;\r\n let ctx: any;\r\n let ImageConstructor: any;\r\n\r\n if (isBrowser) {\r\n canvas = document.createElement(\"canvas\")\r\n ctx = canvas.getContext(\"2d\")\r\n ImageConstructor = window.Image;\r\n } else {\r\n // Node environment\r\n try {\r\n // Use dynamic imports to avoid bundling canvas in browser build if possible\r\n // although typically 'canvas' is excluded from browser bundles or shimmed.\r\n const { createCanvas, Image } = await import('canvas');\r\n canvas = createCanvas(100, 100); // Initial size, will be resized\r\n ctx = canvas.getContext(\"2d\");\r\n ImageConstructor = Image;\r\n } catch (e) {\r\n console.error(\"Canvas not available in Node environment for addLogoToQR\", e);\r\n resolve(qrDataUrl);\r\n return;\r\n }\r\n }\r\n\r\n if (!ctx) {\r\n resolve(qrDataUrl)\r\n return\r\n }\r\n\r\n // Cargar la imagen del QR\r\n const qrImage = new ImageConstructor()\r\n // crossOrigin is only needed in browser usually, but node-canvas might support/ignore it\r\n if (isBrowser) qrImage.crossOrigin = \"anonymous\"\r\n \r\n qrImage.onload = () => {\r\n // Establecer el tamaño del canvas\r\n canvas.width = qrImage.width\r\n canvas.height = qrImage.height\r\n\r\n // Dibujar el QR en el canvas\r\n ctx.drawImage(qrImage, 0, 0, canvas.width, canvas.height)\r\n\r\n // Cargar el logo\r\n const logoImage = new ImageConstructor()\r\n if (isBrowser) logoImage.crossOrigin = \"anonymous\"\r\n \r\n logoImage.onload = () => {\r\n // Calcular la posición central para el logo\r\n const x = (canvas.width - logoWidth) / 2\r\n const y = (canvas.height - logoHeight) / 2\r\n\r\n // Dibujar un fondo blanco para el logo (opcional)\r\n ctx.fillStyle = \"#FFFFFF\"\r\n ctx.fillRect(x - 5, y - 5, logoWidth + 10, logoHeight + 10)\r\n\r\n // Dibujar el logo\r\n ctx.drawImage(logoImage, x, y, logoWidth, logoHeight)\r\n\r\n // Convertir el canvas a base64\r\n const finalQrDataUrl = canvas.toDataURL(\"image/png\")\r\n resolve(finalQrDataUrl)\r\n }\r\n\r\n logoImage.onerror = (err: any) => {\r\n console.error(\"Error cargando el logo:\", err)\r\n resolve(qrDataUrl) // Devolver el QR sin logo en caso de error\r\n }\r\n\r\n logoImage.src = logoUrl\r\n }\r\n\r\n qrImage.onerror = (err: any) => {\r\n console.error(\"Error cargando el QR:\", err)\r\n resolve(\"\")\r\n }\r\n\r\n qrImage.src = qrDataUrl\r\n } catch (error) {\r\n console.error(\"Error procesando el QR con logo:\", error)\r\n resolve(qrDataUrl) // Devolver el QR sin logo en caso de error\r\n }\r\n })\r\n}\r\n","import React,{ useEffect, useState } from \"react\"\r\nimport { Image, StyleSheet, View } from \"@react-pdf/renderer\"\r\nimport { generateQRAsBase64, addLogoToQR } from \"./QRGenerator\"\r\n\r\n// Define the props for the QR component\r\ninterface QRProps {\r\n value: string\r\n size?: number\r\n style?: any\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n logo?: string\r\n logoWidth?: number\r\n logoHeight?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n qrContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n margin: 10,\r\n },\r\n})\r\n\r\n// Mapa para convertir niveles de corrección numéricos a letras\r\nconst errorLevelMap: Record<number, \"L\" | \"M\" | \"Q\" | \"H\"> = {\r\n 0: \"L\",\r\n 1: \"M\",\r\n 2: \"Q\",\r\n 3: \"H\",\r\n}\r\n\r\n// Este componente funciona con React PDF\r\nconst QR: React.FC<QRProps> = ({\r\n value,\r\n size = 150,\r\n style,\r\n colorDark = \"#000000\",\r\n colorLight = \"#ffffff\",\r\n margin = 0,\r\n logo = \"\",\r\n logoWidth = 30,\r\n logoHeight = 30,\r\n errorCorrectionLevel = logo ? \"H\" : \"M\",\r\n}) => {\r\n const [qrDataUrl, setQrDataUrl] = useState<string>(\"\")\r\n\r\n // Generar el código QR cuando el componente se monta o cuando cambian las props\r\n useEffect(() => {\r\n const generateQR = async () => {\r\n try {\r\n // Primero generamos el QR básico\r\n const baseQrDataUrl = await generateQRAsBase64({\r\n value,\r\n size,\r\n colorDark,\r\n colorLight,\r\n margin,\r\n errorCorrectionLevel:\r\n typeof errorCorrectionLevel === \"number\"\r\n ? errorLevelMap[errorCorrectionLevel] || \"M\"\r\n : errorCorrectionLevel,\r\n })\r\n\r\n // Si hay un logo, lo añadimos al QR\r\n if (logo && logoWidth && logoHeight) {\r\n const qrWithLogo = await addLogoToQR(baseQrDataUrl, logo, logoWidth, logoHeight)\r\n setQrDataUrl(qrWithLogo)\r\n } else {\r\n setQrDataUrl(baseQrDataUrl)\r\n }\r\n } catch (error) {\r\n console.error(\"Error generando QR:\", error)\r\n // En caso de error, generamos un QR básico usando una API externa\r\n const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(\r\n value,\r\n )}&size=${size}x${size}&color=${encodeURIComponent(colorDark.replace(\"#\", \"\"))}&bgcolor=${encodeURIComponent(\r\n colorLight.replace(\"#\", \"\"),\r\n )}`\r\n setQrDataUrl(fallbackUrl)\r\n }\r\n }\r\n\r\n generateQR()\r\n }, [value, size, colorDark, colorLight, margin, logo, logoWidth, logoHeight, errorCorrectionLevel])\r\n\r\n // Mostrar un QR de respaldo mientras se genera el QR personalizado\r\n const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(\r\n value,\r\n )}&size=${size}x${size}`\r\n\r\n return (\r\n <View style={[styles.qrContainer, style]}>\r\n <Image src={qrDataUrl || fallbackUrl} style={{ width: size, height: size }} />\r\n </View>\r\n )\r\n}\r\n\r\nexport default QR\r\n\r\n","import { generateQRAsBase64 } from \"./QRGenerator\"\r\n\r\nexport interface QRV2Options {\r\n value: string\r\n width?: number\r\n height?: number\r\n image?: string\r\n dotsOptions?: {\r\n color?: string\r\n type?: \"rounded\" | \"dots\" | \"classy\" | \"classy-rounded\" | \"square\" | \"extra-rounded\"\r\n }\r\n backgroundOptions?: {\r\n color?: string\r\n }\r\n imageOptions?: {\r\n crossOrigin?: string\r\n margin?: number\r\n imageSize?: number // 0-1 (e.g., 0.4)\r\n }\r\n cornersSquareOptions?: {\r\n type?: \"dot\" | \"square\" | \"extra-rounded\"\r\n color?: string\r\n }\r\n cornersDotOptions?: {\r\n type?: \"dot\" | \"square\"\r\n color?: string\r\n }\r\n // Fallback options\r\n fallbackColorDark?: string\r\n fallbackColorLight?: string\r\n fallbackMargin?: number\r\n fallbackErrorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nexport const generateQRV2AsBase64 = async (options: QRV2Options): Promise<string> => {\r\n try {\r\n const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\r\n \r\n let QRCodeStylingConstructor: any;\r\n let extraOptions = {};\r\n\r\n if (isBrowser) {\r\n // Dynamic import for browser\r\n try {\r\n const mod = await import('qr-code-styling');\r\n QRCodeStylingConstructor = mod.default || mod;\r\n } catch (e) {\r\n console.error(\"Failed to load qr-code-styling in browser\", e);\r\n throw e;\r\n }\r\n } else {\r\n // Node environment\r\n // We use variable names to prevent bundlers (like Vite) from analyzing/bundling these dependencies\r\n // when building for the browser.\r\n const jsdomName = \"jsdom\";\r\n const canvasName = \"canvas\";\r\n const qrCommonName = \"qr-code-styling/lib/qr-code-styling.common.js\";\r\n \r\n try {\r\n const [jsdomMod, canvasMod, qrCommonMod] = await Promise.all([\r\n import(/* @vite-ignore */ jsdomName),\r\n import(/* @vite-ignore */ canvasName),\r\n import(/* @vite-ignore */ qrCommonName)\r\n ]);\r\n\r\n const { JSDOM } = jsdomMod;\r\n // canvas might be default export or named export depending on version/bundling\r\n const nodeCanvas = canvasMod.default || canvasMod;\r\n const { QRCodeStyling } = qrCommonMod;\r\n\r\n QRCodeStylingConstructor = QRCodeStyling;\r\n extraOptions = {\r\n jsdom: JSDOM,\r\n nodeCanvas: nodeCanvas\r\n };\r\n } catch (e) {\r\n console.error(\"Failed to load Node dependencies for QR generation\", e);\r\n throw e;\r\n }\r\n }\r\n\r\n const width = typeof options.width === \"number\" && isFinite(options.width) ? Math.round(options.width) : 300;\r\n const height = typeof options.height === \"number\" && isFinite(options.height) ? Math.round(options.height) : 300;\r\n \r\n\r\n const qrOptions = {\r\n width,\r\n height,\r\n data: options.value,\r\n image: options.image,\r\n dotsOptions: options.dotsOptions,\r\n backgroundOptions: {\r\n // Default to white background if not specified to prevent transparency issues\r\n // The \"blue stripe\" or weird artifacts can happen if the background is transparent or handled incorrectly\r\n color: options.backgroundOptions?.color || \"#ffffff\",\r\n ...options.backgroundOptions\r\n },\r\n imageOptions: {\r\n crossOrigin: \"anonymous\",\r\n margin: typeof options.imageOptions?.margin === \"number\" && isFinite(options.imageOptions.margin) ? options.imageOptions.margin : 0,\r\n saveAsBlob: true,\r\n imageSize: typeof options.imageOptions?.imageSize === \"number\" && isFinite(options.imageOptions.imageSize)\r\n ? Math.max(0, Math.min(1, options.imageOptions.imageSize))\r\n : 0.4,\r\n },\r\n cornersSquareOptions: options.cornersSquareOptions,\r\n cornersDotOptions: options.cornersDotOptions,\r\n }\r\n\r\n // @ts-ignore\r\n const qrCodeImage = new QRCodeStylingConstructor({\r\n type: \"png\", // Force PNG type\r\n ...extraOptions,\r\n ...qrOptions,\r\n })\r\n\r\n const rawData = await qrCodeImage.getRawData(\"png\")\r\n \r\n if (!rawData) throw new Error(\"Failed to generate raw data from qr-code-styling\")\r\n\r\n // Handle Blob (Browser) vs Buffer (Node)\r\n if (isBrowser) {\r\n if (rawData instanceof Blob) {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n if (typeof reader.result === 'string') {\r\n resolve(reader.result);\r\n } else {\r\n reject(new Error(\"Failed to convert blob to base64\"));\r\n }\r\n };\r\n reader.onerror = reject;\r\n reader.readAsDataURL(rawData);\r\n });\r\n } else {\r\n // Sometimes in browser it might return something else if configured differently?\r\n // But usually Blob.\r\n console.warn(\"Unexpected rawData type in browser:\", rawData);\r\n }\r\n } \r\n \r\n // Node environment usually returns Buffer\r\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(rawData)) {\r\n return `data:image/png;base64,${rawData.toString(\"base64\")}`;\r\n }\r\n \r\n // Fallback if type is unexpected\r\n // Try to handle if it's a blob-like object in Node (unlikely but possible with polyfills)\r\n throw new Error(`Unexpected raw data type: ${typeof rawData}`);\r\n\r\n } catch (error) {\r\n console.error(\"Error generating QR V2, falling back to V1:\", error)\r\n \r\n // Fallback to existing implementation\r\n return generateQRAsBase64({\r\n value: options.value,\r\n size: options.width,\r\n colorDark: options.fallbackColorDark || options.dotsOptions?.color,\r\n colorLight: options.fallbackColorLight || options.backgroundOptions?.color,\r\n margin: options.fallbackMargin || 0,\r\n errorCorrectionLevel: options.fallbackErrorCorrectionLevel || \"M\",\r\n })\r\n }\r\n}\r\n","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { Image, StyleSheet, View } from \"@react-pdf/renderer\"\r\nimport { generateQRV2AsBase64, type QRV2Options } from \"./QRstyleGenerator\"\r\n\r\n// Define props\r\nexport interface QRV2Props {\r\n value: string\r\n size?: number\r\n style?: any\r\n image?: string\r\n dotsOptions?: QRV2Options[\"dotsOptions\"]\r\n backgroundOptions?: QRV2Options[\"backgroundOptions\"]\r\n imageOptions?: QRV2Options[\"imageOptions\"]\r\n cornersSquareOptions?: QRV2Options[\"cornersSquareOptions\"]\r\n cornersDotOptions?: QRV2Options[\"cornersDotOptions\"]\r\n // Fallback/Compatibility props\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n qrContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n})\r\n\r\nconst QRV2: React.FC<QRV2Props> = ({\r\n value,\r\n size = 300,\r\n style,\r\n image,\r\n dotsOptions,\r\n backgroundOptions,\r\n imageOptions,\r\n cornersSquareOptions,\r\n cornersDotOptions,\r\n colorDark,\r\n colorLight,\r\n margin,\r\n errorCorrectionLevel,\r\n}) => {\r\n return (\r\n <View style={[styles.qrContainer, style]}>\r\n {/* We pass a function that returns the promise/result or use the state if available. \r\n Actually, we can pass the promise directly to src! */}\r\n <Image \r\n style={{ width: size, height: size }} \r\n src={generateQRV2AsBase64({\r\n value,\r\n width: size,\r\n height: size,\r\n image,\r\n dotsOptions: dotsOptions || (colorDark ? { color: colorDark } : undefined),\r\n backgroundOptions: backgroundOptions || (colorLight ? { color: colorLight } : undefined),\r\n imageOptions: {\r\n ...imageOptions,\r\n margin: imageOptions?.margin !== undefined ? imageOptions.margin : margin\r\n },\r\n cornersSquareOptions,\r\n cornersDotOptions,\r\n fallbackColorDark: colorDark,\r\n fallbackColorLight: colorLight,\r\n fallbackMargin: margin,\r\n fallbackErrorCorrectionLevel: errorCorrectionLevel,\r\n })} \r\n />\r\n </View>\r\n )\r\n}\r\n\r\nexport default QRV2\r\n"]}
1
+ {"version":3,"sources":["../../../frontend/src/components/core/qr/QRGenerator.ts","../../../frontend/src/components/core/qr/QR.tsx","../../../frontend/src/components/core/qr/QRstyleGenerator.ts","../../../frontend/src/components/core/qr/QRstyle.tsx"],"names":["generateQRAsBase64","url","size","colorDark","colorLight","margin","errorCorrectionLevel","options","QRCode","error","addLogoToQR","qrDataUrl","logoUrl","logoWidth","logoHeight","resolve","isBrowser","canvas","ctx","ImageConstructor","createCanvas","Image","e","qrImage","logoImage","x","y","finalQrDataUrl","err","styles","StyleSheet","errorLevelMap","QR","style","logo","setQrDataUrl","useState","useEffect","baseQrDataUrl","qrWithLogo","fallbackUrl","jsx","View","QR_default","generateQRV2AsBase64","QRCodeStylingConstructor","extraOptions","mod","jsdomName","canvasName","qrCommonName","jsdomMod","canvasMod","qrCommonMod","JSDOM","nodeCanvas","QRCodeStyling","width","height","qrOptions","rawData","reject","reader","QRV2","image","dotsOptions","backgroundOptions","imageOptions","cornersSquareOptions","cornersDotOptions","QRstyle_default"],"mappings":"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","file":"index.js","sourcesContent":["import QRCode from \"qrcode\"\r\n\r\ninterface QROptions {\r\n url: string\r\n size?: number\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n logoImage?: string\r\n logoWidth?: number\r\n logoHeight?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nexport const generateQRAsBase64 = async ({\r\n url,\r\n size = 150,\r\n colorDark = \"#000000\",\r\n colorLight = \"#ffffff\",\r\n margin = 0,\r\n errorCorrectionLevel = \"M\",\r\n}: QROptions): Promise<string> => {\r\n try {\r\n // Configuración para QRCode\r\n const options = {\r\n errorCorrectionLevel: errorCorrectionLevel,\r\n type: \"image/png\" as const,\r\n quality: 0.92,\r\n margin: margin,\r\n color: {\r\n dark: colorDark,\r\n light: colorLight,\r\n },\r\n width: size,\r\n }\r\n\r\n // Generar el código QR como base64\r\n const qrDataUrl = QRCode.toDataURL(url, options)\r\n return qrDataUrl\r\n } catch (error) {\r\n console.error(\"Error generando QR:\", error)\r\n return \"\"\r\n }\r\n}\r\n\r\n// Función para añadir un logo al QR generado\r\nexport const addLogoToQR = async (\r\n qrDataUrl: string,\r\n logoUrl: string,\r\n logoWidth: number,\r\n logoHeight: number,\r\n): Promise<string> => {\r\n return new Promise(async (resolve) => {\r\n if (!qrDataUrl || !logoUrl) {\r\n resolve(qrDataUrl)\r\n return\r\n }\r\n\r\n try {\r\n const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\r\n let canvas: any;\r\n let ctx: any;\r\n let ImageConstructor: any;\r\n\r\n if (isBrowser) {\r\n canvas = document.createElement(\"canvas\")\r\n ctx = canvas.getContext(\"2d\")\r\n ImageConstructor = window.Image;\r\n } else {\r\n // Node environment\r\n try {\r\n // Use dynamic imports to avoid bundling canvas in browser build if possible\r\n // although typically 'canvas' is excluded from browser bundles or shimmed.\r\n const { createCanvas, Image } = await import('canvas');\r\n canvas = createCanvas(100, 100); // Initial size, will be resized\r\n ctx = canvas.getContext(\"2d\");\r\n ImageConstructor = Image;\r\n } catch (e) {\r\n console.error(\"Canvas not available in Node environment for addLogoToQR\", e);\r\n resolve(qrDataUrl);\r\n return;\r\n }\r\n }\r\n\r\n if (!ctx) {\r\n resolve(qrDataUrl)\r\n return\r\n }\r\n\r\n // Cargar la imagen del QR\r\n const qrImage = new ImageConstructor()\r\n // crossOrigin is only needed in browser usually, but node-canvas might support/ignore it\r\n if (isBrowser) qrImage.crossOrigin = \"anonymous\"\r\n \r\n qrImage.onload = () => {\r\n // Establecer el tamaño del canvas\r\n canvas.width = qrImage.width\r\n canvas.height = qrImage.height\r\n\r\n // Dibujar el QR en el canvas\r\n ctx.drawImage(qrImage, 0, 0, canvas.width, canvas.height)\r\n\r\n // Cargar el logo\r\n const logoImage = new ImageConstructor()\r\n if (isBrowser) logoImage.crossOrigin = \"anonymous\"\r\n \r\n logoImage.onload = () => {\r\n // Calcular la posición central para el logo\r\n const x = (canvas.width - logoWidth) / 2\r\n const y = (canvas.height - logoHeight) / 2\r\n\r\n // Dibujar un fondo blanco para el logo (opcional)\r\n ctx.fillStyle = \"#FFFFFF\"\r\n ctx.fillRect(x - 5, y - 5, logoWidth + 10, logoHeight + 10)\r\n\r\n // Dibujar el logo\r\n ctx.drawImage(logoImage, x, y, logoWidth, logoHeight)\r\n\r\n // Convertir el canvas a base64\r\n const finalQrDataUrl = canvas.toDataURL(\"image/png\")\r\n resolve(finalQrDataUrl)\r\n }\r\n\r\n logoImage.onerror = (err: any) => {\r\n console.error(\"Error cargando el logo:\", err)\r\n resolve(qrDataUrl) // Devolver el QR sin logo en caso de error\r\n }\r\n\r\n logoImage.src = logoUrl\r\n }\r\n\r\n qrImage.onerror = (err: any) => {\r\n console.error(\"Error cargando el QR:\", err)\r\n resolve(\"\")\r\n }\r\n\r\n qrImage.src = qrDataUrl\r\n } catch (error) {\r\n console.error(\"Error procesando el QR con logo:\", error)\r\n resolve(qrDataUrl) // Devolver el QR sin logo en caso de error\r\n }\r\n })\r\n}\r\n","import React,{ useEffect, useState } from \"react\"\r\nimport { Image, StyleSheet, View } from \"@react-pdf/renderer\"\r\nimport { generateQRAsBase64, addLogoToQR } from \"./QRGenerator\"\r\n\r\n// Define the props for the QR component\r\ninterface QRProps {\r\n url: string\r\n size?: number\r\n style?: any\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n logo?: string\r\n logoWidth?: number\r\n logoHeight?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n qrContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n margin: 10,\r\n },\r\n})\r\n\r\n// Mapa para convertir niveles de corrección numéricos a letras\r\nconst errorLevelMap: Record<number, \"L\" | \"M\" | \"Q\" | \"H\"> = {\r\n 0: \"L\",\r\n 1: \"M\",\r\n 2: \"Q\",\r\n 3: \"H\",\r\n}\r\n\r\n// Este componente funciona con React PDF\r\nconst QR: React.FC<QRProps> = ({\r\n url,\r\n size = 150,\r\n style,\r\n colorDark = \"#000000\",\r\n colorLight = \"#ffffff\",\r\n margin = 0,\r\n logo = \"\",\r\n logoWidth = 30,\r\n logoHeight = 30,\r\n errorCorrectionLevel = logo ? \"H\" : \"M\",\r\n}) => {\r\n const [qrDataUrl, setQrDataUrl] = useState<string>(\"\")\r\n\r\n // Generar el código QR cuando el componente se monta o cuando cambian las props\r\n useEffect(() => {\r\n const generateQR = async () => {\r\n try {\r\n // Primero generamos el QR básico\r\n const baseQrDataUrl = await generateQRAsBase64({\r\n url,\r\n size,\r\n colorDark,\r\n colorLight,\r\n margin,\r\n errorCorrectionLevel:\r\n typeof errorCorrectionLevel === \"number\"\r\n ? errorLevelMap[errorCorrectionLevel] || \"M\"\r\n : errorCorrectionLevel,\r\n })\r\n\r\n // Si hay un logo, lo añadimos al QR\r\n if (logo && logoWidth && logoHeight) {\r\n const qrWithLogo = await addLogoToQR(baseQrDataUrl, logo, logoWidth, logoHeight)\r\n setQrDataUrl(qrWithLogo)\r\n } else {\r\n setQrDataUrl(baseQrDataUrl)\r\n }\r\n } catch (error) {\r\n console.error(\"Error generando QR:\", error)\r\n // En caso de error, generamos un QR básico usando una API externa\r\n const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(\r\n url,\r\n )}&size=${size}x${size}&color=${encodeURIComponent(colorDark.replace(\"#\", \"\"))}&bgcolor=${encodeURIComponent(\r\n colorLight.replace(\"#\", \"\"),\r\n )}`\r\n setQrDataUrl(fallbackUrl)\r\n }\r\n }\r\n\r\n generateQR()\r\n }, [url, size, colorDark, colorLight, margin, logo, logoWidth, logoHeight, errorCorrectionLevel])\r\n\r\n // Mostrar un QR de respaldo mientras se genera el QR personalizado\r\n const fallbackUrl = `https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(\r\n url,\r\n )}&size=${size}x${size}`\r\n\r\n return (\r\n <View style={[styles.qrContainer, style]}>\r\n <Image src={qrDataUrl || fallbackUrl} style={{ width: size, height: size }} />\r\n </View>\r\n )\r\n}\r\n\r\nexport default QR\r\n\r\n","import { generateQRAsBase64 } from \"./QRGenerator\"\r\n\r\nexport interface QRV2Options {\r\n url: string\r\n width?: number\r\n height?: number\r\n image?: string\r\n dotsOptions?: {\r\n color?: string\r\n type?: \"rounded\" | \"dots\" | \"classy\" | \"classy-rounded\" | \"square\" | \"extra-rounded\"\r\n }\r\n backgroundOptions?: {\r\n color?: string\r\n }\r\n imageOptions?: {\r\n crossOrigin?: string\r\n margin?: number\r\n imageSize?: number // 0-1 (e.g., 0.4)\r\n }\r\n cornersSquareOptions?: {\r\n type?: \"dot\" | \"square\" | \"extra-rounded\"\r\n color?: string\r\n }\r\n cornersDotOptions?: {\r\n type?: \"dot\" | \"square\"\r\n color?: string\r\n }\r\n // Fallback options\r\n fallbackColorDark?: string\r\n fallbackColorLight?: string\r\n fallbackMargin?: number\r\n fallbackErrorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nexport const generateQRV2AsBase64 = async (options: QRV2Options): Promise<string> => {\r\n try {\r\n const isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\r\n \r\n let QRCodeStylingConstructor: any;\r\n let extraOptions = {};\r\n\r\n if (isBrowser) {\r\n // Dynamic import for browser\r\n try {\r\n const mod = await import('qr-code-styling');\r\n QRCodeStylingConstructor = mod.default || mod;\r\n } catch (e) {\r\n console.error(\"Failed to load qr-code-styling in browser\", e);\r\n throw e;\r\n }\r\n } else {\r\n // Node environment\r\n // We use variable names to prevent bundlers (like Vite) from analyzing/bundling these dependencies\r\n // when building for the browser.\r\n const jsdomName = \"jsdom\";\r\n const canvasName = \"canvas\";\r\n const qrCommonName = \"qr-code-styling/lib/qr-code-styling.common.js\";\r\n \r\n try {\r\n const [jsdomMod, canvasMod, qrCommonMod] = await Promise.all([\r\n import(/* @vite-ignore */ jsdomName),\r\n import(/* @vite-ignore */ canvasName),\r\n import(/* @vite-ignore */ qrCommonName)\r\n ]);\r\n\r\n const { JSDOM } = jsdomMod;\r\n // canvas might be default export or named export depending on version/bundling\r\n const nodeCanvas = canvasMod.default || canvasMod;\r\n const { QRCodeStyling } = qrCommonMod;\r\n\r\n QRCodeStylingConstructor = QRCodeStyling;\r\n extraOptions = {\r\n jsdom: JSDOM,\r\n nodeCanvas: nodeCanvas\r\n };\r\n } catch (e) {\r\n console.error(\"Failed to load Node dependencies for QR generation\", e);\r\n throw e;\r\n }\r\n }\r\n\r\n const width = typeof options.width === \"number\" && isFinite(options.width) ? Math.round(options.width) : 300;\r\n const height = typeof options.height === \"number\" && isFinite(options.height) ? Math.round(options.height) : 300;\r\n \r\n\r\n const qrOptions = {\r\n width,\r\n height,\r\n data: options.url,\r\n image: options.image,\r\n dotsOptions: options.dotsOptions,\r\n backgroundOptions: {\r\n // Default to white background if not specified to prevent transparency issues\r\n // The \"blue stripe\" or weird artifacts can happen if the background is transparent or handled incorrectly\r\n color: options.backgroundOptions?.color || \"#ffffff\",\r\n ...options.backgroundOptions\r\n },\r\n imageOptions: {\r\n crossOrigin: \"anonymous\",\r\n margin: typeof options.imageOptions?.margin === \"number\" && isFinite(options.imageOptions.margin) ? options.imageOptions.margin : 0,\r\n saveAsBlob: true,\r\n imageSize: typeof options.imageOptions?.imageSize === \"number\" && isFinite(options.imageOptions.imageSize)\r\n ? Math.max(0, Math.min(1, options.imageOptions.imageSize))\r\n : 0.4,\r\n },\r\n cornersSquareOptions: options.cornersSquareOptions,\r\n cornersDotOptions: options.cornersDotOptions,\r\n }\r\n\r\n // @ts-ignore\r\n const qrCodeImage = new QRCodeStylingConstructor({\r\n type: \"png\", // Force PNG type\r\n ...extraOptions,\r\n ...qrOptions,\r\n })\r\n\r\n const rawData = await qrCodeImage.getRawData(\"png\")\r\n \r\n if (!rawData) throw new Error(\"Failed to generate raw data from qr-code-styling\")\r\n\r\n // Handle Blob (Browser) vs Buffer (Node)\r\n if (isBrowser) {\r\n if (rawData instanceof Blob) {\r\n return new Promise((resolve, reject) => {\r\n const reader = new FileReader();\r\n reader.onloadend = () => {\r\n if (typeof reader.result === 'string') {\r\n resolve(reader.result);\r\n } else {\r\n reject(new Error(\"Failed to convert blob to base64\"));\r\n }\r\n };\r\n reader.onerror = reject;\r\n reader.readAsDataURL(rawData);\r\n });\r\n } else {\r\n // Sometimes in browser it might return something else if configured differently?\r\n // But usually Blob.\r\n console.warn(\"Unexpected rawData type in browser:\", rawData);\r\n }\r\n } \r\n \r\n // Node environment usually returns Buffer\r\n if (typeof Buffer !== 'undefined' && Buffer.isBuffer(rawData)) {\r\n return `data:image/png;base64,${rawData.toString(\"base64\")}`;\r\n }\r\n \r\n // Fallback if type is unexpected\r\n // Try to handle if it's a blob-like object in Node (unlikely but possible with polyfills)\r\n throw new Error(`Unexpected raw data type: ${typeof rawData}`);\r\n\r\n } catch (error) {\r\n console.error(\"Error generating QR V2, falling back to V1:\", error)\r\n \r\n // Fallback to existing implementation\r\n return generateQRAsBase64({\r\n url: options.url,\r\n size: options.width,\r\n colorDark: options.fallbackColorDark || options.dotsOptions?.color,\r\n colorLight: options.fallbackColorLight || options.backgroundOptions?.color,\r\n margin: options.fallbackMargin || 0,\r\n errorCorrectionLevel: options.fallbackErrorCorrectionLevel || \"M\",\r\n })\r\n }\r\n}\r\n","\"use client\"\r\n\r\nimport React from \"react\"\r\nimport { Image, StyleSheet, View } from \"@react-pdf/renderer\"\r\nimport { generateQRV2AsBase64, type QRV2Options } from \"./QRstyleGenerator\"\r\n\r\n// Define props\r\nexport interface QRV2Props {\r\n url: string\r\n size?: number\r\n style?: any\r\n image?: string\r\n dotsOptions?: QRV2Options[\"dotsOptions\"]\r\n backgroundOptions?: QRV2Options[\"backgroundOptions\"]\r\n imageOptions?: QRV2Options[\"imageOptions\"]\r\n cornersSquareOptions?: QRV2Options[\"cornersSquareOptions\"]\r\n cornersDotOptions?: QRV2Options[\"cornersDotOptions\"]\r\n // Fallback/Compatibility props\r\n colorDark?: string\r\n colorLight?: string\r\n margin?: number\r\n errorCorrectionLevel?: \"L\" | \"M\" | \"Q\" | \"H\"\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n qrContainer: {\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n },\r\n})\r\n\r\nconst QRV2: React.FC<QRV2Props> = ({\r\n url,\r\n size = 300,\r\n style,\r\n image,\r\n dotsOptions,\r\n backgroundOptions,\r\n imageOptions,\r\n cornersSquareOptions,\r\n cornersDotOptions,\r\n colorDark,\r\n colorLight,\r\n margin,\r\n errorCorrectionLevel,\r\n}) => {\r\n return (\r\n <View style={[styles.qrContainer, style]}>\r\n {/* We pass a function that returns the promise/result or use the state if available. \r\n Actually, we can pass the promise directly to src! */}\r\n <Image \r\n style={{ width: size, height: size }} \r\n src={generateQRV2AsBase64({\r\n url,\r\n width: size,\r\n height: size,\r\n image,\r\n dotsOptions: dotsOptions || (colorDark ? { color: colorDark } : undefined),\r\n backgroundOptions: backgroundOptions || (colorLight ? { color: colorLight } : undefined),\r\n imageOptions: {\r\n ...imageOptions,\r\n margin: imageOptions?.margin !== undefined ? imageOptions.margin : margin\r\n },\r\n cornersSquareOptions,\r\n cornersDotOptions,\r\n fallbackColorDark: colorDark,\r\n fallbackColorLight: colorLight,\r\n fallbackMargin: margin,\r\n fallbackErrorCorrectionLevel: errorCorrectionLevel,\r\n })} \r\n />\r\n </View>\r\n )\r\n}\r\n\r\nexport default QRV2\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@react-pdf-levelup/qr",
3
- "version": "1.1.20",
3
+ "version": "1.1.21",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "",
@@ -16,7 +16,6 @@
16
16
  "build:lib": "tsup --config tsup.config.ts"
17
17
  },
18
18
  "dependencies": {
19
- "@react-pdf-levelup/core": "^4.1.7",
20
19
  "jsdom": "^27.4.0",
21
20
  "qr-code-styling": "^1.9.2",
22
21
  "qrcode": "^1.5.4",