From b2652f29ac75e88de169b07c826fcaf25c9529f0 Mon Sep 17 00:00:00 2001
From: wukko <me@wukko.me>
Date: Tue, 25 Jun 2024 22:52:17 +0600
Subject: [PATCH] web/Omnibox: download right after pasting

---
 web/src/components/save/Omnibox.svelte                | 11 +++++++++--
 web/src/components/save/buttons/DownloadButton.svelte |  6 +++---
 2 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/web/src/components/save/Omnibox.svelte b/web/src/components/save/Omnibox.svelte
index f4d80b54..59e98b5a 100644
--- a/web/src/components/save/Omnibox.svelte
+++ b/web/src/components/save/Omnibox.svelte
@@ -1,4 +1,6 @@
 <script lang="ts">
+    import { SvelteComponent, tick } from "svelte";
+
     import IconLink from "@tabler/icons-svelte/IconLink.svelte";
 
     import ClearButton from "$components/save/buttons/ClearButton.svelte";
@@ -17,6 +19,8 @@
     let link: string = "";
     let isFocused = false;
 
+    let downloadButton: SvelteComponent;
+
     const validLink = (link: string) => {
         try {
             return /^https:/i.test(new URL(link).protocol);
@@ -26,10 +30,13 @@
     };
 
     const pasteClipboard = () => {
-        navigator.clipboard.readText().then((text) => {
+        navigator.clipboard.readText().then(async (text) => {
             let matchLink = text.match(/https:\/\/[^\s]+/g);
             if (matchLink) {
                 link = matchLink[0];
+
+                await tick(); // wait for button to render
+                downloadButton.download(link);
             }
         });
     };
@@ -62,7 +69,7 @@
             <ClearButton click={() => (link = "")} />
         {/if}
         {#if validLink(link)}
-            <DownloadButton url={link} />
+            <DownloadButton url={link} bind:this={downloadButton} />
         {/if}
     </div>
 
diff --git a/web/src/components/save/buttons/DownloadButton.svelte b/web/src/components/save/buttons/DownloadButton.svelte
index aaa9768f..171a2f82 100644
--- a/web/src/components/save/buttons/DownloadButton.svelte
+++ b/web/src/components/save/buttons/DownloadButton.svelte
@@ -11,7 +11,7 @@
     const ua = navigator.userAgent.toLowerCase();
     const isIOS = ua.includes("iphone os") || (ua.includes("mac os") && navigator.maxTouchPoints > 0);
 
-    export const changeDownloadButton = (state: string) => {
+    const changeDownloadButton = (state: string) => {
         isDisabled = true;
         switch(state) {
             case "think":
@@ -29,7 +29,7 @@
         }
     }
 
-    export const restoreDownloadButton = () => {
+    const restoreDownloadButton = () => {
         setTimeout(() => {
             buttonText = '>>';
             isDisabled = false;
@@ -45,7 +45,7 @@
     }
 
     // alerts are temporary, we don't have an error popup yet >_<
-    const download = async (link: string) => {
+    export const download = async (link: string) => {
         changeDownloadButton("think");
 
         const response = await API.request(link);