From 07487415c17c43e010616fbb9e0cb05696cb09ea Mon Sep 17 00:00:00 2001
From: G2-Games <ke0bhogsg@gmail.com>
Date: Tue, 29 Oct 2024 00:17:34 -0500
Subject: [PATCH] Add paste event to upload options

---
 src/main.rs    |  2 +-
 web/request.js | 36 +++++++++++++++++++++++++-----------
 2 files changed, 26 insertions(+), 12 deletions(-)

diff --git a/src/main.rs b/src/main.rs
index e303df3..0db35b6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -53,7 +53,7 @@ fn home(settings: &State<Settings>) -> Markup {
             hr;
             button.main_file_upload #fileButton onclick="document.getElementById('fileInput').click()" {
                 h4 { "Upload File(s)" }
-                p { "Click or Drag and Drop" }
+                p { "Click, Paste, or Drag and Drop" }
             }
             h3 { "Expire after:" }
             div id="durationBox" {
diff --git a/web/request.js b/web/request.js
index 5f7e4cb..42d2ab3 100644
--- a/web/request.js
+++ b/web/request.js
@@ -10,7 +10,7 @@ async function formSubmit() {
     const duration = form.elements.duration.value;
     const maxSize = form.elements.fileUpload.dataset.maxFilesize;
 
-    await fileSend(files, duration, maxSize);
+    await sendFile(files, duration, maxSize);
 
     // Reset the form file data since we've successfully submitted it
     form.elements.fileUpload.value = "";
@@ -20,12 +20,6 @@ async function dragDropSubmit(evt) {
     const form = document.getElementById("uploadForm");
     const duration = form.elements.duration.value;
 
-    const files = getDroppedFiles(evt);
-
-    await fileSend(files, duration);
-}
-
-function getDroppedFiles(evt) {
     evt.preventDefault();
 
     const files = [];
@@ -44,10 +38,25 @@ function getDroppedFiles(evt) {
         });
     }
 
-    return files;
+    await sendFile(files, duration);
 }
 
-async function fileSend(files, duration, maxSize) {
+async function pasteSubmit(evt) {
+    const form = document.getElementById("uploadForm");
+    const duration = form.elements.duration.value;
+
+    evt.preventDefault();
+
+    const files = [];
+    [...evt.clipboardData.files].forEach((file, _) => {
+        // If dropped items aren't files, reject them
+        files.push(file);
+    });
+
+    await sendFile(files, duration);
+}
+
+async function sendFile(files, duration, maxSize) {
     for (const file of files) {
         const [linkRow, progressBar, progressText] = addNewToList(file.name);
         if (file.size > maxSize) {
@@ -92,7 +101,6 @@ function makeErrored(progressBar, progressText, linkRow, errorMessage) {
 
 function makeFinished(progressBar, progressText, linkRow, response) {
     progressText.textContent = "";
-    const _name = encodeURIComponent(response.name);
     const link = progressText.appendChild(document.createElement("a"));
     link.textContent = response.mmid;
     link.href = "/f/" + response.mmid;
@@ -191,11 +199,17 @@ async function initEverything() {
 
 // This is the entrypoint for everything basically
 document.addEventListener("DOMContentLoaded", function(_event) {
+    // Respond to form submissions
     const form = document.getElementById("uploadForm");
     form.addEventListener("submit", formSubmit);
-    let fileButton = document.getElementById("fileButton");
 
+    // Respond to file paste events
+    window.addEventListener("paste", (event) => {pasteSubmit(event)});
+
+    // Respond to drag and drop stuff
+    let fileButton = document.getElementById("fileButton");
     document.addEventListener("drop", (e) => {e.preventDefault();}, false);
+    document.addEventListener("dragover", (e) => {e.preventDefault()}, false);
     fileButton.addEventListener("dragover", (e) => {e.preventDefault();}, false);
     fileButton.addEventListener("drop", dragDropSubmit, false);