UNPKG

@daimo/pay

Version:

Seamless crypto payments. Onboard users from any chain, any coin into your app with one click.

133 lines (130 loc) 4.04 kB
import { jsx, jsxs, Fragment } from 'react/jsx-runtime'; import QRCodeUtil from 'qrcode'; import { useMemo } from 'react'; const generateMatrix = (value, errorCorrectionLevel) => { const arr = Array.prototype.slice.call( QRCodeUtil.create(value, { errorCorrectionLevel }).modules.data, 0 ); const sqrt = Math.sqrt(arr.length); return arr.reduce( (rows, key, index) => (index % sqrt === 0 ? rows.push([key]) : rows[rows.length - 1].push(key)) && rows, [] ); }; function QRCode({ ecl = "M", size: sizeProp = 200, uri, clearArea = false, image, imageBackground = "transparent" }) { const logoSize = clearArea ? 168 : 0; const size = sizeProp - 10 * 2; const dots = useMemo(() => { const dots2 = []; const matrix = generateMatrix(uri, ecl); const cellSize = size / matrix.length; let qrList = [ { x: 0, y: 0 }, { x: 1, y: 0 }, { x: 0, y: 1 } ]; qrList.forEach(({ x, y }) => { const x1 = (matrix.length - 7) * cellSize * x; const y1 = (matrix.length - 7) * cellSize * y; for (let i = 0; i < 3; i++) { dots2.push( /* @__PURE__ */ jsx( "rect", { fill: i % 2 !== 0 ? "var(--ck-qr-background, var(--ck-body-background))" : "var(--ck-qr-dot-color)", rx: (i - 2) * -5 + (i === 0 ? 2 : 3), ry: (i - 2) * -5 + (i === 0 ? 2 : 3), width: cellSize * (7 - i * 2), height: cellSize * (7 - i * 2), x: x1 + cellSize * i, y: y1 + cellSize * i }, `${i}-${x}-${y}` ) ); } }); if (image) { const x1 = (matrix.length - 7) * cellSize * 1; const y1 = (matrix.length - 7) * cellSize * 1; dots2.push( /* @__PURE__ */ jsxs(Fragment, { children: [ /* @__PURE__ */ jsx( "rect", { fill: imageBackground, rx: (0 - 2) * -5 + 2, ry: (0 - 2) * -5 + 2, width: cellSize * (7 - 0 * 2), height: cellSize * (7 - 0 * 2), x: x1 + cellSize * 0, y: y1 + cellSize * 0 } ), /* @__PURE__ */ jsx( "foreignObject", { width: cellSize * (7 - 0 * 2), height: cellSize * (7 - 0 * 2), x: x1 + cellSize * 0, y: y1 + cellSize * 0, children: /* @__PURE__ */ jsx("div", { style: { borderRadius: (0 - 2) * -5 + 2, overflow: "hidden" }, children: image }) } ) ] }) ); } const clearArenaSize = Math.floor((logoSize + 25) / cellSize); const matrixMiddleStart = matrix.length / 2 - clearArenaSize / 2; const matrixMiddleEnd = matrix.length / 2 + clearArenaSize / 2 - 1; matrix.forEach((row, i) => { row.forEach((_, j) => { if (matrix[i][j]) { if (!(i < 7 && j < 7 || i > matrix.length - 8 && j < 7 || i < 7 && j > matrix.length - 8)) { if (image || !(i > matrixMiddleStart && i < matrixMiddleEnd && j > matrixMiddleStart && j < matrixMiddleEnd)) { dots2.push( /* @__PURE__ */ jsx( "circle", { cx: i * cellSize + cellSize / 2, cy: j * cellSize + cellSize / 2, fill: "var(--ck-qr-dot-color)", r: cellSize / 3 }, `circle-${i}-${j}` ) ); } } } }); }); return dots2; }, [ecl, size, uri]); return /* @__PURE__ */ jsxs( "svg", { height: size, width: size, viewBox: `0 0 ${size} ${size}`, style: { width: size, height: size }, children: [ /* @__PURE__ */ jsx("rect", { fill: "transparent", height: size, width: size }), dots ] } ); } export { QRCode }; //# sourceMappingURL=QRCode.js.map