From c796cade4e55e4730cbe31833b3a258fb32a3a82 Mon Sep 17 00:00:00 2001 From: huangjx Date: Sun, 24 Apr 2022 12:03:13 +0800 Subject: [PATCH] cleaning up polling code --- src/App.vue | 2 +- src/actions/updatePage.js | 33 +++++++++----------- src/utils/helper.js | 66 +++++++++++++++++++++++---------------- 3 files changed, 54 insertions(+), 47 deletions(-) diff --git a/src/App.vue b/src/App.vue index 098d5e7..85ed990 100644 --- a/src/App.vue +++ b/src/App.vue @@ -94,7 +94,7 @@ export default { vm.$data.loading = 0; return; } - helper.enabledPolling = 0; + helper.disablePolling(); contentTable.getInstance().loading(); let url = formWrapper.getAttribute("action"); diff --git a/src/actions/updatePage.js b/src/actions/updatePage.js index 4aea671..97fad37 100644 --- a/src/actions/updatePage.js +++ b/src/actions/updatePage.js @@ -1,7 +1,5 @@ import helper from '../utils/helper' import eventHandler from '../lib/eventHandler'; -import Http from '../lib/http' - const basePath = "/apps/ncdownloader/status/"; const tableContainer = ".table"; export default { @@ -18,33 +16,30 @@ export default { } let name = type + "-downloads"; //avoid repeated click - if (currentType === name && helper.enabledPolling) { + if (currentType === name && helper.isPolling()) { return; } - helper.enabledPolling = 1; - //$(tableContainer).removeClass().addClass("table " + name); container.setAttribute("type", name); container.className = "table " + name; let delay = 15000; if (['active', 'youtube-dl'].includes(type)) { delay = 1500; } - helper.loop(helper.refresh, delay, ...[path]) + helper.polling(delay, path); }; - eventHandler.add("click",".waiting-downloads a",event => clickHandler(event, 'waiting')); - eventHandler.add("click",".complete-downloads a",event => clickHandler(event, 'complete')); - eventHandler.add("click",".active-downloads a",event => clickHandler(event, 'active')); - eventHandler.add("click",".fail-downloads a",event => clickHandler(event, 'fail')); - eventHandler.add("click",".youtube-dl-downloads a",event => clickHandler(event, 'youtube-dl')); - eventHandler.add("click", "#ncdownloader-table-wrapper",".download-file-folder", function (event) { + eventHandler.add("click", ".waiting-downloads a", event => clickHandler(event, 'waiting')); + eventHandler.add("click", ".complete-downloads a", event => clickHandler(event, 'complete')); + eventHandler.add("click", ".active-downloads a", event => clickHandler(event, 'active')); + eventHandler.add("click", ".fail-downloads a", event => clickHandler(event, 'fail')); + eventHandler.add("click", ".youtube-dl-downloads a", event => clickHandler(event, 'youtube-dl')); + eventHandler.add("click", "#ncdownloader-table-wrapper", ".download-file-folder", function (event) { event.stopPropagation(); - const path = "/apps/ncdownloader/update"; - let url = helper.generateUrl(path); - Http.getInstance(url).setMethod('GET').send(); + event.preventDefault(); + let ele = event.target; + let url = ele.getAttribute("href"); + helper.scanFolder().then(() => { + helper.redirect(url); + }); }); - helper.polling(function (url) { - url = helper.generateUrl(url); - Http.getInstance(url).setMethod('GET').send(); - }, 60000, "/apps/ncdownloader/update"); } } \ No newline at end of file diff --git a/src/utils/helper.js b/src/utils/helper.js index aba3181..9ba6948 100644 --- a/src/utils/helper.js +++ b/src/utils/helper.js @@ -6,6 +6,7 @@ import "toastify-js/src/toastify.css" import { translate as t, translatePlural as n } from '@nextcloud/l10n' import contentTable from '../lib/contentTable'; import Http from '../lib/http' +import Polling from "../lib/polling"; const helper = { vue: {}, @@ -16,12 +17,42 @@ const helper = { return helper.vue[name]; }, generateUrl: generateUrl, - loop(callback, delay, ...args) { - callback(...args); - clearTimeout(helper.timeoutID); - this.polling(callback, delay, ...args); + isPolling() { + return Polling.create().isEnabled(); + }, + enabePolling() { + Polling.create().enable(); + }, + disablePolling() { + Polling.create().disable().clear(); + }, + polling(delay = 1000, path) { + Polling.create().setDelay(delay).run(helper.refresh, path); + }, + scanFolder(path = "/apps/ncdownloader/scanfolder") { + let url = helper.generateUrl(path); + return new Promise((resolve) => { + Http.getInstance(url).setMethod('GET').setHandler(function (data) { + resolve(data.status); + }).send(); + }); + }, + pollingFolder(delay = 1000) { + Polling.create().setDelay(delay).run(helper.scanFolder); + }, + refresh(path) { + path = path || "/apps/ncdownloader/status/active"; + let url = helper.generateUrl(path); + Http.getInstance(url).setHandler(function (data) { + if (data && data.row) { + contentTable.getInstance(data.title, data.row).create(); + } else { + contentTable.getInstance().noData(); + } + if (data.counter) + helper.updateCounter(data.counter); + }).send(); }, - enabledPolling: 0, trim(string, char) { return string.split(char).filter(Boolean).join(char) }, @@ -32,15 +63,6 @@ const helper = { ucfirst(string) { return string.charAt(0).toUpperCase() + string.slice(1) }, - polling(callback, delay, ...args) { - self = this; - helper.timeoutID = setTimeout(function () { - if (self.enabledPolling) { - callback(...args); - self.polling(callback, delay, ...args); - } - }, delay); - }, isURL(url) { let regex = '^((https?|ftp)://)([a-z0-9-]+\.)?(?:[-a-zA-Z0-9()@:%_\+.~#?&/=]+)$'; const pattern = new RegExp(regex, 'i'); @@ -115,19 +137,6 @@ const helper = { counter.innerHTML = '
' + data[key] + '
'; } }, - refresh(path) { - path = path || "/apps/ncdownloader/status/active"; - let url = helper.generateUrl(path); - Http.getInstance(url).setHandler(function (data) { - if (data && data.row) { - contentTable.getInstance(data.title, data.row).create(); - } else { - contentTable.getInstance().noData(); - } - if (data.counter) - helper.updateCounter(data.counter); - }).send(); - }, html2DOM: function (htmlString) { const parser = new window.DOMParser(); let doc = parser.parseFromString(htmlString, "text/html") @@ -253,6 +262,9 @@ const helper = { resetSearch: function (vm) { vm.$data.loading = 0; contentTable.getInstance([], []).clear(); + }, + redirect(url) { + window.location.href = url; } }