From 513c7dcefcc255bc8ffcef96f1a8b045ac6bceb5 Mon Sep 17 00:00:00 2001 From: varun-s22 <93476421+varun-s22@users.noreply.github.com> Date: Sat, 21 Jan 2023 02:24:31 +0530 Subject: [PATCH 1/3] Added progress bar for electron * Added progress on the icon to show progress of files downloaded. * Dialog box for asking file location is switched on by default. * File location where the file is downloaded is opened by default. --- app/main/handle-external-link.ts | 19 ++++++++++++++++++- app/main/index.ts | 2 +- app/renderer/js/main.ts | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/app/main/handle-external-link.ts b/app/main/handle-external-link.ts index 0a75a0cbd..0033646fc 100644 --- a/app/main/handle-external-link.ts +++ b/app/main/handle-external-link.ts @@ -1,5 +1,6 @@ import {shell} from "electron/common"; import type { + BrowserWindow, HandlerDetails, SaveDialogOptions, WebContents, @@ -104,6 +105,7 @@ export default function handleExternalLink( contents: WebContents, details: HandlerDetails, mainContents: WebContents, + win: BrowserWindow, ): void { let url: URL; try { @@ -118,22 +120,37 @@ export default function handleExternalLink( ); if (isUploadsUrl(new URL(contents.getURL()).origin, url)) { + let currProgress = 0; + let interval = 0.5; + const progressInterval = setInterval(() => { + win.setProgressBar(currProgress); + if (currProgress < 1) { + currProgress += interval; + interval /= 2; + } + }, 1000); downloadFile({ contents, url: url.href, downloadPath, async completed(filePath: string, fileName: string) { + win.setProgressBar(1); + clearInterval(progressInterval); const downloadNotification = new Notification({ title: "Download Complete", body: `Click to show ${fileName} in folder`, silent: true, // We'll play our own sound - ding.ogg }); + shell.showItemInFolder(filePath); downloadNotification.on("click", () => { // Reveal file in download folder shell.showItemInFolder(filePath); }); downloadNotification.show(); - + setTimeout(() => { + downloadNotification.close(); + win.setProgressBar(-1); + }, 3000); // Play sound to indicate download complete if (!ConfigUtil.getConfigItem("silent", false)) { send(mainContents, "play-ding-sound"); diff --git a/app/main/index.ts b/app/main/index.ts index 523258fac..5e0aacf6c 100644 --- a/app/main/index.ts +++ b/app/main/index.ts @@ -179,7 +179,7 @@ function createMainWindow(): BrowserWindow { app.on("web-contents-created", (_event: Event, contents: WebContents) => { contents.setWindowOpenHandler((details) => { - handleExternalLink(contents, details, page); + handleExternalLink(contents, details, page, mainWindow); return {action: "deny"}; }); }); diff --git a/app/renderer/js/main.ts b/app/renderer/js/main.ts index 2830fbac6..5e2d84b15 100644 --- a/app/renderer/js/main.ts +++ b/app/renderer/js/main.ts @@ -191,7 +191,7 @@ export class ServerManagerView { }, downloadsPath: `${app.getPath("downloads")}`, quitOnClose: false, - promptDownload: false, + promptDownload: true, }; // Platform specific settings From 08ac76c0222259f72eede041eae2baf28ba5c7b8 Mon Sep 17 00:00:00 2001 From: varun-s22 <93476421+varun-s22@users.noreply.github.com> Date: Mon, 23 Jan 2023 21:46:53 +0530 Subject: [PATCH 2/3] Fixed issues Fixed some bugs Refactored code Works well on mac-os --- app/main/handle-external-link.ts | 34 +++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/app/main/handle-external-link.ts b/app/main/handle-external-link.ts index 0033646fc..6a9a5e4eb 100644 --- a/app/main/handle-external-link.ts +++ b/app/main/handle-external-link.ts @@ -21,12 +21,14 @@ function isUploadsUrl(server: string, url: URL): boolean { function downloadFile({ contents, url, + win, downloadPath, completed, failed, }: { contents: WebContents; url: string; + win: BrowserWindow; downloadPath: string; completed(filePath: string, fileName: string): Promise; failed(state: string): void; @@ -60,6 +62,12 @@ function downloadFile({ item.setSavePath(setFilePath); } + let currProgress = 0; + let interval = 0.5; + const progressInterval = setInterval(() => { + win.setProgressBar(currProgress); + }, 1000); + const updatedListener = (_event: Event, state: string): void => { switch (state) { case "interrupted": { @@ -68,15 +76,22 @@ function downloadFile({ "Download interrupted, cancelling and fallback to dialog download.", ); item.cancel(); + win.setProgressBar(-1); break; } case "progressing": { if (item.isPaused()) { item.cancel(); + win.setProgressBar(-1); + break; } - // This event can also be used to show progress in percentage in future. + if (currProgress < 1) { + interval /= 2; + } + + currProgress += interval; break; } @@ -90,11 +105,16 @@ function downloadFile({ item.once("done", async (_event: Event, state) => { if (state === "completed") { await completed(item.getSavePath(), path.basename(item.getSavePath())); + win.setProgressBar(1); } else { + win.setProgressBar(-1); + clearInterval(progressInterval); console.log("Download failed state:", state); + failed(state); } + clearInterval(progressInterval); // To stop item for listening to updated events of this file item.removeListener("updated", updatedListener); }); @@ -120,22 +140,12 @@ export default function handleExternalLink( ); if (isUploadsUrl(new URL(contents.getURL()).origin, url)) { - let currProgress = 0; - let interval = 0.5; - const progressInterval = setInterval(() => { - win.setProgressBar(currProgress); - if (currProgress < 1) { - currProgress += interval; - interval /= 2; - } - }, 1000); downloadFile({ contents, url: url.href, + win, downloadPath, async completed(filePath: string, fileName: string) { - win.setProgressBar(1); - clearInterval(progressInterval); const downloadNotification = new Notification({ title: "Download Complete", body: `Click to show ${fileName} in folder`, From ab76f369fdee5504d39f7341ed8512580df23afa Mon Sep 17 00:00:00 2001 From: varun-s22 <93476421+varun-s22@users.noreply.github.com> Date: Tue, 24 Jan 2023 18:08:23 +0530 Subject: [PATCH 3/3] Updated progress bar Updated progress bar, to show live progress. Progress is calculated by recivedBytes/totalBytes. --- app/main/handle-external-link.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/app/main/handle-external-link.ts b/app/main/handle-external-link.ts index 6a9a5e4eb..f3a013c88 100644 --- a/app/main/handle-external-link.ts +++ b/app/main/handle-external-link.ts @@ -35,6 +35,7 @@ function downloadFile({ }) { contents.downloadURL(url); contents.session.once("will-download", async (_event: Event, item) => { + const totalFileSize = item.getTotalBytes(); if (ConfigUtil.getConfigItem("promptDownload", false)) { const showDialogOptions: SaveDialogOptions = { defaultPath: path.join(downloadPath, item.getFilename()), @@ -63,9 +64,8 @@ function downloadFile({ } let currProgress = 0; - let interval = 0.5; const progressInterval = setInterval(() => { - win.setProgressBar(currProgress); + win.setProgressBar(currProgress / totalFileSize); }, 1000); const updatedListener = (_event: Event, state: string): void => { @@ -87,11 +87,7 @@ function downloadFile({ break; } - if (currProgress < 1) { - interval /= 2; - } - - currProgress += interval; + currProgress = item.getReceivedBytes(); break; }