From 1c0017d763762f2b8fbf06e05521b6b695b75588 Mon Sep 17 00:00:00 2001 From: ed Date: Wed, 21 Sep 2022 23:39:36 +0200 Subject: [PATCH] up2k: upload-complete notification --- copyparty/web/browser.js | 5 +++++ copyparty/web/up2k.js | 43 +++++++++++++++++++++++++++++++++++----- 2 files changed, 43 insertions(+), 5 deletions(-) diff --git a/copyparty/web/browser.js b/copyparty/web/browser.js index 5b59132e..8771847a 100644 --- a/copyparty/web/browser.js +++ b/copyparty/web/browser.js @@ -125,6 +125,8 @@ var Ls = { "cut_az": "upload files in alphabetical order, rather than smallest-file-first$N$Nalphabetical order can make it easier to eyeball if something went wrong on the server, but it makes uploading slightly slower on fiber / LAN", + "cut_nag": "audible alert when upload completes", + "cut_mt": "use multithreading to accelerate file hashing$N$Nthis uses web-workers and requires$Nmore RAM (up to 512 MiB extra)$N$N30% faster https, 4.5x faster http,$Nand 5.3x faster on android phones", "cft_text": "favicon text (blank and refresh to disable)", @@ -491,6 +493,8 @@ var Ls = { "cut_az": "last opp filer i alfabetisk rekkefølge, istedenfor minste-fil-først$N$Nalfabetisk kan gjøre det lettere å anslå om alt gikk bra, men er bittelitt tregere på fiber / LAN", + "cut_nag": "lydvarsel når opplastning er ferdig", + "cut_mt": "raskere befaring ved å bruke hele CPU'en$N$Ndenne funksjonen anvender web-workers$Nog krever mer RAM (opptil 512 MiB ekstra)$N$N30% raskere https, 4.5x raskere http,$Nog 5.3x raskere på android-telefoner", "cft_text": "ikontekst (blank ut og last siden på nytt for å deaktivere)", @@ -917,6 +921,7 @@ ebi('op_cfg').innerHTML = ( ' date-chk\n' + ' 💤\n' + ' az\n' + + ' 🔔\n' + ' \n' + ' \n' + '\n' + diff --git a/copyparty/web/up2k.js b/copyparty/web/up2k.js index cf7bf9cd..0e741078 100644 --- a/copyparty/web/up2k.js +++ b/copyparty/web/up2k.js @@ -615,6 +615,9 @@ function Donut(uc, st) { var r = this, el = null, psvg = null, + tenstrobe = null, + tstrober = null, + strobes = [], o = 20 * 2 * Math.PI, optab = QS('#ops a[data-dest="up2k"]'); @@ -664,11 +667,15 @@ function Donut(uc, st) { r.base = pos(); optab.innerHTML = ya ? svg() : optab.getAttribute('ico'); el = QS('#ops a .donut'); + clearTimeout(tenstrobe); if (!ya) { favico.upd(); wintitle(); + if (document.visibilityState == 'hidden') + tenstrobe = setTimeout(enstrobe, 500); //debounce } }; + r.do = function () { if (!el) return; @@ -701,6 +708,22 @@ function Donut(uc, st) { r.fc = 0; } }; + + function enstrobe() { + strobes = ['████████████████', '________________', '████████████████']; + tstrober = setInterval(strobe, 300); + + // firefox may forget that filedrops are user-gestures so it can skip this: + if (uc.upnag && window.Notification && Notification.permission == 'granted') + new Notification(uc.nagtxt); + } + + function strobe() { + var txt = strobes.pop(); + wintitle(txt); + if (!txt) + clearInterval(tstrober); + } } @@ -810,6 +833,7 @@ function up2k_init(subtle) { bcfg_bind(uc, 'datechk', 'u2tdate', turbolvl < 3, null, false); bcfg_bind(uc, 'az', 'u2sort', u2sort.indexOf('n') + 1, set_u2sort, false); bcfg_bind(uc, 'hashw', 'hashw', !!window.WebAssembly && (!subtle || !CHROME || MOBILE), set_hashw, false); + bcfg_bind(uc, 'upnag', 'upnag', false, set_upnag, false); var st = { "files": [], @@ -1625,15 +1649,15 @@ function up2k_init(subtle) { console.log('toast', ok, ng); if (ok && ng) - toast.warn(t, (sr ? L.ur_sm : L.ur_um).format(ok, ng)); + toast.warn(t, uc.nagtxt = (sr ? L.ur_sm : L.ur_um).format(ok, ng)); else if (ok > 1) - toast.ok(t, (sr ? L.ur_aso : L.ur_auo).format(ok)); + toast.ok(t, uc.nagtxt = (sr ? L.ur_aso : L.ur_auo).format(ok)); else if (ok) - toast.ok(t, sr ? L.ur_1so : L.ur_1uo); + toast.ok(t, uc.nagtxt = sr ? L.ur_1so : L.ur_1uo); else if (ng > 1) - toast.err(t, (sr ? L.ur_asn : L.ur_aun).format(ng)); + toast.err(t, uc.nagtxt = (sr ? L.ur_asn : L.ur_aun).format(ng)); else if (ng) - toast.err(t, sr ? L.ur_1sn : L.ur_1un); + toast.err(t, uc.nagtxt = sr ? L.ur_1sn : L.ur_1un); timer.rm(etafun); timer.rm(donut.do); @@ -2614,6 +2638,15 @@ function up2k_init(subtle) { } } + function set_upnag(en) { + if (!window.Notification) { + bcfg_set('upnag', false); + toast.err(10, "https only"); + } + if (en && Notification.permission == 'default') + Notification.requestPermission(); + } + ebi('nthread_add').onclick = function (e) { ev(e); bumpthread(1);