From 467f61571331a77b584790c9915b95275562abba Mon Sep 17 00:00:00 2001 From: djmaze Date: Wed, 16 Sep 2020 20:35:29 +0200 Subject: [PATCH] Move Knoin routOff, routOn, routReload & setHash to rl.route.* --- dev/App/Abstract.js | 4 +- dev/App/Admin.js | 12 ++---- dev/App/User.js | 8 ++-- dev/Knoin/Knoin.js | 50 +------------------------ dev/Screen/AbstractSettings.js | 3 +- dev/Settings/User/Accounts.js | 8 +--- dev/Stores/User/Message.js | 10 ++--- dev/View/Admin/Login.js | 6 +-- dev/View/Popup/Compose.js | 6 +-- dev/View/Popup/Contacts.js | 6 +-- dev/View/User/AbstractSystemDropDown.js | 4 +- dev/View/User/Login.js | 6 +-- dev/View/User/MailBox/FolderList.js | 13 +++---- dev/View/User/MailBox/MessageList.js | 14 ++++--- dev/View/User/Settings/Menu.js | 4 +- dev/View/User/Settings/Pane.js | 4 +- dev/bootstrap.js | 36 ++++++++++++++++++ 17 files changed, 83 insertions(+), 111 deletions(-) diff --git a/dev/App/Abstract.js b/dev/App/Abstract.js index e7fc32525..547f22eca 100644 --- a/dev/App/Abstract.js +++ b/dev/App/Abstract.js @@ -14,8 +14,6 @@ import { initOnStartOrLangChange, initNotificationLanguage } from 'Common/Transl import LanguageStore from 'Stores/Language'; import ThemeStore from 'Stores/Theme'; -import { routeReload } from 'Knoin/Knoin'; - const Settings = rl.settings; class AbstractApp { @@ -89,7 +87,7 @@ class AbstractApp { if (location.href !== logoutLink) { setTimeout(() => (Settings.app('inIframe') ? parent : window).location.href = logoutLink, 100); } else { - routeReload(); + rl.route.reload(); } } diff --git a/dev/App/Admin.js b/dev/App/Admin.js index e55018721..78d2c57d0 100644 --- a/dev/App/Admin.js +++ b/dev/App/Admin.js @@ -1,6 +1,5 @@ import ko from 'ko'; -import { root } from 'Common/Links'; import { StorageResultType } from 'Common/Enums'; import AppStore from 'Stores/Admin/App'; @@ -13,7 +12,7 @@ import Remote from 'Remote/Admin/Fetch'; import { SettingsAdminScreen } from 'Screen/Admin/Settings'; import { LoginAdminScreen } from 'Screen/Admin/Login'; -import { hideLoading, routeOff, setHash, startScreens } from 'Knoin/Knoin'; +import { hideLoading, startScreens } from 'Knoin/Knoin'; import { AbstractApp } from 'App/Abstract'; class AdminApp extends AbstractApp { @@ -108,13 +107,8 @@ class AdminApp extends AbstractApp { hideLoading(); if (!rl.settings.app('allowAdminPanel')) { - routeOff(); - setHash(root(), true); - routeOff(); - - setTimeout(() => - location.href = '/' - , 1); + rl.route.root(); + setTimeout(() => location.href = '/', 1); } else { if (rl.settings.get('Auth')) { startScreens([SettingsAdminScreen]); diff --git a/dev/App/User.js b/dev/App/User.js index fd5816436..9cda8ebcb 100644 --- a/dev/App/User.js +++ b/dev/App/User.js @@ -68,7 +68,7 @@ import { LoginUserScreen } from 'Screen/User/Login'; import { MailBoxUserScreen } from 'Screen/User/MailBox'; import { SettingsUserScreen } from 'Screen/User/Settings'; -import { hideLoading, routeOff, routeOn, setHash, startScreens, showScreenPopup } from 'Knoin/Knoin'; +import { hideLoading, startScreens, showScreenPopup } from 'Knoin/Knoin'; import { AbstractApp } from 'App/Abstract'; @@ -149,7 +149,7 @@ class AppUser extends AbstractApp { MessageStore.messageListPageBeforeThread(1); iOffset = 0; - setHash( + rl.route.setHash( mailBox( FolderStore.currentFolderFullNameHash(), MessageStore.messageListPage(), @@ -948,9 +948,7 @@ class AppUser extends AbstractApp { if (value) { if (startupUrl) { - routeOff(); - setHash(root(startupUrl), true); - routeOn(); + rl.route.setHash(root(startupUrl), true); } if (window.crypto && crypto.getRandomValues && Settings.capa(Capa.OpenPGP)) { diff --git a/dev/Knoin/Knoin.js b/dev/Knoin/Knoin.js index 02fe80d75..5498e8f74 100644 --- a/dev/Knoin/Knoin.js +++ b/dev/Knoin/Knoin.js @@ -2,8 +2,6 @@ import ko from 'ko'; import { $htmlCL, VIEW_MODELS } from 'Common/Globals'; -import { root } from 'Common/Links'; - //import { bMobileDevice } from 'Common/Globals'; let currentScreen = null, @@ -82,30 +80,6 @@ export function addSettingsViewModel(SettingsViewModelClass, template, labelName VIEW_MODELS.settings.push(SettingsViewModelClass); } -/** - * @returns {void} - */ -export function routeReload() { - routeOff(); - setHash(root(), true); - routeOff(); - setTimeout(() => (rl.settings.app('inIframe') ? parent : window).location.reload(), 100); -} - -/** - * @returns {void} - */ -export function routeOff() { - hasher.changed.active = false; -} - -/** - * @returns {void} - */ -export function routeOn() { - hasher.changed.active = true; -} - /** * @param {string} screenName * @returns {?Object} @@ -422,28 +396,6 @@ export function startScreens(screensClasses) { setTimeout(() => $htmlCL.add('rl-started-delay'), 200); } -/** - * @param {string} sHash - * @param {boolean=} silence = false - * @param {boolean=} replace = false - * @returns {void} - */ -export function setHash(hash, silence = false, replace = false) { - hash = hash.replace(/^[#/]+/, ''); - - const cmd = replace ? 'replaceHash' : 'setHash'; - - if (silence) { - hasher.changed.active = false; - hasher[cmd](hash); - hasher.changed.active = true; - } else { - hasher.changed.active = true; - hasher[cmd](hash); - hasher.setHash(hash); - } -} - /** * @param {Object} params * @returns {Function} @@ -524,7 +476,7 @@ function settingsMenuKeysHandler(items) { } const resultHash = items[index].href; - resultHash && setHash(resultHash, false, true); + resultHash && rl.route.setHash(resultHash, false, true); } }).throttle(200); } diff --git a/dev/Screen/AbstractSettings.js b/dev/Screen/AbstractSettings.js index 71ea24db0..25cecb726 100644 --- a/dev/Screen/AbstractSettings.js +++ b/dev/Screen/AbstractSettings.js @@ -4,7 +4,6 @@ import { VIEW_MODELS } from 'Common/Globals'; import { pString } from 'Common/Utils'; import { settings } from 'Common/Links'; -import { setHash } from 'Knoin/Knoin'; import { AbstractScreen } from 'Knoin/AbstractScreen'; class AbstractSettingsScreen extends AbstractScreen { @@ -128,7 +127,7 @@ class AbstractSettingsScreen extends AbstractScreen { }, 1); } } else { - setHash(settings(), false, true); + rl.route.setHash(settings(), false, true); } } diff --git a/dev/Settings/User/Accounts.js b/dev/Settings/User/Accounts.js index 17a67fe74..99a868b1d 100644 --- a/dev/Settings/User/Accounts.js +++ b/dev/Settings/User/Accounts.js @@ -1,13 +1,12 @@ import ko from 'ko'; import { Capa, StorageResultType } from 'Common/Enums'; -import { root } from 'Common/Links'; import AccountStore from 'Stores/User/Account'; import IdentityStore from 'Stores/User/Identity'; import Remote from 'Remote/User/Fetch'; -import { showScreenPopup, routeOff, setHash } from 'Knoin/Knoin'; +import { showScreenPopup } from 'Knoin/Knoin'; class AccountsUserSettings { constructor() { @@ -59,10 +58,7 @@ class AccountsUserSettings { Remote.accountDelete((result, data) => { if (StorageResultType.Success === result && data && data.Result && data.Reload) { - routeOff(); - setHash(root(), true); - routeOff(); - + rl.route.root(); setTimeout(() => location.reload(), 1); } else { rl.app.accountsAndIdentities(); diff --git a/dev/Stores/User/Message.js b/dev/Stores/User/Message.js index 536f10dbb..9c6911f70 100644 --- a/dev/Stores/User/Message.js +++ b/dev/Stores/User/Message.js @@ -29,8 +29,6 @@ import { EmailCollectionModel } from 'Model/EmailCollection'; import { MessageModel } from 'Model/Message'; import { MessageCollectionModel } from 'Model/MessageCollection'; -import { setHash } from 'Knoin/Knoin'; - import AppStore from 'Stores/User/App'; import AccountStore from 'Stores/User/Account'; import FolderStore from 'Stores/User/Folder'; @@ -127,7 +125,7 @@ class MessageUserStore { this.mainMessageListSearch = ko.computed({ read: this.messageListSearch, write: (value) => { - setHash( + rl.route.setHash( mailBox(FolderStore.currentFolderFullNameHash(), 1, value.toString().trim(), this.messageListThreadUid()) ); } @@ -374,7 +372,7 @@ class MessageUserStore { if (message && this.messageListThreadUid() !== pString(message.uid)) { this.messageListThreadUid(pString(message.uid)); - setHash( + rl.route.setHash( mailBox( FolderStore.currentFolderFullNameHash(), this.messageListPage(), @@ -388,7 +386,7 @@ class MessageUserStore { if (1 < this.messageListPage()) { this.messageListPage(this.messageListPage() - 1); - setHash( + rl.route.setHash( mailBox( FolderStore.currentFolderFullNameHash(), this.messageListPage(), @@ -401,7 +399,7 @@ class MessageUserStore { } else { this.messageListThreadUid(''); - setHash( + rl.route.setHash( mailBox( FolderStore.currentFolderFullNameHash(), this.messageListPageBeforeThread(), diff --git a/dev/View/Admin/Login.js b/dev/View/Admin/Login.js index 143554f66..85ab840f7 100644 --- a/dev/View/Admin/Login.js +++ b/dev/View/Admin/Login.js @@ -5,7 +5,7 @@ import { getNotification } from 'Common/Translator'; import Remote from 'Remote/Admin/Fetch'; -import { view, command, ViewType, routeOff, routeReload } from 'Knoin/Knoin'; +import { view, command, ViewType } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; @view({ @@ -68,7 +68,7 @@ class LoginAdminView extends AbstractViewNext { (sResult, oData) => { if (StorageResultType.Success === sResult && oData && 'AdminLogin' === oData.Action) { if (oData.Result) { - routeReload(); + rl.route.reload(); } else if (oData.ErrorCode) { this.submitRequest(false); this.submitError(getNotification(oData.ErrorCode)); @@ -86,7 +86,7 @@ class LoginAdminView extends AbstractViewNext { } onShow() { - routeOff(); + rl.route.off(); } submitForm() { diff --git a/dev/View/Popup/Compose.js b/dev/View/Popup/Compose.js index 6ef9a0cfe..9b98f4111 100644 --- a/dev/View/Popup/Compose.js +++ b/dev/View/Popup/Compose.js @@ -40,7 +40,7 @@ import Remote from 'Remote/User/Fetch'; import { ComposeAttachmentModel } from 'Model/ComposeAttachment'; -import { popup, command, isPopupVisible, showScreenPopup, hideScreenPopup, routeOn, routeOff } from 'Knoin/Knoin'; +import { popup, command, isPopupVisible, showScreenPopup, hideScreenPopup } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; const Settings = rl.settings; @@ -636,7 +636,7 @@ class ComposePopupView extends AbstractViewNext { this.to.focused(false); - routeOn(); + rl.route.on(); this.resizeObserver.disconnect(); } @@ -719,7 +719,7 @@ class ComposePopupView extends AbstractViewNext { * @param {string=} sCustomPlainText = null */ onShow(type, oMessageOrArray, aToEmails, aCcEmails, aBccEmails, sCustomSubject, sCustomPlainText) { - routeOff(); + rl.route.off(); const ro = this.resizeObserver; ro.observe(ro.compose); diff --git a/dev/View/Popup/Contacts.js b/dev/View/Popup/Contacts.js index 289beb1b0..62a1e4e43 100644 --- a/dev/View/Popup/Contacts.js +++ b/dev/View/Popup/Contacts.js @@ -33,7 +33,7 @@ import { EmailModel } from 'Model/Email'; import { ContactModel } from 'Model/Contact'; import { ContactPropertyModel } from 'Model/ContactProperty'; -import { popup, command, showScreenPopup, hideScreenPopup, routeOn, routeOff } from 'Knoin/Knoin'; +import { popup, command, showScreenPopup, hideScreenPopup } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; const trim = text => null == text ? "" : (text + "").trim(); @@ -633,12 +633,12 @@ class ContactsPopupView extends AbstractViewNext { this.bBackToCompose = undefined === bBackToCompose ? false : !!bBackToCompose; this.sLastComposeFocusedField = undefined === sLastComposeFocusedField ? '' : sLastComposeFocusedField; - routeOff(); + rl.route.off(); this.reloadContactList(true); } onHide() { - routeOn(); + rl.route.on(); this.currentContact(null); this.emptySelection(true); diff --git a/dev/View/User/AbstractSystemDropDown.js b/dev/View/User/AbstractSystemDropDown.js index 87992a9ae..2749578da 100644 --- a/dev/View/User/AbstractSystemDropDown.js +++ b/dev/View/User/AbstractSystemDropDown.js @@ -7,7 +7,7 @@ import MessageStore from 'Stores/User/Message'; import { Capa, KeyState } from 'Common/Enums'; import { settings } from 'Common/Links'; -import { showScreenPopup, setHash } from 'Knoin/Knoin'; +import { showScreenPopup } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; const Settings = rl.settings; @@ -60,7 +60,7 @@ class AbstractSystemDropDownUserView extends AbstractViewNext { settingsClick() { if (Settings.capa(Capa.Settings)) { - setHash(settings()); + rl.route.setHash(settings()); } } diff --git a/dev/View/User/Login.js b/dev/View/User/Login.js index 6195c2af1..5e51979a0 100644 --- a/dev/View/User/Login.js +++ b/dev/View/User/Login.js @@ -19,7 +19,7 @@ import * as Local from 'Storage/Client'; import Remote from 'Remote/User/Fetch'; -import { view, command, ViewType, routeOff, showScreenPopup, routeReload } from 'Knoin/Knoin'; +import { view, command, ViewType, showScreenPopup } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; import { rootAdmin } from 'Common/Links'; @@ -182,7 +182,7 @@ class LoginUserView extends AbstractViewNext { } else if (oData.Admin) { setTimeout(() => location.href = rootAdmin(), 100); } else { - routeReload(); + rl.route.reload(); } } else if (oData.ErrorCode) { this.submitRequest(false); @@ -227,7 +227,7 @@ class LoginUserView extends AbstractViewNext { } onShow() { - routeOff(); + rl.route.off(); } onBuild() { diff --git a/dev/View/User/MailBox/FolderList.js b/dev/View/User/MailBox/FolderList.js index b81d8772f..4d70ef0f5 100644 --- a/dev/View/User/MailBox/FolderList.js +++ b/dev/View/User/MailBox/FolderList.js @@ -10,7 +10,7 @@ import SettingsStore from 'Stores/User/Settings'; import FolderStore from 'Stores/User/Folder'; import MessageStore from 'Stores/User/Message'; -import { view, ViewType, showScreenPopup, setHash } from 'Knoin/Knoin'; +import { view, ViewType, showScreenPopup } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; const Settings = rl.settings; @@ -90,11 +90,10 @@ class FolderListMailBoxUserView extends AbstractViewNext { setFolderHash(folder.fullNameRaw, ''); } - if (starred) { - setHash(mailBox(folder.fullNameHash, 1, 'is:flagged')); - } else { - setHash(mailBox(folder.fullNameHash)); - } + rl.route.setHash(starred + ? mailBox(folder.fullNameHash, 1, 'is:flagged') + : mailBox(folder.fullNameHash) + ); } AppStore.focusedState(Focused.MessageList); @@ -245,7 +244,7 @@ class FolderListMailBoxUserView extends AbstractViewNext { } configureFolders() { - setHash(settings('folders')); + rl.route.setHash(settings('folders')); } contactsClick() { diff --git a/dev/View/User/MailBox/MessageList.js b/dev/View/User/MailBox/MessageList.js index 7e430b558..c0487d21d 100644 --- a/dev/View/User/MailBox/MessageList.js +++ b/dev/View/User/MailBox/MessageList.js @@ -37,7 +37,7 @@ import MessageStore from 'Stores/User/Message'; import Remote from 'Remote/User/Fetch'; -import { view, command, ViewType, showScreenPopup, setHash, popupVisibility } from 'Knoin/Knoin'; +import { view, command, ViewType, showScreenPopup, popupVisibility } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; const @@ -235,14 +235,14 @@ class MessageListMailBoxUserView extends AbstractViewNext { ); if ('INBOX' === sFolder) { - setHash(mailBox(sFolder, 1)); + rl.route.setHash(mailBox(sFolder, 1)); } if (message) { this.selector.selectMessageItem(message); } else { if ('INBOX' !== sFolder) { - setHash(mailBox(sFolder, 1)); + rl.route.setHash(mailBox(sFolder, 1)); } MessageStore.selectMessageByFolderAndUid(sFolder, sUid); @@ -452,7 +452,7 @@ class MessageListMailBoxUserView extends AbstractViewNext { } cancelThreadUid() { - setHash( + rl.route.setHash( mailBox( FolderStore.currentFolderFullNameHash(), MessageStore.messageListPageBeforeThread(), @@ -690,7 +690,7 @@ class MessageListMailBoxUserView extends AbstractViewNext { } gotoPage(page) { - page && setHash( + page && rl.route.setHash( mailBox( FolderStore.currentFolderFullNameHash(), page.value, @@ -704,7 +704,9 @@ class MessageListMailBoxUserView extends AbstractViewNext { if (message && 0 < message.threadsLen()) { MessageStore.messageListPageBeforeThread(MessageStore.messageListPage()); - setHash(mailBox(FolderStore.currentFolderFullNameHash(), 1, MessageStore.messageListSearch(), message.uid)); + rl.route.setHash( + mailBox(FolderStore.currentFolderFullNameHash(), 1, MessageStore.messageListSearch(), message.uid) + ); } } diff --git a/dev/View/User/Settings/Menu.js b/dev/View/User/Settings/Menu.js index f32ae2d1d..93a8650e4 100644 --- a/dev/View/User/Settings/Menu.js +++ b/dev/View/User/Settings/Menu.js @@ -3,7 +3,7 @@ import { leftPanelDisabled } from 'Common/Globals'; import { settings, inbox } from 'Common/Links'; import { getFolderInboxName } from 'Common/Cache'; -import { view, ViewType, setHash, settingsMenuKeysHandler } from 'Knoin/Knoin'; +import { view, ViewType, settingsMenuKeysHandler } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; @view({ @@ -40,7 +40,7 @@ class MenuSettingsUserView extends AbstractViewNext { } backToMailBoxClick() { - setHash(inbox(getFolderInboxName())); + rl.route.setHash(inbox(getFolderInboxName())); } } diff --git a/dev/View/User/Settings/Pane.js b/dev/View/User/Settings/Pane.js index 9d723530f..923feeee1 100644 --- a/dev/View/User/Settings/Pane.js +++ b/dev/View/User/Settings/Pane.js @@ -4,7 +4,7 @@ import { leftPanelDisabled } from 'Common/Globals'; import MessageStore from 'Stores/User/Message'; -import { view, ViewType, setHash } from 'Knoin/Knoin'; +import { view, ViewType } from 'Knoin/Knoin'; import { AbstractViewNext } from 'Knoin/AbstractViewNext'; @view({ @@ -44,7 +44,7 @@ class PaneSettingsUserView extends AbstractViewNext { } backToMailBoxClick() { - setHash(inbox(getFolderInboxName())); + rl.route.setHash(inbox(getFolderInboxName())); } } diff --git a/dev/bootstrap.js b/dev/bootstrap.js index dc9d23bca..457ee0be1 100644 --- a/dev/bootstrap.js +++ b/dev/bootstrap.js @@ -3,6 +3,8 @@ import * as Enums from 'Common/Enums'; import * as Plugins from 'Common/Plugins'; import { i18n } from 'Common/Translator'; +import { root } from 'Common/Links'; + export default (App) => { addEventListener('keydown', event => { @@ -53,6 +55,40 @@ export default (App) => { dropdownVisibility(!!rl.Dropdowns.find(item => item.classList.contains('open'))) ).debounce(50); + rl.route = { + root: () => { + rl.route.setHash(root(), true); + rl.route.off(); + }, + reload: () => { + rl.root(); + setTimeout(() => (rl.settings.app('inIframe') ? parent : window).location.reload(), 100); + }, + off: () => hasher.changed.active = false, + on: () => hasher.changed.active = true, + /** + * @param {string} sHash + * @param {boolean=} silence = false + * @param {boolean=} replace = false + * @returns {void} + */ + setHash: (hash, silence = false, replace = false) => { + hash = hash.replace(/^[#/]+/, ''); + + const cmd = replace ? 'replaceHash' : 'setHash'; + + if (silence) { + hasher.changed.active = false; + hasher[cmd](hash); + hasher.changed.active = true; + } else { + hasher.changed.active = true; + hasher[cmd](hash); + hasher.setHash(hash); + } + } + }; + rl.fetchJSON = (resource, init, postData) => { init = Object.assign({ mode: 'same-origin',