paster442

assets.scratch.mit.edu images uploader

Aug 7th, 2021
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { insert } from "../../libraries/thirdparty/cs/text-field-edit.js";
  2. export default async function ({ addon, global, console, msg, safeMsg }) {
  3.   await addon.tab.loadScript(addon.self.lib + "/thirdparty/cs/md5.min.js");
  4.  
  5.   var toolbar =
  6.     document.querySelector("#markItUpId_body > div > div.markItUpHeader > ul") ||
  7.     document.querySelector("#markItUpId_signature > div > div.markItUpHeader > ul");
  8.  
  9.   var textBox = document.querySelector("#id_body") || document.querySelector("#id_signature");
  10.   if (!textBox) return;
  11.  
  12.   //input  hidden)
  13.   var uploadInput = document.createElement("input");
  14.   uploadInput.type = "file";
  15.  
  16.   uploadInput.accept = "image/*";
  17.   uploadInput.style.display = "none";
  18.  
  19.   //button (the one the user interacts with)
  20.   var inputButtonContainer = document.createElement("li");
  21.   addon.tab.displayNoneWhileDisabled(inputButtonContainer);
  22.   inputButtonContainer.className = "markItUpButton markItUpButton17";
  23.  
  24.   var inputButton = document.createElement("a");
  25.   inputButton.id = "uploadButton";
  26.  
  27.   let progresselement;
  28.  
  29.   inputButton.title = msg("upload-image");
  30.   inputButton.style.backgroundImage =
  31.     "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAABVUlEQVQ4jc3SO0tCYRzH8WcOegNtTb2BXkO1SNBuFyJqC1uihhqCNCIH8xKU8BzzcspQEskWC8IWcRCji8WxEnrSCKqh+dvQRTwcybZ+8J3+8Jn+QvyL2byHfDe9c7r/d8CdJlB5JVB5xeZOt10DcKV+gHazuVINQNi9iIUDizJfWdzsXhOQrDeXqOEz3vllvtbAngIgm822DKABJB6b27n/AeZST8zEqyylr4jmT3DsVi0A/a45rQxAOByme+2BzuUbRpOb3L4MIBbLSClNwHa5ua0SALFYDOeZTn/mnI6goke/pmvbsACCpUb+AsJfACASiTB1tULwfZF15Wb+eRDn27gFsHqE2Mh/5skhPDkANE2j/3iWseIkExcOhorD9F32moBh/4iwezEHIKVEKUWtVsMwDOr1OkopE9Bi34CUklAohK7rxONxotEomqa1Bfh++6QPwtgXjMvZERUAAAAASUVORK5CYII=')";
  32.  
  33.   inputButtonContainer.appendChild(inputButton);
  34.  
  35.   //add it
  36.   if (toolbar) {
  37.     //make sure that i can type here and that there's a textbox
  38.     document.querySelector(".markItUpButton5").insertAdjacentElement("afterend", inputButtonContainer);
  39.     document.body.appendChild(uploadInput);
  40.   }
  41.  
  42.   //events
  43.   const onButtonClick = (e) => {
  44.     //click on the button
  45.     uploadInput.click(); //simulate clicking on the real input
  46.   };
  47.  
  48.   const onFileUpload = (e) => {
  49.     //when the input has a new file
  50.     var file = uploadInput.files[0];
  51.     var extension = uploadInput.files[0].name.split(".").pop().toLowerCase();
  52.     var reader = new FileReader();
  53.  
  54.     reader.readAsArrayBuffer(file);
  55.  
  56.     reader.onloadend = function () {
  57.       uploadAssetImage(reader.result, extension);
  58.     };
  59.  
  60.     reader.onerror = (err) => {
  61.       alert(msg("load-error"));
  62.       progresselement.remove();
  63.       throw err;
  64.     };
  65.   };
  66.  
  67.   const onPaste = (e) => {
  68.     retrieveImageFromClipboardAsBlob(e, (imageBlob) => {
  69.       if (imageBlob) {
  70.         var reader = new FileReader();
  71.  
  72.         reader.readAsArrayBuffer(imageBlob);
  73.  
  74.         reader.onloadend = function () {
  75.           var extension = imageBlob.name.split(".").pop().toLowerCase();
  76.  
  77.           uploadAssetImage(reader.result, extension);
  78.         };
  79.  
  80.         reader.onerror = (err) => {
  81.           alert(msg("load-error"));
  82.           progresselement.remove();
  83.           throw err;
  84.         };
  85.       }
  86.     });
  87.   };
  88.  
  89.   const onDragEnter = () => {
  90.     textBox.style.backgroundColor = "rgba(0, 0, 0, 0.1)";
  91.   };
  92.  
  93.   const onDragLeave = () => {
  94.     textBox.style.backgroundColor = "transparent";
  95.   };
  96.  
  97.   const onDragEnd = () => {
  98.     textBox.style.backgroundColor = "transparent";
  99.   };
  100.  
  101.   const onDrop = (e) => {
  102.     textBox.style.backgroundColor = "";
  103.     console.log(e.dataTransfer);
  104.     var file = e.dataTransfer.files[0];
  105.     if (file) {
  106.       e.preventDefault();
  107.       e.stopPropagation();
  108.  
  109.       var reader = new FileReader();
  110.       reader.readAsArrayBuffer(file);
  111.  
  112.       reader.onloadend = function () {
  113.         var extension = file.name.split(".").pop().toLowerCase();
  114.  
  115.         uploadAssetImage(reader.result, extension);
  116.       };
  117.  
  118.       reader.onerror = (err) => {
  119.         alert(msg("load-error"));
  120.         progresselement.remove();
  121.         throw err;
  122.       };
  123.     }
  124.   };
  125.  
  126.   function addListeners() {
  127.     inputButton.addEventListener("click", onButtonClick);
  128.     uploadInput.addEventListener("change", onFileUpload);
  129.     textBox.addEventListener("paste", onPaste);
  130.     textBox.addEventListener("dragenter", onDragEnter);
  131.     textBox.addEventListener("dragleave", onDragLeave);
  132.     textBox.addEventListener("dragend", onDragEnd);
  133.     textBox.addEventListener("drop", onDrop);
  134.   }
  135.   function removeListeners() {
  136.     inputButton.removeEventListener("click", onButtonClick);
  137.     uploadInput.removeEventListener("change", onFileUpload);
  138.     textBox.removeEventListener("paste", onPaste);
  139.     textBox.removeEventListener("dragenter", onDragEnter);
  140.     textBox.removeEventListener("dragleave", onDragLeave);
  141.     textBox.removeEventListener("dragend", onDragEnd);
  142.     textBox.removeEventListener("drop", onDrop);
  143.   }
  144.   addListeners();
  145.   addon.self.addEventListener("disabled", () => removeListeners());
  146.   addon.self.addEventListener("reenabled", () => addListeners());
  147.  
  148.   //cool functions below
  149.   function retrieveImageFromClipboardAsBlob(pasteEvent, callback) {
  150.     if (!pasteEvent.clipboardData) {
  151.       callback(undefined);
  152.     }
  153.  
  154.     var items = pasteEvent.clipboardData.items;
  155.  
  156.     if (!items) {
  157.       callback(undefined);
  158.     }
  159.  
  160.     for (var i = 0; i < items.length; i++) {
  161.       // Skip content if not image
  162.       if (!items[i].type.includes("image")) continue;
  163.       // Retrieve image on clipboard as blob
  164.       var blob = items[i].getAsFile();
  165.  
  166.       callback(blob);
  167.     }
  168.   }
  169.   async function uploadAssetImage(image, fileType) {
  170.     //this is the stuff that matters
  171.     progresselement = toolbar.appendChild(document.createElement("li"));
  172.     progresselement.className = "uploadStatus";
  173.     console.log(image);
  174.  
  175.     var hash = md5(image);
  176.     var type = fileType;
  177.     console.log("type: " + fileType);
  178.  
  179.     progresselement.innerText = msg("uploading");
  180.  
  181.     try {
  182.       var res = await fetch(`https://assets.scratch.mit.edu/${hash}.${type}`, {
  183.         body: image,
  184.         method: "POST",
  185.         mode: "cors",
  186.         credentials: "include",
  187.       });
  188.       var data = await res.json();
  189.  
  190.       if (data.status === "ok") {
  191.         insert(textBox, `[img]https://assets.scratch.mit.edu/get_image/.%2E/${data["content-name"]}[/img]`);
  192.         progresselement.remove();
  193.       } else {
  194.         alert(msg("upload-error"));
  195.         progresselement.remove();
  196.       }
  197.     } catch (error) {
  198.       alert(msg("upload-error"));
  199.       console.log(error);
  200.       progresselement.remove();
  201.     }
  202.   }
  203. }
  204.  
Add Comment
Please, Sign In to add comment