QRCodeCanvas.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. "use strict";
  2. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
  3. Object.defineProperty(exports, "__esModule", {
  4. value: true
  5. });
  6. exports.QRCodeCanvas = void 0;
  7. var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
  8. var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
  9. var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
  10. var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
  11. var _react = _interopRequireDefault(require("react"));
  12. var _useQRCode2 = require("./hooks/useQRCode");
  13. var _utils = require("./utils");
  14. var _excluded = ["value", "size", "level", "bgColor", "fgColor", "includeMargin", "minVersion", "marginSize", "style", "imageSettings"];
  15. var QRCodeCanvas = exports.QRCodeCanvas = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {
  16. var value = props.value,
  17. _props$size = props.size,
  18. size = _props$size === void 0 ? _utils.DEFAULT_SIZE : _props$size,
  19. _props$level = props.level,
  20. level = _props$level === void 0 ? _utils.DEFAULT_LEVEL : _props$level,
  21. _props$bgColor = props.bgColor,
  22. bgColor = _props$bgColor === void 0 ? _utils.DEFAULT_BACKGROUND_COLOR : _props$bgColor,
  23. _props$fgColor = props.fgColor,
  24. fgColor = _props$fgColor === void 0 ? _utils.DEFAULT_FRONT_COLOR : _props$fgColor,
  25. _props$includeMargin = props.includeMargin,
  26. includeMargin = _props$includeMargin === void 0 ? _utils.DEFAULT_NEED_MARGIN : _props$includeMargin,
  27. _props$minVersion = props.minVersion,
  28. minVersion = _props$minVersion === void 0 ? _utils.DEFAULT_MINVERSION : _props$minVersion,
  29. marginSize = props.marginSize,
  30. style = props.style,
  31. imageSettings = props.imageSettings,
  32. otherProps = (0, _objectWithoutProperties2.default)(props, _excluded);
  33. var imgSrc = imageSettings === null || imageSettings === void 0 ? void 0 : imageSettings.src;
  34. var _canvas = _react.default.useRef(null);
  35. var _image = _react.default.useRef(null);
  36. var setCanvasRef = _react.default.useCallback(function (node) {
  37. _canvas.current = node;
  38. if (typeof ref === 'function') {
  39. ref(node);
  40. } else if (ref) {
  41. ref.current = node;
  42. }
  43. }, [ref]);
  44. var _React$useState = _react.default.useState(false),
  45. _React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
  46. setIsImageLoaded = _React$useState2[1];
  47. var _useQRCode = (0, _useQRCode2.useQRCode)({
  48. value: value,
  49. level: level,
  50. minVersion: minVersion,
  51. includeMargin: includeMargin,
  52. marginSize: marginSize,
  53. imageSettings: imageSettings,
  54. size: size
  55. }),
  56. margin = _useQRCode.margin,
  57. cells = _useQRCode.cells,
  58. numCells = _useQRCode.numCells,
  59. calculatedImageSettings = _useQRCode.calculatedImageSettings;
  60. _react.default.useEffect(function () {
  61. if (_canvas.current) {
  62. var canvas = _canvas.current;
  63. var ctx = canvas.getContext('2d');
  64. if (!ctx) {
  65. return;
  66. }
  67. var cellsToDraw = cells;
  68. var image = _image.current;
  69. var haveImageToRender = calculatedImageSettings != null && image !== null && image.complete && image.naturalHeight !== 0 && image.naturalWidth !== 0;
  70. if (haveImageToRender) {
  71. if (calculatedImageSettings.excavation != null) {
  72. cellsToDraw = (0, _utils.excavateModules)(cells, calculatedImageSettings.excavation);
  73. }
  74. }
  75. var pixelRatio = window.devicePixelRatio || 1;
  76. canvas.height = canvas.width = size * pixelRatio;
  77. var scale = size / numCells * pixelRatio;
  78. ctx.scale(scale, scale);
  79. ctx.fillStyle = bgColor;
  80. ctx.fillRect(0, 0, numCells, numCells);
  81. ctx.fillStyle = fgColor;
  82. if (_utils.isSupportPath2d) {
  83. ctx.fill(new Path2D((0, _utils.generatePath)(cellsToDraw, margin)));
  84. } else {
  85. cells.forEach(function (row, rdx) {
  86. row.forEach(function (cell, cdx) {
  87. if (cell) {
  88. ctx.fillRect(cdx + margin, rdx + margin, 1, 1);
  89. }
  90. });
  91. });
  92. }
  93. if (calculatedImageSettings) {
  94. ctx.globalAlpha = calculatedImageSettings.opacity;
  95. }
  96. if (haveImageToRender) {
  97. ctx.drawImage(image, calculatedImageSettings.x + margin, calculatedImageSettings.y + margin, calculatedImageSettings.w, calculatedImageSettings.h);
  98. }
  99. }
  100. });
  101. _react.default.useEffect(function () {
  102. setIsImageLoaded(false);
  103. }, [imgSrc]);
  104. var canvasStyle = (0, _objectSpread2.default)({
  105. height: size,
  106. width: size
  107. }, style);
  108. var img = null;
  109. if (imgSrc != null) {
  110. img = /*#__PURE__*/_react.default.createElement("img", {
  111. src: imgSrc,
  112. key: imgSrc,
  113. style: {
  114. display: 'none'
  115. },
  116. onLoad: function onLoad() {
  117. setIsImageLoaded(true);
  118. },
  119. ref: _image
  120. // when crossOrigin is not set, the image will be tainted
  121. // and the canvas cannot be exported to an image
  122. ,
  123. crossOrigin: calculatedImageSettings === null || calculatedImageSettings === void 0 ? void 0 : calculatedImageSettings.crossOrigin
  124. });
  125. }
  126. return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("canvas", (0, _extends2.default)({
  127. style: canvasStyle,
  128. height: size,
  129. width: size,
  130. ref: setCanvasRef,
  131. role: "img"
  132. }, otherProps)), img);
  133. });
  134. if (process.env.NODE_ENV !== 'production') {
  135. QRCodeCanvas.displayName = 'QRCodeCanvas';
  136. }