import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
import _createClass from "@babel/runtime/helpers/createClass";
import { transformZoomData } from '../../_util/DocumentUtils';

var ImageData = /*#__PURE__*/function () {
  function ImageData(dataUrl, type) {
    _classCallCheck(this, ImageData);

    // @ts-ignore
    this.dataUrl = dataUrl; // @ts-ignore

    this.type = type;
  }
  /* minify the image
  */


  _createClass(ImageData, [{
    key: "minify",
    value: function minify() {
      var _this = this;

      var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
      return new Promise(function (resolve, reject) {
        // @ts-ignore
        var maxWidth = options.maxWidth || 800; // @ts-ignore

        var maxHeight = options.maxHeight || 800; // @ts-ignore

        var quality = options.quality || .8; // @ts-ignore

        if (!_this.dataUrl) {
          return reject({
            message: '[error] QuillImageDropAndPaste: Fail to minify the image, dataUrl should not be empty.'
          });
        }

        var image = new Image();

        image.onload = function () {
          var width = image.width;
          var height = image.height;

          if (width > height) {
            if (width > maxWidth) {
              image.height = height * maxWidth / width;
              image.width = maxWidth;
            }
          } else {
            if (height > maxHeight) {
              image.width = width * maxHeight / height;
              image.height = maxHeight;
            }
          }

          var canvas = document.createElement('canvas');
          canvas.width = image.width;
          canvas.height = image.height;
          var ctx = canvas.getContext('2d'); // @ts-ignore

          ctx.drawImage(image, 0, 0, image.width, image.height); // @ts-ignore

          var canvasType = _this.type || 'image/png';
          var canvasDataUrl = canvas.toDataURL(canvasType, quality);
          resolve(new ImageData(canvasDataUrl, canvasType));
        }; // @ts-ignore


        image.src = _this.dataUrl;
      });
    }
    /* convert blob to file
    */

  }, {
    key: "toFile",
    value: function toFile(filename) {
      if (!window.File) {
        console.error('[error] QuillImageDropAndPaste: Your browser didnot support File API.');
        return null;
      } // @ts-ignore


      return new File([this.toBlob()], filename, {
        type: this.type
      });
    }
    /* convert dataURL to blob
    */

  }, {
    key: "toBlob",
    value: function toBlob() {
      // @ts-ignore
      var base64 = this.dataUrl.replace(/^[^,]+,/, '');
      var buff = this.binaryStringToArrayBuffer(atob(base64)); // @ts-ignore

      return this.createBlob([buff], {
        type: this.type
      });
    }
    /* generate array buffer from binary string
    */

  }, {
    key: "binaryStringToArrayBuffer",
    value: function binaryStringToArrayBuffer(binary) {
      var len = binary.length;
      var buffer = new ArrayBuffer(len);
      var arr = new Uint8Array(buffer);
      var i = -1;

      while (++i < len) {
        arr[i] = binary.charCodeAt(i);
      }

      return buffer;
    }
    /* create blob
    */

  }, {
    key: "createBlob",
    value: function createBlob() {
      var parts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
      var properties = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
      if (typeof properties === 'string') properties = {
        type: properties
      };

      try {
        return new Blob(parts, properties);
      } catch (e) {
        if (e.name !== 'TypeError') throw e; // @ts-ignore

        var Builder = typeof BlobBuilder !== 'undefined' // @ts-ignore
        ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' // @ts-ignore
        ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' // @ts-ignore
        ? MozBlobBuilder : WebKitBlobBuilder;
        var builder = new Builder();

        for (var i = 0; i < parts.length; i++) {
          builder.append(parts[i]);
        } // @ts-ignore


        return builder.getBlob(properties.type);
      }
    }
  }]);

  return ImageData;
}();

var ImageDropAndPaste = /*#__PURE__*/function () {
  function ImageDropAndPaste(quill) {
    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};

    _classCallCheck(this, ImageDropAndPaste);

    // @ts-ignore
    this.quill = quill; // @ts-ignore

    this.options = options;
    this.handleDrop = this.handleDrop.bind(this);
    this.handlePaste = this.handlePaste.bind(this); // @ts-ignore

    this.quill.root.addEventListener('drop', this.handleDrop, false); // @ts-ignore

    this.quill.root.addEventListener('paste', this.handlePaste, false);
  }
  /* handle image drop event
  */


  _createClass(ImageDropAndPaste, [{
    key: "handleDrop",
    value: function handleDrop(e) {
      var _this2 = this;

      e.preventDefault();

      if (e.dataTransfer && e.dataTransfer.files && e.dataTransfer.files.length) {
        if (document.caretRangeFromPoint) {
          var selection = document.getSelection();
          var range = document.caretRangeFromPoint(transformZoomData(e.clientX), transformZoomData(e.clientY));

          if (selection && range) {
            selection.setBaseAndExtent(range.startContainer, range.startOffset, range.startContainer, range.startOffset);
          }
        }

        this.readFiles(e.dataTransfer.files, function (dataUrl, type) {
          type = type || 'image/png'; // @ts-ignore

          if (typeof _this2.options.handler === 'function') {
            // @ts-ignore
            _this2.options.handler.call(_this2, dataUrl, type, new ImageData(dataUrl, type));
          } else {
            _this2.insert.call(_this2, dataUrl, type);
          }
        }, e);
      }
    }
    /* handle image paste event
    */

  }, {
    key: "handlePaste",
    value: function handlePaste(e) {
      var _this3 = this;

      if (e.clipboardData && e.clipboardData.items && e.clipboardData.items.length) {
        this.readFiles(e.clipboardData.items, function (dataUrl, type) {
          type = type || 'image/png'; // @ts-ignore

          if (typeof _this3.options.handler === 'function') {
            // @ts-ignore
            _this3.options.handler.call(_this3, dataUrl, type, new ImageData(dataUrl, type));
          } else {
            _this3.insert(dataUrl);
          }
        }, e);
      }
    }
    /* read the files
    */

  }, {
    key: "readFiles",
    value: function readFiles(files, callback, e) {
      [].forEach.call(files, function (file) {
        var type = file.type;
        if (!type.match(/^image\/(gif|jpe?g|a?png|svg|webp|bmp)/i)) return;
        e.preventDefault();
        var reader = new FileReader();

        reader.onload = function (e) {
          // @ts-ignore
          callback(e.target.result, type);
        };

        var blob = file.getAsFile ? file.getAsFile() : file;
        if (blob instanceof Blob) reader.readAsDataURL(blob);
      });
    }
    /* insert into the editor
    */

  }, {
    key: "insert",
    value: function insert(dataUrl) {
      // @ts-ignore
      var index = (this.quill.getSelection() || {}).index || this.quill.getLength(); // @ts-ignore

      this.quill.insertEmbed(index, 'image', dataUrl, 'user');
    }
  }]);

  return ImageDropAndPaste;
}(); // @ts-ignore


ImageDropAndPaste.ImageData = ImageData;
export default ImageDropAndPaste;
//# sourceMappingURL=imageDropAndPaste.js.map
