From 29cf711a6ae2b4c3d307b288ecbcd40238f510b7 Mon Sep 17 00:00:00 2001 From: djmaze Date: Mon, 14 Sep 2020 19:40:56 +0200 Subject: [PATCH] Converted *Ajax into *Fetch (because we use the Fetch API, not jQuery.ajax) --- README.md | 27 +-- dev/App/Admin.js | 2 +- dev/App/User.js | 11 +- dev/Common/Globals.js | 5 +- dev/Common/Links.js | 8 - dev/Promises/AbstractAjax.js | 145 ------------ dev/Promises/AbstractBasic.js | 27 --- dev/Promises/User/Ajax.js | 56 ----- dev/Promises/User/Populator.js | 6 +- dev/Remote/AbstractAjax.js | 216 ----------------- dev/Remote/AbstractFetch.js | 282 +++++++++++++++++++++++ dev/Remote/Admin/{Ajax.js => Fetch.js} | 12 +- dev/Remote/User/{Ajax.js => Fetch.js} | 56 ++++- dev/Settings/Admin/Branding.js | 2 +- dev/Settings/Admin/Contacts.js | 2 +- dev/Settings/Admin/Domains.js | 2 +- dev/Settings/Admin/General.js | 2 +- dev/Settings/Admin/Login.js | 2 +- dev/Settings/Admin/Packages.js | 2 +- dev/Settings/Admin/Plugins.js | 2 +- dev/Settings/Admin/Security.js | 2 +- dev/Settings/User/Accounts.js | 2 +- dev/Settings/User/Contacts.js | 2 +- dev/Settings/User/Filters.js | 2 +- dev/Settings/User/Folders.js | 7 +- dev/Settings/User/General.js | 2 +- dev/Settings/User/OpenPgp.js | 2 +- dev/Settings/User/Security.js | 2 +- dev/Settings/User/Templates.js | 2 +- dev/Settings/User/Themes.js | 2 +- dev/Stores/User/Message.js | 2 +- dev/Stores/User/Template.js | 2 +- dev/Styles/SquireUI.less | 1 + dev/View/Admin/Login.js | 2 +- dev/View/Admin/Settings/Pane.js | 2 +- dev/View/Popup/Account.js | 2 +- dev/View/Popup/Compose.js | 2 +- dev/View/Popup/Contacts.js | 2 +- dev/View/Popup/Domain.js | 2 +- dev/View/Popup/DomainAlias.js | 2 +- dev/View/Popup/FolderClear.js | 2 +- dev/View/Popup/FolderCreate.js | 4 +- dev/View/Popup/FolderSystem.js | 2 +- dev/View/Popup/Identity.js | 2 +- dev/View/Popup/Plugin.js | 2 +- dev/View/Popup/Template.js | 2 +- dev/View/Popup/TwoFactorConfiguration.js | 2 +- dev/View/Popup/TwoFactorTest.js | 2 +- dev/View/User/Login.js | 2 +- dev/View/User/MailBox/MessageList.js | 2 +- dev/View/User/MailBox/MessageView.js | 5 +- dev/bootstrap.js | 1 - 52 files changed, 399 insertions(+), 540 deletions(-) delete mode 100644 dev/Promises/AbstractAjax.js delete mode 100644 dev/Promises/AbstractBasic.js delete mode 100644 dev/Promises/User/Ajax.js delete mode 100644 dev/Remote/AbstractAjax.js create mode 100644 dev/Remote/AbstractFetch.js rename dev/Remote/Admin/{Ajax.js => Fetch.js} (96%) rename dev/Remote/User/{Ajax.js => Fetch.js} (92%) diff --git a/README.md b/README.md index 490a45bdc..0273f1e1b 100644 --- a/README.md +++ b/README.md @@ -85,26 +85,27 @@ Things might work in Edge 18, Firefox 50-62 and Chrome 54-68 due to one polyfill * Removed opentip (use CSS) * Removed non-community (aka Prem/Premium/License) code * Modified Jua.js to be without jQuery +* Replaced *Ajax with *Fetch classes because we use the Fetch API, not jQuery.ajax |js/* |1.14.0 |native | |----------- |--------: |--------: | -|admin.js |2.130.942 | 936.773 | -|app.js |4.184.455 |2.554.276 | -|boot.js | 671.522 | 5.834 | -|libs.js | 647.614 | 327.282 | +|admin.js |2.130.942 | 941.273 | +|app.js |4.184.455 |2.533.271 | +|boot.js | 671.522 | 5.777 | +|libs.js | 647.614 | 327.257 | |polyfills.js | 325.834 | 0 | -|TOTAL |7.960.367 |3.824.165 | +|TOTAL |7.960.367 |3.807.578 | |js/min/* |1.14.0 |native |gzip 1.14 |gzip |brotli | |--------------- |--------: |--------: |--------: |--------: |--------: | -|admin.min.js | 252.147 | 128.449 | 73.657 | 37.486 | 32.167 | -|app.min.js | 511.202 | 348.973 |140.462 | 91.692 | 73.600 | -|boot.min.js | 66.007 | 3.166 | 22.567 | 1.571 | 1.345 | -|libs.min.js | 572.545 | 304.025 |176.720 | 94.879 | 83.565 | +|admin.min.js | 252.147 | 128.671 | 73.657 | 37.600 | 32.254 | +|app.min.js | 511.202 | 346.350 |140.462 | 90.770 | 73.272 | +|boot.min.js | 66.007 | 3.101 | 22.567 | 1.576 | 1.346 | +|libs.min.js | 572.545 | 304.000 |176.720 | 94.870 | 83.524 | |polyfills.min.js | 32.452 | 0 | 11.312 | 0 | 0 | -|TOTAL |1.434.353 | 784.938 |424.718 |225.628 |190.677 | +|TOTAL |1.434.353 | 782.122 |424.718 |224.816 |190.396 | -649.415 bytes (199.090 gzip) is not much, but it feels faster. +652.231 bytes (199.902 gzip) is not much, but it feels faster. ### CSS changes @@ -129,8 +130,8 @@ Things might work in Edge 18, Firefox 50-62 and Chrome 54-68 due to one polyfill |css/* |1.14.0 |native |gzip 1.14 |gzip |brotli | |-------------- |-------: |-------: |------: |------: |------: | -|app.css | 340.334 | 253.711 | 46,959 | 36.587 | 30.802 | -|app.min.css | 274.791 | 207.227 | 39.618 | 31.993 | 27.160 | +|app.css | 340.334 | 253.691 | 46,959 | 36.574 | 30.777 | +|app.min.css | 274.791 | 207.298 | 39.618 | 32.001 | 27.155 | |boot.css | | 2.538 | | 837 | 668 | |boot.min.css | | 2.055 | | 732 | 560 | diff --git a/dev/App/Admin.js b/dev/App/Admin.js index a83740464..e55018721 100644 --- a/dev/App/Admin.js +++ b/dev/App/Admin.js @@ -8,7 +8,7 @@ import CapaStore from 'Stores/Admin/Capa'; import DomainStore from 'Stores/Admin/Domain'; import PluginStore from 'Stores/Admin/Plugin'; import PackageStore from 'Stores/Admin/Package'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import { SettingsAdminScreen } from 'Screen/Admin/Settings'; import { LoginAdminScreen } from 'Screen/Admin/Login'; diff --git a/dev/App/User.js b/dev/App/User.js index fcd90c3d8..fd5816436 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -56,8 +56,7 @@ import QuotaStore from 'Stores/User/Quota'; import * as Local from 'Storage/Client'; -import Remote from 'Remote/User/Ajax'; -import Promises from 'Promises/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { EmailModel } from 'Model/Email'; import { AccountModel } from 'Model/Account'; @@ -382,7 +381,7 @@ class AppUser extends AbstractApp { * @param {Function=} callback = null */ foldersReload(callback = null) { - const prom = Promises.foldersReload(FolderStore.foldersLoading); + const prom = Remote.foldersReload(FolderStore.foldersLoading); if (callback) { prom .then((value) => !!value) @@ -398,16 +397,16 @@ class AppUser extends AbstractApp { } foldersPromisesActionHelper(promise, errorDefCode) { - Promises.abort('Folders') + Remote.abort('Folders') .fastResolve(true) .then(() => promise) .then( () => { - Promises.foldersReloadWithTimeout(FolderStore.foldersLoading); + Remote.foldersReloadWithTimeout(FolderStore.foldersLoading); }, (errorCode) => { FolderStore.folderList.error(getNotification(errorCode, '', errorDefCode)); - Promises.foldersReloadWithTimeout(FolderStore.foldersLoading); + Remote.foldersReloadWithTimeout(FolderStore.foldersLoading); } ); } diff --git a/dev/Common/Globals.js b/dev/Common/Globals.js index 4b68fab72..fe69b9dc5 100644 --- a/dev/Common/Globals.js +++ b/dev/Common/Globals.js @@ -101,8 +101,5 @@ dropdownVisibility.subscribe((value) => { * @type {*} */ export const data = { - __APP__: null, - iAjaxErrorCount: 0, - iTokenErrorCount: 0, - bUnload: false + __APP__: null }; diff --git a/dev/Common/Links.js b/dev/Common/Links.js index ac0f8255b..669f63c34 100644 --- a/dev/Common/Links.js +++ b/dev/Common/Links.js @@ -156,14 +156,6 @@ export function change(email) { return serverRequest('Change') + encodeURIComponent(email) + '/'; } -/** - * @param {string} add - * @returns {string} - */ -export function ajax(add) { - return serverRequest('Ajax') + add; -} - /** * @param {string} requestHash * @returns {string} diff --git a/dev/Promises/AbstractAjax.js b/dev/Promises/AbstractAjax.js deleted file mode 100644 index 6faf26ab6..000000000 --- a/dev/Promises/AbstractAjax.js +++ /dev/null @@ -1,145 +0,0 @@ -import { ajax } from 'Common/Links'; -import { pInt, pString } from 'Common/Utils'; -import { DEFAULT_AJAX_TIMEOUT, TOKEN_ERROR_LIMIT, AJAX_ERROR_LIMIT } from 'Common/Consts'; -import { Notification } from 'Common/Enums'; -import { data as GlobalsData } from 'Common/Globals'; - -import { AbstractBasicPromises } from 'Promises/AbstractBasic'; - -class AbstractAjaxPromises extends AbstractBasicPromises { - oRequests = {}; - - constructor() { - super(); - - this.clear(); - } - - clear() { - this.oRequests = {}; - } - - abort(sAction, bClearOnly) { - if (this.oRequests[sAction]) { - if (!bClearOnly && this.oRequests[sAction].abort) { -// this.oRequests[sAction].__aborted__ = true; - this.oRequests[sAction].abort(); - } - - this.oRequests[sAction] = null; - delete this.oRequests[sAction]; - } - - return this; - } - - ajaxRequest(action, isPost, timeOut, params, additionalGetString, fTrigger) { - - additionalGetString = pString(additionalGetString); - - let init = {}; - - this.setTrigger(fTrigger, true); - - if (window.AbortController) { - this.abort(action); - const controller = new AbortController(); - setTimeout(() => controller.abort(), pInt(timeOut, DEFAULT_AJAX_TIMEOUT)); - init.signal = controller.signal; - this.oRequests[action] = controller; - } - - return rl.fetchJSON(ajax(additionalGetString), init, pInt(timeOut, DEFAULT_AJAX_TIMEOUT), isPost ? params : null) - .then(data => { - this.abort(action, true); - - if (!data) { - return Promise.reject(Notification.AjaxParse); - } - - if (data.UpdateToken) { - rl.hash.set(); - rl.settings.set('AuthAccountHash', data.UpdateToken); - } - -/* - let isCached = false, type = ''; - if (data && data.Time) { - isCached = pInt(data.Time) > microtime() - start; - } - // backward capability - switch (true) { - case 'success' === textStatus && data && data.Result && action === data.Action: - type = StorageResultType.Success; - break; - case 'abort' === textStatus && (!data || !data.__aborted__): - type = StorageResultType.Abort; - break; - default: - type = StorageResultType.Error; - break; - } -*/ - this.setTrigger(fTrigger, false); - - if (!data.Result || action !== data.Action) { - if ([ - Notification.AuthError, - Notification.AccessError, - Notification.ConnectionError, - Notification.DomainNotAllowed, - Notification.AccountNotAllowed, - Notification.MailServerError, - Notification.UnknownNotification, - Notification.UnknownError - ].includes(data.ErrorCode) - ) { - ++GlobalsData.iAjaxErrorCount; - } - - if (Notification.InvalidToken === data.ErrorCode) { - ++GlobalsData.iTokenErrorCount; - } - - if (TOKEN_ERROR_LIMIT < GlobalsData.iTokenErrorCount) { - rl.logoutReload(); - } - - if (data.ClearAuth || data.Logout || AJAX_ERROR_LIMIT < GlobalsData.iAjaxErrorCount) { - if (GlobalsData.__APP__) { - rl.hash.clear(); - - if (!data.ClearAuth) { - rl.logoutReload(); - } - } - } - - return Promise.reject(data.ErrorCode ? data.ErrorCode : Notification.AjaxFalse); - } - - return data; - }).catch(err => { - if (err.name == 'AbortError') { // handle abort() - return Promise.reject(Notification.AjaxAbort); - } - return Promise.reject(err); - }); - } - - getRequest(sAction, fTrigger, sAdditionalGetString, iTimeOut) { - sAdditionalGetString = undefined === sAdditionalGetString ? '' : pString(sAdditionalGetString); - sAdditionalGetString = sAction + '/' + sAdditionalGetString; - - return this.ajaxRequest(sAction, false, iTimeOut, null, sAdditionalGetString, fTrigger); - } - - postRequest(action, fTrigger, params, timeOut) { - params = params || {}; - params.Action = action; - - return this.ajaxRequest(action, true, timeOut, params, '', fTrigger); - } -} - -export { AbstractAjaxPromises, AbstractAjaxPromises as default }; diff --git a/dev/Promises/AbstractBasic.js b/dev/Promises/AbstractBasic.js deleted file mode 100644 index eca778713..000000000 --- a/dev/Promises/AbstractBasic.js +++ /dev/null @@ -1,27 +0,0 @@ -export class AbstractBasicPromises { - oPromisesStack = {}; - - func(fFunc) { - fFunc(); - return this; - } - - fastResolve(mData) { - return Promise.resolve(mData); - } - - fastReject(mData) { - return Promise.reject(mData); - } - - setTrigger(trigger, value) { - if (trigger) { - value = !!value; - (Array.isArray(trigger) ? trigger : [trigger]).forEach((fTrigger) => { - if (fTrigger) { - fTrigger(value); - } - }); - } - } -} diff --git a/dev/Promises/User/Ajax.js b/dev/Promises/User/Ajax.js deleted file mode 100644 index c81d48a3f..000000000 --- a/dev/Promises/User/Ajax.js +++ /dev/null @@ -1,56 +0,0 @@ -import PromisesPopulator from 'Promises/User/Populator'; -import { AbstractAjaxPromises } from 'Promises/AbstractAjax'; - -class UserAjaxUserPromises extends AbstractAjaxPromises { - constructor() { - super(); - - this.foldersTimeout = 0; - } - - foldersReload(fTrigger) { - return this.abort('Folders') - .postRequest('Folders', fTrigger) - .then((data) => { - PromisesPopulator.foldersList(data.Result); - PromisesPopulator.foldersAdditionalParameters(data.Result); - return true; - }); - } - - foldersReloadWithTimeout(fTrigger) { - this.setTrigger(fTrigger, true); - - clearTimeout(this.foldersTimeout); - this.foldersTimeout = setTimeout(() => this.foldersReload(fTrigger), 500); - } - - folderDelete(sFolderFullNameRaw, fTrigger) { - return this.postRequest('FolderDelete', fTrigger, { - 'Folder': sFolderFullNameRaw - }); - } - - folderCreate(sNewFolderName, sParentName, fTrigger) { - return this.postRequest('FolderCreate', fTrigger, { - 'Folder': sNewFolderName, - 'Parent': sParentName - }); - } - - folderRename(sPrevFolderFullNameRaw, sNewFolderName, fTrigger) { - return this.postRequest('FolderRename', fTrigger, { - 'Folder': sPrevFolderFullNameRaw, - 'NewFolderName': sNewFolderName - }); - } - - attachmentsActions(sAction, aHashes, fTrigger) { - return this.postRequest('AttachmentsActions', fTrigger, { - 'Do': sAction, - 'Hashes': aHashes - }); - } -} - -export default new UserAjaxUserPromises(); diff --git a/dev/Promises/User/Populator.js b/dev/Promises/User/Populator.js index 9ee585008..ec8f88ef3 100644 --- a/dev/Promises/User/Populator.js +++ b/dev/Promises/User/Populator.js @@ -8,14 +8,14 @@ import * as Local from 'Storage/Client'; import AppStore from 'Stores/User/App'; import FolderStore from 'Stores/User/Folder'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { FolderModel } from 'Model/Folder'; -import { AbstractBasicPromises } from 'Promises/AbstractBasic'; const Settings = rl.settings; -class PromisesUserPopulator extends AbstractBasicPromises { +class PromisesUserPopulator { + /** * @param {string} sFullNameHash * @param {Array?} expandedFolders diff --git a/dev/Remote/AbstractAjax.js b/dev/Remote/AbstractAjax.js deleted file mode 100644 index 8c5ec07c4..000000000 --- a/dev/Remote/AbstractAjax.js +++ /dev/null @@ -1,216 +0,0 @@ -import { TOKEN_ERROR_LIMIT, AJAX_ERROR_LIMIT, DEFAULT_AJAX_TIMEOUT } from 'Common/Consts'; -import { StorageResultType, Notification } from 'Common/Enums'; -import { pInt, pString } from 'Common/Utils'; -import { data as GlobalsData } from 'Common/Globals'; -import { ajax } from 'Common/Links'; - - -class AbstractAjaxRemote { - constructor() { - this.oRequests = {}; - } - - abort(sAction, bClearOnly) { - if (this.oRequests[sAction]) { - if (!bClearOnly && this.oRequests[sAction].abort) { -// this.oRequests[sAction].__aborted = true; - this.oRequests[sAction].abort(); - } - - this.oRequests[sAction] = null; - delete this.oRequests[sAction]; - } - - return this; - } - - /** - * @param {?Function} fCallback - * @param {string} sRequestAction - * @param {string} sType - * @param {?AjaxJsonDefaultResponse} oData - * @param {boolean} bCached - * @param {*=} oRequestParameters - */ - defaultResponse(fCallback, sRequestAction, sType, oData, bCached, oRequestParameters) { - const fCall = () => { - if (StorageResultType.Success !== sType && GlobalsData.bUnload) { - sType = StorageResultType.Unload; - } - - if (StorageResultType.Success === sType && oData && !oData.Result) { - const err = oData ? oData.ErrorCode : null; - if ( - oData && [ - Notification.AuthError, - Notification.AccessError, - Notification.ConnectionError, - Notification.DomainNotAllowed, - Notification.AccountNotAllowed, - Notification.MailServerError, - Notification.UnknownNotification, - Notification.UnknownError - ].includes(err) - ) { - ++GlobalsData.iAjaxErrorCount; - } - - if (oData && Notification.InvalidToken === err) { - ++GlobalsData.iTokenErrorCount; - } - - if (TOKEN_ERROR_LIMIT < GlobalsData.iTokenErrorCount) { - rl.logoutReload(); - } - - if (oData.ClearAuth || oData.Logout || AJAX_ERROR_LIMIT < GlobalsData.iAjaxErrorCount) { - if (GlobalsData.__APP__) { - rl.hash.clear(); - - if (!oData.ClearAuth) { - rl.logoutReload(); - } - } - } - } else if (StorageResultType.Success === sType && oData && oData.Result) { - GlobalsData.iAjaxErrorCount = 0; - GlobalsData.iTokenErrorCount = 0; - } - - if (fCallback) { - fCallback( - sType, - StorageResultType.Success === sType ? oData : null, - bCached, - sRequestAction, - oRequestParameters - ); - } - }; - - switch (sType) { - case 'success': - sType = StorageResultType.Success; - break; - case 'abort': - sType = StorageResultType.Abort; - break; - default: - sType = StorageResultType.Error; - break; - } - - if (StorageResultType.Error === sType) { - setTimeout(fCall, 300); - } else { - fCall(); - } - } - - /** - * @param {?Function} fResultCallback - * @param {Object} oParameters - * @param {?number=} iTimeOut = 20000 - * @param {string=} sGetAdd = '' - * @param {Array=} aAbortActions = [] - */ - ajaxRequest(fResultCallback, params, iTimeOut = 20000, sGetAdd = '', abortActions = []) { - params = params || {}; - const start = Date.now(), - action = params.Action || ''; - - if (action && abortActions) { - abortActions.forEach(actionToAbort => this.abort(actionToAbort)); - } - - let init = {}; - - if (window.AbortController) { - this.abort(action); - const controller = new AbortController(); - if (iTimeOut) { - setTimeout(() => controller.abort(), iTimeOut); - } - init.signal = controller.signal; - this.oRequests[action] = controller; - } - - return rl.fetchJSON(ajax(sGetAdd), init, iTimeOut, sGetAdd ? null : params) - .then(oData => { - let cached = false; - if (oData && oData.Time) { - cached = pInt(oData.Time) > Date.now() - start; - } - - if (oData && oData.UpdateToken) { - rl.hash.set(); - rl.settings.set('AuthAccountHash', oData.UpdateToken); - } - - let sType = 'success'; - if (action && this.oRequests[action]) { - if (this.oRequests[action].__aborted) { - sType = 'abort'; - } - - this.oRequests[action] = null; - } - - this.defaultResponse(fResultCallback, action, sType, oData, cached, params); - }).catch(err => { - if (err.name == 'AbortError') { // handle abort() - return Promise.reject(Notification.AjaxAbort); - } - return Promise.reject(err); - }); - } - - /** - * @param {?Function} fCallback - * @param {string} sAction - * @param {Object=} oParameters - * @param {?number=} iTimeout - * @param {string=} sGetAdd = '' - * @param {Array=} aAbortActions = [] - */ - defaultRequest(fCallback, sAction, oParameters, iTimeout, sGetAdd, aAbortActions) { - oParameters = oParameters || {}; - oParameters.Action = sAction; - - sGetAdd = pString(sGetAdd); - - return this.ajaxRequest( - fCallback, - oParameters, - undefined === iTimeout ? DEFAULT_AJAX_TIMEOUT : pInt(iTimeout), - sGetAdd, - aAbortActions - ); - } - - /** - * @param {?Function} fCallback - */ - noop(fCallback) { - this.defaultRequest(fCallback, 'Noop'); - } - - /** - * @param {?Function} fCallback - */ - getPublicKey(fCallback) { - this.defaultRequest(fCallback, 'GetPublicKey'); - } - - /** - * @param {?Function} fCallback - * @param {string} sVersion - */ - jsVersion(fCallback, sVersion) { - this.defaultRequest(fCallback, 'Version', { - 'Version': sVersion - }); - } -} - -export { AbstractAjaxRemote, AbstractAjaxRemote as default }; diff --git a/dev/Remote/AbstractFetch.js b/dev/Remote/AbstractFetch.js new file mode 100644 index 000000000..85aecad1e --- /dev/null +++ b/dev/Remote/AbstractFetch.js @@ -0,0 +1,282 @@ +import { TOKEN_ERROR_LIMIT, AJAX_ERROR_LIMIT, DEFAULT_AJAX_TIMEOUT } from 'Common/Consts'; +import { StorageResultType, Notification } from 'Common/Enums'; +import { pInt, pString } from 'Common/Utils'; +import { serverRequest } from 'Common/Links'; + +let iAjaxErrorCount = 0, + iTokenErrorCount = 0, + bUnload = false; + +const getURL = (add = '') => serverRequest('Ajax') + add, + +updateToken = data => { + if (data.UpdateToken) { + rl.hash.set(); + rl.settings.set('AuthAccountHash', data.UpdateToken); + } +}, + +checkResponseError = data => { + const err = data ? data.ErrorCode : null; + if ([ + Notification.AuthError, + Notification.AccessError, + Notification.ConnectionError, + Notification.DomainNotAllowed, + Notification.AccountNotAllowed, + Notification.MailServerError, + Notification.UnknownNotification, + Notification.UnknownError + ].includes(err) + ) { + ++iAjaxErrorCount; + } + + if (Notification.InvalidToken === err) { + ++iTokenErrorCount; + } + + if (TOKEN_ERROR_LIMIT < iTokenErrorCount) { + rl.logoutReload(); + } + + if (window.rl && (data.ClearAuth || data.Logout || AJAX_ERROR_LIMIT < iAjaxErrorCount)) { + rl.hash.clear(); + + if (!data.ClearAuth) { + rl.logoutReload(); + } + } +}, + +oRequests = {}; + +addEventListener('unload', () => bUnload = true); + +class AbstractFetchRemote +{ + abort(sAction, bClearOnly) { + if (oRequests[sAction]) { + if (!bClearOnly && oRequests[sAction].abort) { +// oRequests[sAction].__aborted = true; + oRequests[sAction].abort(); + } + + oRequests[sAction] = null; + delete oRequests[sAction]; + } + + return this; + } + + /** + * @param {?Function} fResultCallback + * @param {Object} oParameters + * @param {?number=} iTimeOut = 20000 + * @param {string=} sGetAdd = '' + * @param {Array=} aAbortActions = [] + */ + ajaxRequest(fResultCallback, params, iTimeOut = 20000, sGetAdd = '', abortActions = []) { + params = params || {}; + const start = Date.now(), + action = params.Action || ''; + + if (action && abortActions) { + abortActions.forEach(actionToAbort => this.abort(actionToAbort)); + } + + return rl.fetchJSON(getURL(sGetAdd), { + signal: this.createAbort(action, iTimeOut) + }, iTimeOut, sGetAdd ? null : params + ).then(data => { + let cached = false; + if (data) { + if (data.Time) { + cached = pInt(data.Time) > Date.now() - start; + } + + updateToken(data); + } + + let sType = 'success'; + if (action && oRequests[action]) { + if (oRequests[action].__aborted) { + sType = 'abort'; + } + this.abort(action, true); + } + + const fCall = () => { + if (StorageResultType.Success !== sType && bUnload) { + sType = StorageResultType.Unload; + } + + if (StorageResultType.Success === sType && data && !data.Result) { + checkResponseError(data); + } else if (StorageResultType.Success === sType && data && data.Result) { + iAjaxErrorCount = iTokenErrorCount = 0; + } + + if (fResultCallback) { + fResultCallback( + sType, + StorageResultType.Success === sType ? data : null, + cached, + action, + params + ); + } + }; + + switch (sType) { + case 'success': + sType = StorageResultType.Success; + break; + case 'abort': + sType = StorageResultType.Abort; + break; + default: + sType = StorageResultType.Error; + break; + } + + if (StorageResultType.Error === sType) { + setTimeout(fCall, 300); + } else { + fCall(); + } + + }).catch(err => { + if (err.name == 'AbortError') { // handle abort() + err = Notification.AjaxAbort; + } + return Promise.reject(err); + }); + } + + /** + * @param {?Function} fCallback + * @param {string} sAction + * @param {Object=} oParameters + * @param {?number=} iTimeout + * @param {string=} sGetAdd = '' + * @param {Array=} aAbortActions = [] + */ + defaultRequest(fCallback, sAction, oParameters, iTimeout, sGetAdd, aAbortActions) { + oParameters = oParameters || {}; + oParameters.Action = sAction; + + return this.ajaxRequest( + fCallback, + oParameters, + undefined === iTimeout ? DEFAULT_AJAX_TIMEOUT : pInt(iTimeout), + pString(sGetAdd), + aAbortActions + ); + } + + /** + * @param {?Function} fCallback + */ + noop(fCallback) { + this.defaultRequest(fCallback, 'Noop'); + } + + /** + * @param {?Function} fCallback + */ + getPublicKey(fCallback) { + this.defaultRequest(fCallback, 'GetPublicKey'); + } + + /** + * @param {?Function} fCallback + * @param {string} sVersion + */ + jsVersion(fCallback, sVersion) { + this.defaultRequest(fCallback, 'Version', { + 'Version': sVersion + }); + } + + createAbort(action, timeout) { + if (window.AbortController) { + this.abort(action); + const controller = new AbortController(); + if (timeout) { + setTimeout(() => controller.abort(), timeout); + } + oRequests[action] = controller; + return controller.signal; + } + } + + fastResolve(mData) { + return Promise.resolve(mData); + } + + setTrigger(trigger, value) { + if (trigger) { + value = !!value; + (Array.isArray(trigger) ? trigger : [trigger]).forEach((fTrigger) => { + if (fTrigger) { + fTrigger(value); + } + }); + } + } + + postRequest(action, fTrigger, params, timeOut) { + params = params || {}; + params.Action = action; + + this.setTrigger(fTrigger, true); + + return rl.fetchJSON(getURL(), { + signal: this.createAbort(action, pInt(timeOut, DEFAULT_AJAX_TIMEOUT)) + }, pInt(timeOut, DEFAULT_AJAX_TIMEOUT), params + ).then(data => { + this.abort(action, true); + + if (!data) { + return Promise.reject(Notification.AjaxParse); + } + + updateToken(data); +/* + let isCached = false, type = ''; + if (data && data.Time) { + isCached = pInt(data.Time) > microtime() - start; + } + // backward capability + switch (true) { + case 'success' === textStatus && data && data.Result && action === data.Action: + type = StorageResultType.Success; + break; + case 'abort' === textStatus && (!data || !data.__aborted__): + type = StorageResultType.Abort; + break; + default: + type = StorageResultType.Error; + break; + } +*/ + this.setTrigger(fTrigger, false); + + if (!data.Result || action !== data.Action) { + checkResponseError(data); + const err = data ? data.ErrorCode : null; + return Promise.reject(err || Notification.AjaxFalse); + } + + return data; + }).catch(err => { + if (err.name == 'AbortError') { // handle abort() + return Promise.reject(Notification.AjaxAbort); + } + return Promise.reject(err); + }); + } +} + +export { AbstractFetchRemote, AbstractFetchRemote as default }; diff --git a/dev/Remote/Admin/Ajax.js b/dev/Remote/Admin/Fetch.js similarity index 96% rename from dev/Remote/Admin/Ajax.js rename to dev/Remote/Admin/Fetch.js index f999a2350..2a4344633 100644 --- a/dev/Remote/Admin/Ajax.js +++ b/dev/Remote/Admin/Fetch.js @@ -1,12 +1,6 @@ -import { AbstractAjaxRemote } from 'Remote/AbstractAjax'; - -class RemoteAdminAjax extends AbstractAjaxRemote { - constructor() { - super(); - - this.oRequests = {}; - } +import { AbstractFetchRemote } from 'Remote/AbstractFetch'; +class RemoteAdminFetch extends AbstractFetchRemote { /** * @param {?Function} fCallback * @param {string} sLogin @@ -271,4 +265,4 @@ class RemoteAdminAjax extends AbstractAjaxRemote { } } -export default new RemoteAdminAjax(); +export default new RemoteAdminFetch(); diff --git a/dev/Remote/User/Ajax.js b/dev/Remote/User/Fetch.js similarity index 92% rename from dev/Remote/User/Ajax.js rename to dev/Remote/User/Fetch.js index 055bc16d8..96db08aaa 100644 --- a/dev/Remote/User/Ajax.js +++ b/dev/Remote/User/Fetch.js @@ -1,4 +1,5 @@ import { pString, pInt } from 'Common/Utils'; +import PromisesPopulator from 'Promises/User/Populator'; import { CONTACTS_SYNC_AJAX_TIMEOUT, @@ -23,7 +24,7 @@ import SettingsStore from 'Stores/User/Settings'; import { getApp } from 'Helper/Apps/User'; -import { AbstractAjaxRemote } from 'Remote/AbstractAjax'; +import { AbstractFetchRemote } from 'Remote/AbstractFetch'; //const toUTF8 = window.TextEncoder // ? text => String.fromCharCode(...new TextEncoder().encode(text)) @@ -33,12 +34,7 @@ const urlsafeArray = array => btoa(unescape(encodeURIComponent(array.join('\x00' .replace('/', '_') .replace('=', ''); -class RemoteUserAjax extends AbstractAjaxRemote { - constructor() { - super(); - this.oRequests = {}; - } - +class RemoteUserFetch extends AbstractFetchRemote { /** * @param {?Function} fCallback */ @@ -775,6 +771,50 @@ class RemoteUserAjax extends AbstractAjaxRemote { clearUserBackground(fCallback) { this.defaultRequest(fCallback, 'ClearUserBackground'); } + + foldersReload(fTrigger) { + return this.abort('Folders') + .postRequest('Folders', fTrigger) + .then((data) => { + PromisesPopulator.foldersList(data.Result); + PromisesPopulator.foldersAdditionalParameters(data.Result); + return true; + }); + } + + foldersReloadWithTimeout(fTrigger) { + this.setTrigger(fTrigger, true); + + clearTimeout(this.foldersTimeout); + this.foldersTimeout = setTimeout(() => this.foldersReload(fTrigger), 500); + } + + folderDelete(sFolderFullNameRaw, fTrigger) { + return this.postRequest('FolderDelete', fTrigger, { + 'Folder': sFolderFullNameRaw + }); + } + + folderCreate(sNewFolderName, sParentName, fTrigger) { + return this.postRequest('FolderCreate', fTrigger, { + 'Folder': sNewFolderName, + 'Parent': sParentName + }); + } + + folderRename(sPrevFolderFullNameRaw, sNewFolderName, fTrigger) { + return this.postRequest('FolderRename', fTrigger, { + 'Folder': sPrevFolderFullNameRaw, + 'NewFolderName': sNewFolderName + }); + } + + attachmentsActions(sAction, aHashes, fTrigger) { + return this.postRequest('AttachmentsActions', fTrigger, { + 'Do': sAction, + 'Hashes': aHashes + }); + } } -export default new RemoteUserAjax(); +export default new RemoteUserFetch(); diff --git a/dev/Settings/Admin/Branding.js b/dev/Settings/Admin/Branding.js index 10939d87d..7647dbdc5 100644 --- a/dev/Settings/Admin/Branding.js +++ b/dev/Settings/Admin/Branding.js @@ -2,7 +2,7 @@ import ko from 'ko'; import { settingsSaveHelperSimpleFunction } from 'Common/Utils'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; class BrandingAdminSettings { constructor() { diff --git a/dev/Settings/Admin/Contacts.js b/dev/Settings/Admin/Contacts.js index b92c7add0..400dc6638 100644 --- a/dev/Settings/Admin/Contacts.js +++ b/dev/Settings/Admin/Contacts.js @@ -4,7 +4,7 @@ import { settingsSaveHelperSimpleFunction, defautOptionsAfterRender } from 'Comm import { SaveSettingsStep, StorageResultType } from 'Common/Enums'; import { i18n } from 'Common/Translator'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import { command } from 'Knoin/Knoin'; const settingsGet = rl.settings.get; diff --git a/dev/Settings/Admin/Domains.js b/dev/Settings/Admin/Domains.js index ca6e806d8..141b307e2 100644 --- a/dev/Settings/Admin/Domains.js +++ b/dev/Settings/Admin/Domains.js @@ -4,7 +4,7 @@ import { StorageResultType } from 'Common/Enums'; import { showScreenPopup } from 'Knoin/Knoin'; import DomainStore from 'Stores/Admin/Domain'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import { getApp } from 'Helper/Apps/Admin'; diff --git a/dev/Settings/Admin/General.js b/dev/Settings/Admin/General.js index f92660b50..116c945cd 100644 --- a/dev/Settings/Admin/General.js +++ b/dev/Settings/Admin/General.js @@ -13,7 +13,7 @@ import { reload as translatorReload } from 'Common/Translator'; import { showScreenPopup } from 'Knoin/Knoin'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import ThemeStore from 'Stores/Theme'; import LanguageStore from 'Stores/Language'; diff --git a/dev/Settings/Admin/Login.js b/dev/Settings/Admin/Login.js index dce70138f..9e0349461 100644 --- a/dev/Settings/Admin/Login.js +++ b/dev/Settings/Admin/Login.js @@ -4,7 +4,7 @@ import { settingsSaveHelperSimpleFunction } from 'Common/Utils'; import AppStore from 'Stores/Admin/App'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; class LoginAdminSettings { constructor() { diff --git a/dev/Settings/Admin/Packages.js b/dev/Settings/Admin/Packages.js index 7294c239c..2b5f0c4d2 100644 --- a/dev/Settings/Admin/Packages.js +++ b/dev/Settings/Admin/Packages.js @@ -4,7 +4,7 @@ import { StorageResultType, Notification } from 'Common/Enums'; import { getNotification } from 'Common/Translator'; import PackageStore from 'Stores/Admin/Package'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import { getApp } from 'Helper/Apps/Admin'; diff --git a/dev/Settings/Admin/Plugins.js b/dev/Settings/Admin/Plugins.js index f39ce03e0..93cb44f44 100644 --- a/dev/Settings/Admin/Plugins.js +++ b/dev/Settings/Admin/Plugins.js @@ -7,7 +7,7 @@ import { showScreenPopup } from 'Knoin/Knoin'; import PluginStore from 'Stores/Admin/Plugin'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import { getApp } from 'Helper/Apps/Admin'; diff --git a/dev/Settings/Admin/Security.js b/dev/Settings/Admin/Security.js index 2c10f14a6..5b5a993e6 100644 --- a/dev/Settings/Admin/Security.js +++ b/dev/Settings/Admin/Security.js @@ -5,7 +5,7 @@ import { StorageResultType } from 'Common/Enums'; import AppAdminStore from 'Stores/Admin/App'; import CapaAdminStore from 'Stores/Admin/Capa'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import { command } from 'Knoin/Knoin'; diff --git a/dev/Settings/User/Accounts.js b/dev/Settings/User/Accounts.js index f2399c391..271d497bc 100644 --- a/dev/Settings/User/Accounts.js +++ b/dev/Settings/User/Accounts.js @@ -5,7 +5,7 @@ import { root } from 'Common/Links'; import AccountStore from 'Stores/User/Account'; import IdentityStore from 'Stores/User/Identity'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; diff --git a/dev/Settings/User/Contacts.js b/dev/Settings/User/Contacts.js index f2eccf5aa..61d09386e 100644 --- a/dev/Settings/User/Contacts.js +++ b/dev/Settings/User/Contacts.js @@ -2,7 +2,7 @@ import ko from 'ko'; import AppStore from 'Stores/User/App'; import ContactStore from 'Stores/User/Contact'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; class ContactsUserSettings { constructor() { diff --git a/dev/Settings/User/Filters.js b/dev/Settings/User/Filters.js index 7419b32db..aaaa7f281 100644 --- a/dev/Settings/User/Filters.js +++ b/dev/Settings/User/Filters.js @@ -5,7 +5,7 @@ import { StorageResultType, Notification } from 'Common/Enums'; import { getNotification } from 'Common/Translator'; import FilterStore from 'Stores/User/Filter'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { FilterModel } from 'Model/Filter'; diff --git a/dev/Settings/User/Folders.js b/dev/Settings/User/Folders.js index 52e650046..7ae9104c7 100644 --- a/dev/Settings/User/Folders.js +++ b/dev/Settings/User/Folders.js @@ -9,8 +9,7 @@ import * as Local from 'Storage/Client'; import FolderStore from 'Stores/User/Folder'; -import Promises from 'Promises/User/Ajax'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; @@ -46,7 +45,7 @@ class FoldersUserSettings { Local.set(ClientSideKeyName.FoldersLashHash, ''); getApp().foldersPromisesActionHelper( - Promises.folderRename(folder.fullNameRaw, nameToEdit, FolderStore.foldersRenaming), + Remote.folderRename(folder.fullNameRaw, nameToEdit, FolderStore.foldersRenaming), Notification.CantRenameFolder ); @@ -109,7 +108,7 @@ class FoldersUserSettings { FolderStore.folderList.remove(fRemoveFolder); getApp().foldersPromisesActionHelper( - Promises.folderDelete(folderToRemove.fullNameRaw, FolderStore.foldersDeleting), + Remote.folderDelete(folderToRemove.fullNameRaw, FolderStore.foldersDeleting), Notification.CantDeleteFolder ); diff --git a/dev/Settings/User/General.js b/dev/Settings/User/General.js index c209b4557..aea246472 100644 --- a/dev/Settings/User/General.js +++ b/dev/Settings/User/General.js @@ -17,7 +17,7 @@ import IdentityStore from 'Stores/User/Identity'; import NotificationStore from 'Stores/User/Notification'; import MessageStore from 'Stores/User/Message'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; class GeneralUserSettings { constructor() { diff --git a/dev/Settings/User/OpenPgp.js b/dev/Settings/User/OpenPgp.js index 4edb856c1..04dfe2831 100644 --- a/dev/Settings/User/OpenPgp.js +++ b/dev/Settings/User/OpenPgp.js @@ -5,7 +5,7 @@ import { delegateRunOnDestroy } from 'Common/Utils'; import PgpStore from 'Stores/User/Pgp'; import SettingsStore from 'Stores/User/Settings'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; diff --git a/dev/Settings/User/Security.js b/dev/Settings/User/Security.js index 731744b30..54de11930 100644 --- a/dev/Settings/User/Security.js +++ b/dev/Settings/User/Security.js @@ -8,7 +8,7 @@ import { showScreenPopup } from 'Knoin/Knoin'; import SettinsStore from 'Stores/User/Settings'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; class SecurityUserSettings { constructor() { diff --git a/dev/Settings/User/Templates.js b/dev/Settings/User/Templates.js index e923ffcbb..d114d2501 100644 --- a/dev/Settings/User/Templates.js +++ b/dev/Settings/User/Templates.js @@ -3,7 +3,7 @@ import ko from 'ko'; import { i18n } from 'Common/Translator'; import TemplateStore from 'Stores/User/Template'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; diff --git a/dev/Settings/User/Themes.js b/dev/Settings/User/Themes.js index 37370b3b6..1de837358 100644 --- a/dev/Settings/User/Themes.js +++ b/dev/Settings/User/Themes.js @@ -7,7 +7,7 @@ import { i18n } from 'Common/Translator'; import ThemeStore from 'Stores/Theme'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; class ThemesUserSettings { constructor() { diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index 9183a21d0..ab84c033d 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -41,7 +41,7 @@ import NotificationStore from 'Stores/User/Notification'; import { getApp } from 'Helper/Apps/User'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; const hcont = Element.fromHTML('
'), diff --git a/dev/Stores/User/Template.js b/dev/Stores/User/Template.js index 2522a2f67..8d392312f 100644 --- a/dev/Stores/User/Template.js +++ b/dev/Stores/User/Template.js @@ -1,6 +1,6 @@ import ko from 'ko'; -// import Remote from 'Remote/User/Ajax'; +// import Remote from 'Remote/User/Fetch'; class TemplateUserStore { constructor() { diff --git a/dev/Styles/SquireUI.less b/dev/Styles/SquireUI.less index 02006bbf9..26153aadb 100644 --- a/dev/Styles/SquireUI.less +++ b/dev/Styles/SquireUI.less @@ -14,6 +14,7 @@ background: transparent; border: 0; box-shadow: none; + color: #000; cursor: pointer; font-size: 14px; height: 1.5em; diff --git a/dev/View/Admin/Login.js b/dev/View/Admin/Login.js index 46c94e54a..143554f66 100644 --- a/dev/View/Admin/Login.js +++ b/dev/View/Admin/Login.js @@ -3,7 +3,7 @@ import ko from 'ko'; import { StorageResultType, Notification } from 'Common/Enums'; import { getNotification } from 'Common/Translator'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import { view, command, ViewType, routeOff, routeReload } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; diff --git a/dev/View/Admin/Settings/Pane.js b/dev/View/Admin/Settings/Pane.js index e7adc02da..295511ffe 100644 --- a/dev/View/Admin/Settings/Pane.js +++ b/dev/View/Admin/Settings/Pane.js @@ -1,6 +1,6 @@ import ko from 'ko'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import DomainStore from 'Stores/Admin/Domain'; import PluginStore from 'Stores/Admin/Plugin'; diff --git a/dev/View/Popup/Account.js b/dev/View/Popup/Account.js index 0cd099707..f79b0459e 100644 --- a/dev/View/Popup/Account.js +++ b/dev/View/Popup/Account.js @@ -3,7 +3,7 @@ import ko from 'ko'; import { StorageResultType, Notification } from 'Common/Enums'; import { getNotification } from 'Common/Translator'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index e0e87bba2..ba335890e 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -36,7 +36,7 @@ import FolderStore from 'Stores/User/Folder'; import PgpStore from 'Stores/User/Pgp'; import MessageStore from 'Stores/User/Message'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { ComposeAttachmentModel } from 'Model/ComposeAttachment'; diff --git a/dev/View/Popup/Contacts.js b/dev/View/Popup/Contacts.js index 91efa954a..f0c0ebe4d 100644 --- a/dev/View/Popup/Contacts.js +++ b/dev/View/Popup/Contacts.js @@ -27,7 +27,7 @@ import { i18n, getNotification } from 'Common/Translator'; import SettingsStore from 'Stores/User/Settings'; import ContactStore from 'Stores/User/Contact'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { EmailModel } from 'Model/Email'; import { ContactModel } from 'Model/Contact'; diff --git a/dev/View/Popup/Domain.js b/dev/View/Popup/Domain.js index 7783d2639..b6886e5c3 100644 --- a/dev/View/Popup/Domain.js +++ b/dev/View/Popup/Domain.js @@ -7,7 +7,7 @@ import { i18n } from 'Common/Translator'; import CapaAdminStore from 'Stores/Admin/Capa'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import { getApp } from 'Helper/Apps/Admin'; diff --git a/dev/View/Popup/DomainAlias.js b/dev/View/Popup/DomainAlias.js index 38f9bad13..c599e033d 100644 --- a/dev/View/Popup/DomainAlias.js +++ b/dev/View/Popup/DomainAlias.js @@ -5,7 +5,7 @@ import { i18n } from 'Common/Translator'; import DomainStore from 'Stores/Admin/Domain'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import { getApp } from 'Helper/Apps/Admin'; diff --git a/dev/View/Popup/FolderClear.js b/dev/View/Popup/FolderClear.js index 9090ca504..f9c7b04bc 100644 --- a/dev/View/Popup/FolderClear.js +++ b/dev/View/Popup/FolderClear.js @@ -6,7 +6,7 @@ import { setFolderHash } from 'Common/Cache'; import MessageStore from 'Stores/User/Message'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; diff --git a/dev/View/Popup/FolderCreate.js b/dev/View/Popup/FolderCreate.js index 884b44d33..a533719f1 100644 --- a/dev/View/Popup/FolderCreate.js +++ b/dev/View/Popup/FolderCreate.js @@ -7,7 +7,7 @@ import { defautOptionsAfterRender, folderListOptionsBuilder } from 'Common/Utils import FolderStore from 'Stores/User/Folder'; -import Promises from 'Promises/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; @@ -54,7 +54,7 @@ class FolderCreateView extends AbstractViewNext { } getApp().foldersPromisesActionHelper( - Promises.folderCreate(this.folderName(), parentFolderName, FolderStore.foldersCreating), + Remote.folderCreate(this.folderName(), parentFolderName, FolderStore.foldersCreating), Notification.CantCreateFolder ); diff --git a/dev/View/Popup/FolderSystem.js b/dev/View/Popup/FolderSystem.js index 70cee1212..55a5bcbce 100644 --- a/dev/View/Popup/FolderSystem.js +++ b/dev/View/Popup/FolderSystem.js @@ -7,7 +7,7 @@ import { initOnStartOrLangChange, i18n } from 'Common/Translator'; import FolderStore from 'Stores/User/Folder'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { popup } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; diff --git a/dev/View/Popup/Identity.js b/dev/View/Popup/Identity.js index bd1d92ec2..33b012312 100644 --- a/dev/View/Popup/Identity.js +++ b/dev/View/Popup/Identity.js @@ -5,7 +5,7 @@ import { bMobileDevice } from 'Common/Globals'; import { fakeMd5 } from 'Common/Utils'; import { getNotification } from 'Common/Translator'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; diff --git a/dev/View/Popup/Plugin.js b/dev/View/Popup/Plugin.js index 0980714d5..d6293171a 100644 --- a/dev/View/Popup/Plugin.js +++ b/dev/View/Popup/Plugin.js @@ -3,7 +3,7 @@ import ko from 'ko'; import { KeyState, StorageResultType, Notification } from 'Common/Enums'; import { getNotification, i18n } from 'Common/Translator'; -import Remote from 'Remote/Admin/Ajax'; +import Remote from 'Remote/Admin/Fetch'; import { popup, command, isPopupVisible, showScreenPopup } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; diff --git a/dev/View/Popup/Template.js b/dev/View/Popup/Template.js index ef45ab257..d1674874c 100644 --- a/dev/View/Popup/Template.js +++ b/dev/View/Popup/Template.js @@ -4,7 +4,7 @@ import { StorageResultType, Notification } from 'Common/Enums'; import { getNotification } from 'Common/Translator'; import { HtmlEditor } from 'Common/HtmlEditor'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; diff --git a/dev/View/Popup/TwoFactorConfiguration.js b/dev/View/Popup/TwoFactorConfiguration.js index b648ca366..ec42f4014 100644 --- a/dev/View/Popup/TwoFactorConfiguration.js +++ b/dev/View/Popup/TwoFactorConfiguration.js @@ -4,7 +4,7 @@ import { Capa, StorageResultType } from 'Common/Enums'; import { pString } from 'Common/Utils'; import { i18n, trigger as translatorTrigger } from 'Common/Translator'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; diff --git a/dev/View/Popup/TwoFactorTest.js b/dev/View/Popup/TwoFactorTest.js index 9de270cfe..dc66c3865 100644 --- a/dev/View/Popup/TwoFactorTest.js +++ b/dev/View/Popup/TwoFactorTest.js @@ -3,7 +3,7 @@ import ko from 'ko'; import { StorageResultType } from 'Common/Enums'; import { bMobileDevice } from 'Common/Globals'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { popup, command } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; diff --git a/dev/View/User/Login.js b/dev/View/User/Login.js index d1645f68a..6195c2af1 100644 --- a/dev/View/User/Login.js +++ b/dev/View/User/Login.js @@ -17,7 +17,7 @@ import LanguageStore from 'Stores/Language'; import * as Local from 'Storage/Client'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { view, command, ViewType, routeOff, showScreenPopup, routeReload } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index 8b359a3a0..66d3d9af8 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -35,7 +35,7 @@ import SettingsStore from 'Stores/User/Settings'; import FolderStore from 'Stores/User/Folder'; import MessageStore from 'Stores/User/Message'; -import Remote from 'Remote/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; diff --git a/dev/View/User/MailBox/MessageView.js b/dev/View/User/MailBox/MessageView.js index f51112fad..b3f283ad1 100644 --- a/dev/View/User/MailBox/MessageView.js +++ b/dev/View/User/MailBox/MessageView.js @@ -38,8 +38,7 @@ import MessageStore from 'Stores/User/Message'; import * as Local from 'Storage/Client'; -import Remote from 'Remote/User/Ajax'; -import Promises from 'Promises/User/Ajax'; +import Remote from 'Remote/User/Fetch'; import { getApp } from 'Helper/Apps/User'; @@ -781,7 +780,7 @@ class MessageViewMailBoxUserView extends AbstractViewNext { downloadAsZip() { const hashes = this.getAttachmentsHashes(); if (hashes.length) { - Promises.attachmentsActions('Zip', hashes, this.downloadAsZipLoading) + Remote.attachmentsActions('Zip', hashes, this.downloadAsZipLoading) .then((result) => { if (result && result.Result && result.Result.Files && result.Result.Files[0] && result.Result.Files[0].Hash) { getApp().download(attachmentDownload(result.Result.Files[0].Hash)); diff --git a/dev/bootstrap.js b/dev/bootstrap.js index a7626bf9e..d0eb012dd 100644 --- a/dev/bootstrap.js +++ b/dev/bootstrap.js @@ -28,7 +28,6 @@ export default (App) => { } } }); - addEventListener('unload', () => GlobalsData.bUnload = true); addEventListener('click', ()=>rl.Dropdowns.detectVisibility());