Convert user stores to single object instances

Removed unused ContactUserStore.exportingCsv and ContactUserStore.exportingVcf
This commit is contained in:
djmaze 2021-03-10 22:41:35 +01:00
parent 914c6e8d14
commit 6a454ec624
46 changed files with 671 additions and 710 deletions

View file

@ -48,17 +48,17 @@ import {
import { getNotification, i18n } from 'Common/Translator'; import { getNotification, i18n } from 'Common/Translator';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import SettingsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import NotificationStore from 'Stores/User/Notification'; import { NotificationUserStore } from 'Stores/User/Notification';
import AccountStore from 'Stores/User/Account'; import { AccountUserStore } from 'Stores/User/Account';
import ContactStore from 'Stores/User/Contact'; import { ContactUserStore } from 'Stores/User/Contact';
import { IdentityUserStore } from 'Stores/User/Identity'; import { IdentityUserStore } from 'Stores/User/Identity';
import TemplateStore from 'Stores/User/Template'; import { TemplateUserStore } from 'Stores/User/Template';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import PgpStore from 'Stores/User/Pgp'; import { PgpUserStore } from 'Stores/User/Pgp';
import MessageStore from 'Stores/User/Message'; import { MessageUserStore } from 'Stores/User/Message';
import QuotaStore from 'Stores/User/Quota'; import { QuotaUserStore } from 'Stores/User/Quota';
import { ThemeStore } from 'Stores/Theme'; import { ThemeStore } from 'Stores/Theme';
import * as Local from 'Storage/Client'; import * as Local from 'Storage/Client';
@ -131,7 +131,7 @@ class AppUser extends AbstractApp {
['keydown','keyup'].forEach(t => doc.addEventListener(t, fn)); ['keydown','keyup'].forEach(t => doc.addEventListener(t, fn));
['touchstart','mousedown','mousemove','keydown'].forEach( ['touchstart','mousedown','mousemove','keydown'].forEach(
t => doc.addEventListener(t, SettingsStore.delayLogout, {passive:true}) t => doc.addEventListener(t, SettingsUserStore.delayLogout, {passive:true})
); );
shortcuts.add('escape,enter', '', KeyState.All, () => rl.Dropdowns.detectVisibility()); shortcuts.add('escape,enter', '', KeyState.All, () => rl.Dropdowns.detectVisibility());
@ -146,10 +146,10 @@ class AppUser extends AbstractApp {
} }
reloadFlagsCurrentMessageListAndMessageFromCache() { reloadFlagsCurrentMessageListAndMessageFromCache() {
MessageStore.messageList.forEach(message => MessageUserStore.messageList.forEach(message =>
MessageFlagsCache.initMessage(message) MessageFlagsCache.initMessage(message)
); );
MessageFlagsCache.initMessage(MessageStore.message()); MessageFlagsCache.initMessage(MessageUserStore.message());
} }
/** /**
@ -157,58 +157,58 @@ class AppUser extends AbstractApp {
* @param {boolean=} bDropCurrenFolderCache = false * @param {boolean=} bDropCurrenFolderCache = false
*/ */
reloadMessageList(bDropPagePosition = false, bDropCurrenFolderCache = false) { reloadMessageList(bDropPagePosition = false, bDropCurrenFolderCache = false) {
let iOffset = (MessageStore.messageListPage() - 1) * SettingsStore.messagesPerPage(); let iOffset = (MessageUserStore.messageListPage() - 1) * SettingsUserStore.messagesPerPage();
if (bDropCurrenFolderCache) { if (bDropCurrenFolderCache) {
setFolderHash(FolderStore.currentFolderFullNameRaw(), ''); setFolderHash(FolderUserStore.currentFolderFullNameRaw(), '');
} }
if (bDropPagePosition) { if (bDropPagePosition) {
MessageStore.messageListPage(1); MessageUserStore.messageListPage(1);
MessageStore.messageListPageBeforeThread(1); MessageUserStore.messageListPageBeforeThread(1);
iOffset = 0; iOffset = 0;
rl.route.setHash( rl.route.setHash(
mailBox( mailBox(
FolderStore.currentFolderFullNameHash(), FolderUserStore.currentFolderFullNameHash(),
MessageStore.messageListPage(), MessageUserStore.messageListPage(),
MessageStore.messageListSearch(), MessageUserStore.messageListSearch(),
MessageStore.messageListThreadUid() MessageUserStore.messageListThreadUid()
), ),
true, true,
true true
); );
} }
MessageStore.messageListLoading(true); MessageUserStore.messageListLoading(true);
Remote.messageList( Remote.messageList(
(sResult, oData, bCached) => { (sResult, oData, bCached) => {
if (StorageResultType.Success === sResult && oData && oData.Result) { if (StorageResultType.Success === sResult && oData && oData.Result) {
MessageStore.messageListError(''); MessageUserStore.messageListError('');
MessageStore.messageListLoading(false); MessageUserStore.messageListLoading(false);
MessageStore.setMessageList(oData, bCached); MessageUserStore.setMessageList(oData, bCached);
} else if (StorageResultType.Unload === sResult) { } else if (StorageResultType.Unload === sResult) {
MessageStore.messageListError(''); MessageUserStore.messageListError('');
MessageStore.messageListLoading(false); MessageUserStore.messageListLoading(false);
} else if (StorageResultType.Abort !== sResult) { } else if (StorageResultType.Abort !== sResult) {
MessageStore.messageList([]); MessageUserStore.messageList([]);
MessageStore.messageListLoading(false); MessageUserStore.messageListLoading(false);
MessageStore.messageListError( MessageUserStore.messageListError(
getNotification((oData && oData.ErrorCode) || Notification.CantGetMessageList) getNotification((oData && oData.ErrorCode) || Notification.CantGetMessageList)
); );
} }
}, },
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
iOffset, iOffset,
SettingsStore.messagesPerPage(), SettingsUserStore.messagesPerPage(),
MessageStore.messageListSearch(), MessageUserStore.messageListSearch(),
MessageStore.messageListThreadUid() MessageUserStore.messageListThreadUid()
); );
} }
recacheInboxMessageList() { recacheInboxMessageList() {
Remote.messageList(()=>{}, getFolderInboxName(), 0, SettingsStore.messagesPerPage(), '', '', true); Remote.messageList(()=>{}, getFolderInboxName(), 0, SettingsUserStore.messagesPerPage(), '', '', true);
} }
/** /**
@ -216,20 +216,19 @@ class AppUser extends AbstractApp {
* @returns {boolean} * @returns {boolean}
*/ */
contactsSync(fResultFunc) { contactsSync(fResultFunc) {
const oContacts = ContactStore.contacts;
if ( if (
oContacts.importing() || ContactUserStore.importing() ||
oContacts.syncing() || ContactUserStore.syncing() ||
!ContactStore.enableContactsSync() || !ContactUserStore.enableSync() ||
!ContactStore.allowContactsSync() !ContactUserStore.allowSync()
) { ) {
return false; return false;
} }
oContacts.syncing(true); ContactUserStore.syncing(true);
Remote.contactsSync((sResult, oData) => { Remote.contactsSync((sResult, oData) => {
oContacts.syncing(false); ContactUserStore.syncing(false);
if (fResultFunc) { if (fResultFunc) {
fResultFunc(sResult, oData); fResultFunc(sResult, oData);
@ -240,8 +239,8 @@ class AppUser extends AbstractApp {
} }
messagesMoveTrigger() { messagesMoveTrigger() {
const sTrashFolder = FolderStore.trashFolder(), const sTrashFolder = FolderUserStore.trashFolder(),
sSpamFolder = FolderStore.spamFolder(); sSpamFolder = FolderUserStore.spamFolder();
Object.values(this.moveCache).forEach(item => { Object.values(this.moveCache).forEach(item => {
const isSpam = sSpamFolder === item.To, const isSpam = sSpamFolder === item.To,
@ -284,18 +283,18 @@ class AppUser extends AbstractApp {
} }
moveOrDeleteResponseHelper(sResult, oData) { moveOrDeleteResponseHelper(sResult, oData) {
if (StorageResultType.Success === sResult && FolderStore.currentFolder()) { if (StorageResultType.Success === sResult && FolderUserStore.currentFolder()) {
if (oData && Array.isArray(oData.Result) && 2 === oData.Result.length) { if (oData && Array.isArray(oData.Result) && 2 === oData.Result.length) {
setFolderHash(oData.Result[0], oData.Result[1]); setFolderHash(oData.Result[0], oData.Result[1]);
} else { } else {
setFolderHash(FolderStore.currentFolderFullNameRaw(), ''); setFolderHash(FolderUserStore.currentFolderFullNameRaw(), '');
if (oData && [Notification.CantMoveMessage, Notification.CantCopyMessage].includes(oData.ErrorCode)) { if (oData && [Notification.CantMoveMessage, Notification.CantCopyMessage].includes(oData.ErrorCode)) {
alert(getNotification(oData.ErrorCode)); alert(getNotification(oData.ErrorCode));
} }
} }
this.reloadMessageList(!MessageStore.messageList.length); this.reloadMessageList(!MessageUserStore.messageList.length);
this.quotaDebounce(); this.quotaDebounce();
} }
} }
@ -306,7 +305,7 @@ class AppUser extends AbstractApp {
*/ */
deleteMessagesFromFolderWithoutCheck(sFromFolderFullNameRaw, aUidForRemove) { deleteMessagesFromFolderWithoutCheck(sFromFolderFullNameRaw, aUidForRemove) {
this.messagesDeleteHelper(sFromFolderFullNameRaw, aUidForRemove); this.messagesDeleteHelper(sFromFolderFullNameRaw, aUidForRemove);
MessageStore.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove); MessageUserStore.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove);
} }
/** /**
@ -321,18 +320,18 @@ class AppUser extends AbstractApp {
switch (iDeleteType) { switch (iDeleteType) {
case FolderType.Spam: case FolderType.Spam:
oMoveFolder = getFolderFromCacheList(FolderStore.spamFolder()); oMoveFolder = getFolderFromCacheList(FolderUserStore.spamFolder());
nSetSystemFoldersNotification = SetSystemFoldersNotification.Spam; nSetSystemFoldersNotification = SetSystemFoldersNotification.Spam;
break; break;
case FolderType.NotSpam: case FolderType.NotSpam:
oMoveFolder = getFolderFromCacheList(getFolderInboxName()); oMoveFolder = getFolderFromCacheList(getFolderInboxName());
break; break;
case FolderType.Trash: case FolderType.Trash:
oMoveFolder = getFolderFromCacheList(FolderStore.trashFolder()); oMoveFolder = getFolderFromCacheList(FolderUserStore.trashFolder());
nSetSystemFoldersNotification = SetSystemFoldersNotification.Trash; nSetSystemFoldersNotification = SetSystemFoldersNotification.Trash;
break; break;
case FolderType.Archive: case FolderType.Archive:
oMoveFolder = getFolderFromCacheList(FolderStore.archiveFolder()); oMoveFolder = getFolderFromCacheList(FolderUserStore.archiveFolder());
nSetSystemFoldersNotification = SetSystemFoldersNotification.Archive; nSetSystemFoldersNotification = SetSystemFoldersNotification.Archive;
break; break;
// no default // no default
@ -341,9 +340,9 @@ class AppUser extends AbstractApp {
bUseFolder = undefined === bUseFolder ? true : !!bUseFolder; bUseFolder = undefined === bUseFolder ? true : !!bUseFolder;
if (bUseFolder) { if (bUseFolder) {
if ( if (
(FolderType.Spam === iDeleteType && UNUSED_OPTION_VALUE === FolderStore.spamFolder()) || (FolderType.Spam === iDeleteType && UNUSED_OPTION_VALUE === FolderUserStore.spamFolder()) ||
(FolderType.Trash === iDeleteType && UNUSED_OPTION_VALUE === FolderStore.trashFolder()) || (FolderType.Trash === iDeleteType && UNUSED_OPTION_VALUE === FolderUserStore.trashFolder()) ||
(FolderType.Archive === iDeleteType && UNUSED_OPTION_VALUE === FolderStore.archiveFolder()) (FolderType.Archive === iDeleteType && UNUSED_OPTION_VALUE === FolderUserStore.archiveFolder())
) { ) {
bUseFolder = false; bUseFolder = false;
} }
@ -354,18 +353,19 @@ class AppUser extends AbstractApp {
} else if ( } else if (
!bUseFolder || !bUseFolder ||
(FolderType.Trash === iDeleteType && (FolderType.Trash === iDeleteType &&
(sFromFolderFullNameRaw === FolderStore.spamFolder() || sFromFolderFullNameRaw === FolderStore.trashFolder())) (sFromFolderFullNameRaw === FolderUserStore.spamFolder()
|| sFromFolderFullNameRaw === FolderUserStore.trashFolder()))
) { ) {
showScreenPopup(AskPopupView, [ showScreenPopup(AskPopupView, [
i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'), i18n('POPUPS_ASK/DESC_WANT_DELETE_MESSAGES'),
() => { () => {
this.messagesDeleteHelper(sFromFolderFullNameRaw, aUidForRemove); this.messagesDeleteHelper(sFromFolderFullNameRaw, aUidForRemove);
MessageStore.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove); MessageUserStore.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove);
} }
]); ]);
} else if (oMoveFolder) { } else if (oMoveFolder) {
this.messagesMoveHelper(sFromFolderFullNameRaw, oMoveFolder.fullNameRaw, aUidForRemove); this.messagesMoveHelper(sFromFolderFullNameRaw, oMoveFolder.fullNameRaw, aUidForRemove);
MessageStore.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove, oMoveFolder.fullNameRaw); MessageUserStore.removeMessagesFromList(sFromFolderFullNameRaw, aUidForRemove, oMoveFolder.fullNameRaw);
} }
} }
@ -387,7 +387,7 @@ class AppUser extends AbstractApp {
this.messagesMoveHelper(oFromFolder.fullNameRaw, oToFolder.fullNameRaw, aUidForMove); this.messagesMoveHelper(oFromFolder.fullNameRaw, oToFolder.fullNameRaw, aUidForMove);
} }
MessageStore.removeMessagesFromList(oFromFolder.fullNameRaw, aUidForMove, oToFolder.fullNameRaw, bCopy); MessageUserStore.removeMessagesFromList(oFromFolder.fullNameRaw, aUidForMove, oToFolder.fullNameRaw, bCopy);
return true; return true;
} }
} }
@ -409,17 +409,17 @@ class AppUser extends AbstractApp {
.then( .then(
Remote.foldersReloadWithTimeout, Remote.foldersReloadWithTimeout,
errorCode => { errorCode => {
FolderStore.folderListError(getNotification(errorCode, '', errorDefCode)); FolderUserStore.folderListError(getNotification(errorCode, '', errorDefCode));
Remote.foldersReloadWithTimeout(); Remote.foldersReloadWithTimeout();
} }
); );
} }
reloadOpenPgpKeys() { reloadOpenPgpKeys() {
if (PgpStore.capaOpenPGP()) { if (PgpUserStore.capaOpenPGP()) {
const keys = [], const keys = [],
email = new EmailModel(), email = new EmailModel(),
openpgpKeyring = PgpStore.openpgpKeyring, openpgpKeyring = PgpUserStore.openpgpKeyring,
openpgpKeys = openpgpKeyring ? openpgpKeyring.getAllKeys() : []; openpgpKeys = openpgpKeyring ? openpgpKeyring.getAllKeys() : [];
openpgpKeys.forEach((oItem, iIndex) => { openpgpKeys.forEach((oItem, iIndex) => {
@ -470,32 +470,32 @@ class AppUser extends AbstractApp {
} }
}); });
delegateRunOnDestroy(PgpStore.openpgpkeys()); delegateRunOnDestroy(PgpUserStore.openpgpkeys());
PgpStore.openpgpkeys(keys); PgpUserStore.openpgpkeys(keys);
} }
} }
accountsAndIdentities() { accountsAndIdentities() {
AccountStore.accounts.loading(true); AccountUserStore.loading(true);
IdentityUserStore.loading(true); IdentityUserStore.loading(true);
Remote.accountsAndIdentities((sResult, oData) => { Remote.accountsAndIdentities((sResult, oData) => {
AccountStore.accounts.loading(false); AccountUserStore.loading(false);
IdentityUserStore.loading(false); IdentityUserStore.loading(false);
if (StorageResultType.Success === sResult && oData.Result) { if (StorageResultType.Success === sResult && oData.Result) {
const counts = {}, const counts = {},
sAccountEmail = AccountStore.email(); sAccountEmail = AccountUserStore.email();
let parentEmail = SettingsGet('ParentEmail') || sAccountEmail; let parentEmail = SettingsGet('ParentEmail') || sAccountEmail;
if (Array.isArray(oData.Result.Accounts)) { if (Array.isArray(oData.Result.Accounts)) {
AccountStore.accounts.forEach(oAccount => AccountUserStore.accounts.forEach(oAccount =>
counts[oAccount.email] = oAccount.count() counts[oAccount.email] = oAccount.count()
); );
delegateRunOnDestroy(AccountStore.accounts()); delegateRunOnDestroy(AccountUserStore.accounts());
AccountStore.accounts( AccountUserStore.accounts(
oData.Result.Accounts.map( oData.Result.Accounts.map(
sValue => new AccountModel(sValue, sValue !== parentEmail, counts[sValue] || 0) sValue => new AccountModel(sValue, sValue !== parentEmail, counts[sValue] || 0)
) )
@ -526,15 +526,15 @@ class AppUser extends AbstractApp {
} }
templates() { templates() {
TemplateStore.templates.loading(true); TemplateUserStore.templates.loading(true);
Remote.templates((result, data) => { Remote.templates((result, data) => {
TemplateStore.templates.loading(false); TemplateUserStore.templates.loading(false);
if (StorageResultType.Success === result && data.Result && Array.isArray(data.Result.Templates)) { if (StorageResultType.Success === result && data.Result && Array.isArray(data.Result.Templates)) {
delegateRunOnDestroy(TemplateStore.templates()); delegateRunOnDestroy(TemplateUserStore.templates());
TemplateStore.templates( TemplateUserStore.templates(
data.Result.Templates.map(templateData => data.Result.Templates.map(templateData =>
TemplateModel.reviveFromJson(templateData) TemplateModel.reviveFromJson(templateData)
).filter(v => v) ).filter(v => v)
@ -554,7 +554,7 @@ class AppUser extends AbstractApp {
isPosNumeric(data.Result[0], true) && isPosNumeric(data.Result[0], true) &&
isPosNumeric(data.Result[1], true) isPosNumeric(data.Result[1], true)
) { ) {
QuotaStore.populateData(pInt(data.Result[1]), pInt(data.Result[0])); QuotaUserStore.populateData(pInt(data.Result[1]), pInt(data.Result[0]));
} }
}); });
} }
@ -617,7 +617,7 @@ class AppUser extends AbstractApp {
} }
} }
MessageStore.initUidNextAndNewMessages( MessageUserStore.initUidNextAndNewMessages(
folderFromCache.fullNameRaw, folderFromCache.fullNameRaw,
data.Result.UidNext, data.Result.UidNext,
data.Result.NewMessages data.Result.NewMessages
@ -625,7 +625,7 @@ class AppUser extends AbstractApp {
const hash = getFolderHash(data.Result.Folder); const hash = getFolderHash(data.Result.Folder);
if (!hash || unreadCountChange || data.Result.Hash !== hash) { if (!hash || unreadCountChange || data.Result.Hash !== hash) {
if (folderFromCache.fullNameRaw === FolderStore.currentFolderFullNameRaw()) { if (folderFromCache.fullNameRaw === FolderUserStore.currentFolderFullNameRaw()) {
this.reloadMessageList(); this.reloadMessageList();
} else if (getFolderInboxName() === folderFromCache.fullNameRaw) { } else if (getFolderInboxName() === folderFromCache.fullNameRaw) {
this.recacheInboxMessageList(); this.recacheInboxMessageList();
@ -645,7 +645,7 @@ class AppUser extends AbstractApp {
* @param {boolean=} boot = false * @param {boolean=} boot = false
*/ */
folderInformationMultiply(boot = false) { folderInformationMultiply(boot = false) {
const folders = FolderStore.getNextFolderNames(); const folders = FolderUserStore.getNextFolderNames();
if (Array.isNotEmpty(folders)) { if (Array.isNotEmpty(folders)) {
Remote.folderInformationMultiply((sResult, oData) => { Remote.folderInformationMultiply((sResult, oData) => {
if (StorageResultType.Success === sResult) { if (StorageResultType.Success === sResult) {
@ -680,13 +680,13 @@ class AppUser extends AbstractApp {
} }
if (!hash || item.Hash !== hash) { if (!hash || item.Hash !== hash) {
if (folder.fullNameRaw === FolderStore.currentFolderFullNameRaw()) { if (folder.fullNameRaw === FolderUserStore.currentFolderFullNameRaw()) {
this.reloadMessageList(); this.reloadMessageList();
} }
} else if (unreadCountChange } else if (unreadCountChange
&& folder.fullNameRaw === FolderStore.currentFolderFullNameRaw() && folder.fullNameRaw === FolderUserStore.currentFolderFullNameRaw()
&& MessageStore.messageList.length) { && MessageUserStore.messageList.length) {
this.folderInformation(folder.fullNameRaw, MessageStore.messageList()); this.folderInformation(folder.fullNameRaw, MessageUserStore.messageList());
} }
} }
}); });
@ -711,7 +711,7 @@ class AppUser extends AbstractApp {
rootUids = []; rootUids = [];
if (undefined === messages || !messages) { if (undefined === messages || !messages) {
messages = MessageStore.messageListChecked(); messages = MessageUserStore.messageListChecked();
} }
rootUids = messages.map(oMessage => oMessage && oMessage.uid ? oMessage.uid : null) rootUids = messages.map(oMessage => oMessage && oMessage.uid ? oMessage.uid : null)
@ -764,7 +764,7 @@ class AppUser extends AbstractApp {
} }
this.reloadFlagsCurrentMessageListAndMessageFromCache(); this.reloadFlagsCurrentMessageListAndMessageFromCache();
MessageStore.messageViewTrigger(!MessageStore.messageViewTrigger()); MessageUserStore.messageViewTrigger(!MessageUserStore.messageViewTrigger());
} }
} }
@ -901,11 +901,11 @@ class AppUser extends AbstractApp {
addEventListener('resize', () => leftPanelDisabled(ThemeStore.isMobile() || 1000 > innerWidth)); addEventListener('resize', () => leftPanelDisabled(ThemeStore.isMobile() || 1000 > innerWidth));
AppStore.populate(); AppUserStore.populate();
SettingsStore.populate(); SettingsUserStore.populate();
NotificationStore.populate(); NotificationUserStore.populate();
AccountStore.populate(); AccountUserStore.populate();
ContactStore.populate(); ContactUserStore.populate();
let contactsSyncInterval = pInt(SettingsGet('ContactsSyncInterval')); let contactsSyncInterval = pInt(SettingsGet('ContactsSyncInterval'));
@ -941,18 +941,18 @@ class AppUser extends AbstractApp {
if (!window.openpgp) { if (!window.openpgp) {
return false; return false;
} }
PgpStore.openpgp = openpgp; PgpUserStore.openpgp = openpgp;
if (window.Worker) { if (window.Worker) {
try { try {
PgpStore.openpgp.initWorker({ path: openPgpWorkerJs() }); PgpUserStore.openpgp.initWorker({ path: openPgpWorkerJs() });
} catch (e) { } catch (e) {
console.error(e); console.error(e);
} }
} }
PgpStore.openpgpKeyring = new openpgp.Keyring(); PgpUserStore.openpgpKeyring = new openpgp.Keyring();
PgpStore.capaOpenPGP(true); PgpUserStore.capaOpenPGP(true);
this.reloadOpenPgpKeys(); this.reloadOpenPgpKeys();
@ -966,7 +966,7 @@ class AppUser extends AbstractApp {
doc.head.append(script); doc.head.append(script);
} }
} else { } else {
PgpStore.capaOpenPGP(false); PgpUserStore.capaOpenPGP(false);
} }
startScreens([ startScreens([
@ -977,7 +977,7 @@ class AppUser extends AbstractApp {
// Every 5 minutes // Every 5 minutes
setInterval(() => { setInterval(() => {
const cF = FolderStore.currentFolderFullNameRaw(), const cF = FolderUserStore.currentFolderFullNameRaw(),
iF = getFolderInboxName(); iF = getFolderInboxName();
this.folderInformation(iF); this.folderInformation(iF);
if (iF !== cF) { if (iF !== cF) {
@ -999,7 +999,7 @@ class AppUser extends AbstractApp {
this.accountsAndIdentities(true); this.accountsAndIdentities(true);
setTimeout(() => { setTimeout(() => {
const cF = FolderStore.currentFolderFullNameRaw(); const cF = FolderUserStore.currentFolderFullNameRaw();
if (getFolderInboxName() !== cF) { if (getFolderInboxName() !== cF) {
this.folderInformation(cF); this.folderInformation(cF);
} }

View file

@ -63,7 +63,7 @@ unlockEvents.forEach(type => doc.addEventListener(type, unlock, true));
* Browsers can't play without user interaction * Browsers can't play without user interaction
*/ */
const SMAudio = new class { export const SMAudio = new class {
constructor() { constructor() {
player || (player = createNewObject()); player || (player = createNewObject());
@ -119,5 +119,3 @@ const SMAudio = new class {
} }
} }
}; };
export default SMAudio;

View file

@ -8,7 +8,7 @@ import {
import { AbstractModel } from 'Knoin/AbstractModel'; import { AbstractModel } from 'Knoin/AbstractModel';
import Audio from 'Common/Audio'; import { SMAudio } from 'Common/Audio';
const bAllowPdfPreview = undefined !== navigator.mimeTypes['application/pdf']; const bAllowPdfPreview = undefined !== navigator.mimeTypes['application/pdf'];
@ -120,9 +120,9 @@ export class AttachmentModel extends AbstractModel {
*/ */
hasPreplay() { hasPreplay() {
return ( return (
(Audio.supportedMp3 && this.isMp3()) || (SMAudio.supportedMp3 && this.isMp3()) ||
(Audio.supportedOgg && this.isOgg()) || (SMAudio.supportedOgg && this.isOgg()) ||
(Audio.supportedWav && this.isWav()) (SMAudio.supportedWav && this.isWav())
); );
} }

View file

@ -5,7 +5,7 @@ import { delegateRunOnDestroy } from 'Common/UtilsUser';
import { i18n } from 'Common/Translator'; import { i18n } from 'Common/Translator';
import { getFolderFromCacheList } from 'Common/Cache'; import { getFolderFromCacheList } from 'Common/Cache';
import AccountStore from 'Stores/User/Account'; import { AccountUserStore } from 'Stores/User/Account';
import { FilterConditionModel } from 'Model/FilterCondition'; import { FilterConditionModel } from 'Model/FilterCondition';
import { AbstractModel } from 'Knoin/AbstractModel'; import { AbstractModel } from 'Knoin/AbstractModel';
@ -215,7 +215,7 @@ export class FilterModel extends AbstractModel {
} }
setRecipients() { setRecipients() {
this.actionValueFourth(AccountStore.getEmailAddresses().join(', ')); this.actionValueFourth(AccountUserStore.getEmailAddresses().join(', '));
} }
/** /**

View file

@ -8,8 +8,8 @@ import { Settings, SettingsGet } from 'Common/Globals';
import * as Local from 'Storage/Client'; import * as Local from 'Storage/Client';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import ko from 'ko'; import ko from 'ko';
@ -102,17 +102,17 @@ export class FolderCollectionModel extends AbstractCollectionModel
let limit = pInt(Settings.app('folderSpecLimit')); let limit = pInt(Settings.app('folderSpecLimit'));
limit = 100 < limit ? 100 : 10 > limit ? 10 : limit; limit = 100 < limit ? 100 : 10 > limit ? 10 : limit;
FolderStore.displaySpecSetting(0 >= cnt || limit < cnt); FolderUserStore.displaySpecSetting(0 >= cnt || limit < cnt);
FolderStore.folderList(this); FolderUserStore.folderList(this);
if (undefined !== this.Namespace) { if (undefined !== this.Namespace) {
FolderStore.namespace = this.Namespace; FolderUserStore.namespace = this.Namespace;
} }
AppStore.threadsAllowed(!!(Settings.app('useImapThread') && this.IsThreadsSupported)); AppUserStore.threadsAllowed(!!(Settings.app('useImapThread') && this.IsThreadsSupported));
FolderStore.folderListOptimized(!!this.Optimized); FolderUserStore.folderListOptimized(!!this.Optimized);
let update = false; let update = false;
@ -135,19 +135,19 @@ export class FolderCollectionModel extends AbstractCollectionModel
update = true; update = true;
} }
FolderStore.sentFolder(normalizeFolder(SettingsGet('SentFolder'))); FolderUserStore.sentFolder(normalizeFolder(SettingsGet('SentFolder')));
FolderStore.draftFolder(normalizeFolder(SettingsGet('DraftFolder'))); FolderUserStore.draftFolder(normalizeFolder(SettingsGet('DraftFolder')));
FolderStore.spamFolder(normalizeFolder(SettingsGet('SpamFolder'))); FolderUserStore.spamFolder(normalizeFolder(SettingsGet('SpamFolder')));
FolderStore.trashFolder(normalizeFolder(SettingsGet('TrashFolder'))); FolderUserStore.trashFolder(normalizeFolder(SettingsGet('TrashFolder')));
FolderStore.archiveFolder(normalizeFolder(SettingsGet('ArchiveFolder'))); FolderUserStore.archiveFolder(normalizeFolder(SettingsGet('ArchiveFolder')));
if (update) { if (update) {
rl.app.Remote.saveSystemFolders(()=>{}, { rl.app.Remote.saveSystemFolders(()=>{}, {
SentFolder: FolderStore.sentFolder(), SentFolder: FolderUserStore.sentFolder(),
DraftFolder: FolderStore.draftFolder(), DraftFolder: FolderUserStore.draftFolder(),
SpamFolder: FolderStore.spamFolder(), SpamFolder: FolderUserStore.spamFolder(),
TrashFolder: FolderStore.trashFolder(), TrashFolder: FolderUserStore.trashFolder(),
ArchiveFolder: FolderStore.archiveFolder(), ArchiveFolder: FolderUserStore.archiveFolder(),
NullFolder: 'NullFolder' NullFolder: 'NullFolder'
}); });
} }

View file

@ -8,7 +8,7 @@ import { isArray } from 'Common/Utils';
import { serverRequestRaw } from 'Common/Links'; import { serverRequestRaw } from 'Common/Links';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import { FileInfo } from 'Common/File'; import { FileInfo } from 'Common/File';
import { AttachmentCollectionModel } from 'Model/AttachmentCollection'; import { AttachmentCollectionModel } from 'Model/AttachmentCollection';
@ -173,7 +173,7 @@ export class MessageModel extends AbstractModel {
} }
computeSenderEmail() { computeSenderEmail() {
const list = [FolderStore.sentFolder(), FolderStore.draftFolder()].includes(this.folder) ? 'to' : 'from'; const list = [FolderUserStore.sentFolder(), FolderUserStore.draftFolder()].includes(this.folder) ? 'to' : 'from';
this.senderEmailsString(this[list].toString(true)); this.senderEmailsString(this[list].toString(true));
this.senderClearEmailsString(this[list].toStringClear()); this.senderClearEmailsString(this[list].toStringClear());
} }

View file

@ -2,7 +2,7 @@ import ko from 'ko';
import { AbstractModel } from 'Knoin/AbstractModel'; import { AbstractModel } from 'Knoin/AbstractModel';
import PgpStore from 'Stores/User/Pgp'; import { PgpUserStore } from 'Stores/User/Pgp';
export class OpenPgpKeyModel extends AbstractModel { export class OpenPgpKeyModel extends AbstractModel {
/** /**
@ -38,7 +38,7 @@ export class OpenPgpKeyModel extends AbstractModel {
getNativeKey() { getNativeKey() {
let key = null; let key = null;
try { try {
key = PgpStore.openpgp.key.readArmored(this.armor); key = PgpUserStore.openpgp.key.readArmored(this.armor);
if (key && !key.err && key.keys && key.keys[0]) { if (key && !key.err && key.keys && key.keys[0]) {
return key; return key;
} }

View file

@ -11,9 +11,9 @@ import {
import { SettingsGet } from 'Common/Globals'; import { SettingsGet } from 'Common/Globals';
import { SUB_QUERY_PREFIX } from 'Common/Links'; import { SUB_QUERY_PREFIX } from 'Common/Links';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import SettingsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import { AbstractFetchRemote } from 'Remote/AbstractFetch'; import { AbstractFetchRemote } from 'Remote/AbstractFetch';
@ -308,7 +308,7 @@ class RemoteUserFetch extends AbstractFetchRemote {
sFolderFullNameRaw = pString(sFolderFullNameRaw); sFolderFullNameRaw = pString(sFolderFullNameRaw);
const folderHash = getFolderHash(sFolderFullNameRaw), const folderHash = getFolderHash(sFolderFullNameRaw),
useThreads = AppStore.threadsAllowed() && SettingsStore.useThreads(), useThreads = AppUserStore.threadsAllowed() && SettingsUserStore.useThreads(),
inboxUidNext = getFolderInboxName() === sFolderFullNameRaw ? getFolderUidNext(sFolderFullNameRaw) : ''; inboxUidNext = getFolderInboxName() === sFolderFullNameRaw ? getFolderUidNext(sFolderFullNameRaw) : '';
let params = {}, sGetAdd = ''; let params = {}, sGetAdd = '';
@ -322,7 +322,7 @@ class RemoteUserFetch extends AbstractFetchRemote {
iOffset, iOffset,
iLimit, iLimit,
sSearch, sSearch,
AppStore.projectHash(), AppUserStore.projectHash(),
folderHash, folderHash,
inboxUidNext, inboxUidNext,
useThreads ? 1 : 0, useThreads ? 1 : 0,
@ -387,8 +387,8 @@ class RemoteUserFetch extends AbstractFetchRemote {
urlsafeArray([ urlsafeArray([
sFolderFullNameRaw, sFolderFullNameRaw,
iUid, iUid,
AppStore.projectHash(), AppUserStore.projectHash(),
AppStore.threadsAllowed() && SettingsStore.useThreads() ? 1 : 0 AppUserStore.threadsAllowed() && SettingsUserStore.useThreads() ? 1 : 0
]), ]),
['Message'] ['Message']
); );
@ -467,7 +467,7 @@ class RemoteUserFetch extends AbstractFetchRemote {
FlagsUids: Array.isArray(uids) ? uids.join(',') : '', FlagsUids: Array.isArray(uids) ? uids.join(',') : '',
UidNext: getFolderInboxName() === folder ? getFolderUidNext(folder) : '' UidNext: getFolderInboxName() === folder ? getFolderUidNext(folder) : ''
}); });
} else if (SettingsStore.useThreads()) { } else if (SettingsUserStore.useThreads()) {
rl.app.reloadFlagsCurrentMessageListAndMessageFromCache(); rl.app.reloadFlagsCurrentMessageListAndMessageFromCache();
} }
} }
@ -773,7 +773,7 @@ class RemoteUserFetch extends AbstractFetchRemote {
foldersReload(fCallback) { foldersReload(fCallback) {
this.abort('Folders') this.abort('Folders')
.postRequest('Folders', FolderStore.foldersLoading) .postRequest('Folders', FolderUserStore.foldersLoading)
.then(data => { .then(data => {
data = FolderCollectionModel.reviveFromJson(data.Result); data = FolderCollectionModel.reviveFromJson(data.Result);
data && data.storeIt(); data && data.storeIt();
@ -783,27 +783,27 @@ class RemoteUserFetch extends AbstractFetchRemote {
} }
foldersReloadWithTimeout() { foldersReloadWithTimeout() {
this.setTrigger(FolderStore.foldersLoading, true); this.setTrigger(FolderUserStore.foldersLoading, true);
clearTimeout(this.foldersTimeout); clearTimeout(this.foldersTimeout);
this.foldersTimeout = setTimeout(() => this.foldersReload(), 500); this.foldersTimeout = setTimeout(() => this.foldersReload(), 500);
} }
folderDelete(sFolderFullNameRaw) { folderDelete(sFolderFullNameRaw) {
return this.postRequest('FolderDelete', FolderStore.foldersDeleting, { return this.postRequest('FolderDelete', FolderUserStore.foldersDeleting, {
Folder: sFolderFullNameRaw Folder: sFolderFullNameRaw
}); });
} }
folderCreate(sNewFolderName, sParentName) { folderCreate(sNewFolderName, sParentName) {
return this.postRequest('FolderCreate', FolderStore.foldersCreating, { return this.postRequest('FolderCreate', FolderUserStore.foldersCreating, {
Folder: sNewFolderName, Folder: sNewFolderName,
Parent: sParentName Parent: sParentName
}); });
} }
folderRename(sPrevFolderFullNameRaw, sNewFolderName) { folderRename(sPrevFolderFullNameRaw, sNewFolderName) {
return this.postRequest('FolderRename', FolderStore.foldersRenaming, { return this.postRequest('FolderRename', FolderUserStore.foldersRenaming, {
Folder: sPrevFolderFullNameRaw, Folder: sPrevFolderFullNameRaw,
NewFolderName: sNewFolderName NewFolderName: sNewFolderName
}); });

View file

@ -4,11 +4,11 @@ import { pString, pInt } from 'Common/Utils';
import { getFolderFromCacheList, getFolderFullNameRaw, getFolderInboxName } from 'Common/Cache'; import { getFolderFromCacheList, getFolderFullNameRaw, getFolderInboxName } from 'Common/Cache';
import { i18n } from 'Common/Translator'; import { i18n } from 'Common/Translator';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import AccountStore from 'Stores/User/Account'; import { AccountUserStore } from 'Stores/User/Account';
import SettingsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import MessageStore from 'Stores/User/Message'; import { MessageUserStore } from 'Stores/User/Message';
import { ThemeStore } from 'Stores/Theme'; import { ThemeStore } from 'Stores/Theme';
import { SystemDropDownMailBoxUserView } from 'View/User/MailBox/SystemDropDown'; import { SystemDropDownMailBoxUserView } from 'View/User/MailBox/SystemDropDown';
@ -36,12 +36,12 @@ export class MailBoxUserScreen extends AbstractScreen {
* @returns {void} * @returns {void}
*/ */
updateWindowTitle() { updateWindowTitle() {
const foldersInboxUnreadCount = Settings.app('listPermanentFiltered') ? 0 : FolderStore.foldersInboxUnreadCount(), const count = Settings.app('listPermanentFiltered') ? 0 : FolderUserStore.foldersInboxUnreadCount(),
email = AccountStore.email(); email = AccountUserStore.email();
rl.setWindowTitle( rl.setWindowTitle(
(email (email
? '' + (0 < foldersInboxUnreadCount ? '(' + foldersInboxUnreadCount + ') ' : ' ') + email + ' - ' ? '' + (0 < count ? '(' + count + ') ' : ' ') + email + ' - '
: '' : ''
) + i18n('TITLES/MAILBOX') ) + i18n('TITLES/MAILBOX')
); );
@ -53,8 +53,8 @@ export class MailBoxUserScreen extends AbstractScreen {
onShow() { onShow() {
this.updateWindowTitle(); this.updateWindowTitle();
AppStore.focusedState(Focused.None); AppUserStore.focusedState(Focused.None);
AppStore.focusedState(Focused.MessageList); AppUserStore.focusedState(Focused.MessageList);
ThemeStore.isMobile() && leftPanelDisabled(true); ThemeStore.isMobile() && leftPanelDisabled(true);
} }
@ -73,11 +73,11 @@ export class MailBoxUserScreen extends AbstractScreen {
threadUid = ''; threadUid = '';
} }
FolderStore.currentFolder(folder); FolderUserStore.currentFolder(folder);
MessageStore.messageListPage(page); MessageUserStore.messageListPage(page);
MessageStore.messageListSearch(search); MessageUserStore.messageListSearch(search);
MessageStore.messageListThreadUid(threadUid); MessageUserStore.messageListThreadUid(threadUid);
rl.app.reloadMessageList(); rl.app.reloadMessageList();
} }
@ -89,14 +89,14 @@ export class MailBoxUserScreen extends AbstractScreen {
onStart() { onStart() {
if (!this.__started) { if (!this.__started) {
super.onStart(); super.onStart();
setTimeout(() => SettingsStore.layout.valueHasMutated(), 50); setTimeout(() => SettingsUserStore.layout.valueHasMutated(), 50);
setTimeout(() => warmUpScreenPopup(ComposePopupView), 500); setTimeout(() => warmUpScreenPopup(ComposePopupView), 500);
addEventListener('mailbox.inbox-unread-count', e => { addEventListener('mailbox.inbox-unread-count', e => {
FolderStore.foldersInboxUnreadCount(e.detail); FolderUserStore.foldersInboxUnreadCount(e.detail);
const email = AccountStore.email(); const email = AccountUserStore.email();
AccountStore.accounts.forEach(item => AccountUserStore.accounts.forEach(item =>
item && email === item.email && item.count(e.detail) item && email === item.email && item.count(e.detail)
); );

View file

@ -3,8 +3,8 @@ import { keyScope, leftPanelDisabled, Settings } from 'Common/Globals';
import { runSettingsViewModelHooks } from 'Common/Plugins'; import { runSettingsViewModelHooks } from 'Common/Plugins';
import { initOnStartOrLangChange, i18n } from 'Common/Translator'; import { initOnStartOrLangChange, i18n } from 'Common/Translator';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import AccountStore from 'Stores/User/Account'; import { AccountUserStore } from 'Stores/User/Account';
import { ThemeStore } from 'Stores/Theme'; import { ThemeStore } from 'Stores/Theme';
import { AbstractSettingsScreen, settingsAddViewModel } from 'Screen/AbstractSettings'; import { AbstractSettingsScreen, settingsAddViewModel } from 'Screen/AbstractSettings';
@ -45,7 +45,7 @@ export class SettingsUserScreen extends AbstractSettingsScreen {
settingsAddViewModel(GeneralUserSettings, 'SettingsGeneral', 'SETTINGS_LABELS/LABEL_GENERAL_NAME', 'general', true); settingsAddViewModel(GeneralUserSettings, 'SettingsGeneral', 'SETTINGS_LABELS/LABEL_GENERAL_NAME', 'general', true);
if (AppStore.contactsIsAllowed()) { if (AppUserStore.contactsIsAllowed()) {
settingsAddViewModel(ContactsUserSettings, 'SettingsContacts', 'SETTINGS_LABELS/LABEL_CONTACTS_NAME', 'contacts'); settingsAddViewModel(ContactsUserSettings, 'SettingsContacts', 'SETTINGS_LABELS/LABEL_CONTACTS_NAME', 'contacts');
} }
@ -101,7 +101,7 @@ export class SettingsUserScreen extends AbstractSettingsScreen {
} }
setSettingsTitle() { setSettingsTitle() {
const sEmail = AccountStore.email(); const sEmail = AccountUserStore.email();
rl.setWindowTitle((sEmail ? sEmail + ' - ' : '') + this.sSettingsTitle); rl.setWindowTitle((sEmail ? sEmail + ' - ' : '') + this.sSettingsTitle);
} }
} }

View file

@ -3,7 +3,7 @@ import ko from 'ko';
import { Capa, StorageResultType } from 'Common/Enums'; import { Capa, StorageResultType } from 'Common/Enums';
import { Settings } from 'Common/Globals'; import { Settings } from 'Common/Globals';
import AccountStore from 'Stores/User/Account'; import { AccountUserStore } from 'Stores/User/Account';
import { IdentityUserStore } from 'Stores/User/Identity'; import { IdentityUserStore } from 'Stores/User/Identity';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -17,7 +17,8 @@ export class AccountsUserSettings {
this.allowAdditionalAccount = Settings.capa(Capa.AdditionalAccounts); this.allowAdditionalAccount = Settings.capa(Capa.AdditionalAccounts);
this.allowIdentities = Settings.capa(Capa.Identities); this.allowIdentities = Settings.capa(Capa.Identities);
this.accounts = AccountStore.accounts; this.accounts = AccountUserStore.accounts;
this.loading = AccountUserStore.loading;
this.identities = IdentityUserStore; this.identities = IdentityUserStore;
this.accountForDeletion = ko.observable(null).deleteAccessHelper(); this.accountForDeletion = ko.observable(null).deleteAccessHelper();
@ -80,7 +81,7 @@ export class AccountsUserSettings {
} }
accountsAndIdentitiesAfterMove() { accountsAndIdentitiesAfterMove() {
Remote.accountsAndIdentitiesSortOrder(null, AccountStore.getEmailAddresses(), IdentityUserStore.getIDS()); Remote.accountsAndIdentitiesSortOrder(null, AccountUserStore.getEmailAddresses(), IdentityUserStore.getIDS());
} }
onBuild(oDom) { onBuild(oDom) {

View file

@ -1,26 +1,26 @@
import ko from 'ko'; import ko from 'ko';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import ContactStore from 'Stores/User/Contact'; import { ContactUserStore } from 'Stores/User/Contact';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
export class ContactsUserSettings { export class ContactsUserSettings {
constructor() { constructor() {
this.contactsAutosave = AppStore.contactsAutosave; this.contactsAutosave = AppUserStore.contactsAutosave;
this.allowContactsSync = ContactStore.allowContactsSync; this.allowContactsSync = ContactUserStore.allowSync;
this.enableContactsSync = ContactStore.enableContactsSync; this.enableContactsSync = ContactUserStore.enableSync;
this.contactsSyncUrl = ContactStore.contactsSyncUrl; this.contactsSyncUrl = ContactUserStore.syncUrl;
this.contactsSyncUser = ContactStore.contactsSyncUser; this.contactsSyncUser = ContactUserStore.syncUser;
this.contactsSyncPass = ContactStore.contactsSyncPass; this.contactsSyncPass = ContactUserStore.syncPass;
this.saveTrigger = ko this.saveTrigger = ko
.computed(() => .computed(() =>
[ [
this.enableContactsSync() ? '1' : '0', ContactUserStore.enableSync() ? '1' : '0',
this.contactsSyncUrl(), ContactUserStore.syncUrl(),
this.contactsSyncUser(), ContactUserStore.syncUser(),
this.contactsSyncPass() ContactUserStore.syncPass()
].join('|') ].join('|')
) )
.extend({ debounce: 500 }); .extend({ debounce: 500 });
@ -36,10 +36,10 @@ export class ContactsUserSettings {
this.saveTrigger.subscribe(() => { this.saveTrigger.subscribe(() => {
Remote.saveContactsSyncData( Remote.saveContactsSyncData(
null, null,
this.enableContactsSync(), ContactUserStore.enableSync(),
this.contactsSyncUrl(), ContactUserStore.syncUrl(),
this.contactsSyncUser(), ContactUserStore.syncUser(),
this.contactsSyncPass() ContactUserStore.syncPass()
); );
}); });
} }

View file

@ -8,7 +8,7 @@ import { removeFolderFromCacheList } from 'Common/Cache';
import * as Local from 'Storage/Client'; import * as Local from 'Storage/Client';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -19,16 +19,16 @@ import { FolderSystemPopupView } from 'View/Popup/FolderSystem';
export class FoldersUserSettings { export class FoldersUserSettings {
constructor() { constructor() {
this.displaySpecSetting = FolderStore.displaySpecSetting; this.displaySpecSetting = FolderUserStore.displaySpecSetting;
this.folderList = FolderStore.folderList; this.folderList = FolderUserStore.folderList;
this.folderListOptimized = FolderStore.folderListOptimized; this.folderListOptimized = FolderUserStore.folderListOptimized;
this.folderListError = FolderStore.folderListError; this.folderListError = FolderUserStore.folderListError;
this.loading = ko.computed(() => { this.loading = ko.computed(() => {
const loading = FolderStore.foldersLoading(), const loading = FolderUserStore.foldersLoading(),
creating = FolderStore.foldersCreating(), creating = FolderUserStore.foldersCreating(),
deleting = FolderStore.foldersDeleting(), deleting = FolderUserStore.foldersDeleting(),
renaming = FolderStore.foldersRenaming(); renaming = FolderUserStore.foldersRenaming();
return loading || creating || deleting || renaming; return loading || creating || deleting || renaming;
}); });
@ -64,7 +64,7 @@ export class FoldersUserSettings {
} }
onShow() { onShow() {
FolderStore.folderListError(''); FolderUserStore.folderListError('');
} }
/* /*
onBuild(oDom) { onBuild(oDom) {
@ -98,7 +98,7 @@ export class FoldersUserSettings {
Local.set(ClientSideKeyName.FoldersLashHash, ''); Local.set(ClientSideKeyName.FoldersLashHash, '');
FolderStore.folderList.remove(fRemoveFolder); FolderUserStore.folderList.remove(fRemoveFolder);
rl.app.foldersPromisesActionHelper( rl.app.foldersPromisesActionHelper(
Remote.folderDelete(folderToRemove.fullNameRaw), Remote.folderDelete(folderToRemove.fullNameRaw),
@ -108,7 +108,7 @@ export class FoldersUserSettings {
removeFolderFromCacheList(folderToRemove.fullNameRaw); removeFolderFromCacheList(folderToRemove.fullNameRaw);
} }
} else if (0 < folderToRemove.privateMessageCountAll()) { } else if (0 < folderToRemove.privateMessageCountAll()) {
FolderStore.folderListError(getNotification(Notification.CantDeleteNonEmptyFolder)); FolderUserStore.folderListError(getNotification(Notification.CantDeleteNonEmptyFolder));
} }
} }

View file

@ -9,12 +9,12 @@ import { i18n, trigger as translatorTrigger, reload as translatorReload, convert
import { showScreenPopup } from 'Knoin/Knoin'; import { showScreenPopup } from 'Knoin/Knoin';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import { LanguageStore } from 'Stores/Language'; import { LanguageStore } from 'Stores/Language';
import SettingsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import { IdentityUserStore } from 'Stores/User/Identity'; import { IdentityUserStore } from 'Stores/User/Identity';
import NotificationStore from 'Stores/User/Notification'; import { NotificationUserStore } from 'Stores/User/Notification';
import MessageStore from 'Stores/User/Message'; import { MessageUserStore } from 'Stores/User/Message';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -25,23 +25,23 @@ export class GeneralUserSettings {
constructor() { constructor() {
this.language = LanguageStore.language; this.language = LanguageStore.language;
this.languages = LanguageStore.languages; this.languages = LanguageStore.languages;
this.messagesPerPage = SettingsStore.messagesPerPage; this.messagesPerPage = SettingsUserStore.messagesPerPage;
this.messagesPerPageArray = MESSAGES_PER_PAGE_VALUES; this.messagesPerPageArray = MESSAGES_PER_PAGE_VALUES;
this.editorDefaultType = SettingsStore.editorDefaultType; this.editorDefaultType = SettingsUserStore.editorDefaultType;
this.layout = SettingsStore.layout; this.layout = SettingsUserStore.layout;
this.enableSoundNotification = NotificationStore.enableSoundNotification; this.enableSoundNotification = NotificationUserStore.enableSoundNotification;
this.enableDesktopNotification = NotificationStore.enableDesktopNotification; this.enableDesktopNotification = NotificationUserStore.enableDesktopNotification;
this.isDesktopNotificationDenied = NotificationStore.isDesktopNotificationDenied; this.isDesktopNotificationDenied = NotificationUserStore.isDesktopNotificationDenied;
this.showImages = SettingsStore.showImages; this.showImages = SettingsUserStore.showImages;
this.removeColors = SettingsStore.removeColors; this.removeColors = SettingsUserStore.removeColors;
this.useCheckboxesInList = SettingsStore.useCheckboxesInList; this.useCheckboxesInList = SettingsUserStore.useCheckboxesInList;
this.threadsAllowed = AppStore.threadsAllowed; this.threadsAllowed = AppUserStore.threadsAllowed;
this.useThreads = SettingsStore.useThreads; this.useThreads = SettingsUserStore.useThreads;
this.replySameFolder = SettingsStore.replySameFolder; this.replySameFolder = SettingsUserStore.replySameFolder;
this.allowLanguagesOnSettings = !!SettingsGet('AllowLanguagesOnSettings'); this.allowLanguagesOnSettings = !!SettingsGet('AllowLanguagesOnSettings');
this.languageFullName = ko.computed(() => convertLangName(this.language())); this.languageFullName = ko.computed(() => convertLangName(this.language()));
@ -93,11 +93,11 @@ export class GeneralUserSettings {
} }
testSoundNotification() { testSoundNotification() {
NotificationStore.playSoundNotification(true); NotificationUserStore.playSoundNotification(true);
} }
testSystemNotification() { testSystemNotification() {
NotificationStore.displayDesktopNotification('SnappyMail', 'Test notification', { }); NotificationUserStore.displayDesktopNotification('SnappyMail', 'Test notification', { });
} }
onBuild() { onBuild() {
@ -147,14 +147,14 @@ export class GeneralUserSettings {
).debounce(3000)); ).debounce(3000));
this.useThreads.subscribe((value) => { this.useThreads.subscribe((value) => {
MessageStore.messageList([]); MessageUserStore.messageList([]);
Remote.saveSettings(null, { Remote.saveSettings(null, {
'UseThreads': value ? 1 : 0 'UseThreads': value ? 1 : 0
}); });
}); });
this.layout.subscribe((value) => { this.layout.subscribe((value) => {
MessageStore.messageList([]); MessageUserStore.messageList([]);
Remote.saveSettings(f2, { Remote.saveSettings(f2, {
'Layout': value 'Layout': value
}); });

View file

@ -2,8 +2,8 @@ import ko from 'ko';
import { delegateRunOnDestroy } from 'Common/UtilsUser'; import { delegateRunOnDestroy } from 'Common/UtilsUser';
import PgpStore from 'Stores/User/Pgp'; import { PgpUserStore } from 'Stores/User/Pgp';
import SettingsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -15,13 +15,13 @@ import { ViewOpenPgpKeyPopupView } from 'View/Popup/ViewOpenPgpKey';
export class OpenPgpUserSettings { export class OpenPgpUserSettings {
constructor() { constructor() {
this.openpgpkeys = PgpStore.openpgpkeys; this.openpgpkeys = PgpUserStore.openpgpkeys;
this.openpgpkeysPublic = PgpStore.openpgpkeysPublic; this.openpgpkeysPublic = PgpUserStore.openpgpkeysPublic;
this.openpgpkeysPrivate = PgpStore.openpgpkeysPrivate; this.openpgpkeysPrivate = PgpUserStore.openpgpkeysPrivate;
this.openPgpKeyForDeletion = ko.observable(null).deleteAccessHelper(); this.openPgpKeyForDeletion = ko.observable(null).deleteAccessHelper();
this.allowDraftAutosave = SettingsStore.allowDraftAutosave; this.allowDraftAutosave = SettingsUserStore.allowDraftAutosave;
} }
addOpenPgpKey() { addOpenPgpKey() {
@ -46,15 +46,15 @@ export class OpenPgpUserSettings {
if (openPgpKeyToRemove && openPgpKeyToRemove.deleteAccess()) { if (openPgpKeyToRemove && openPgpKeyToRemove.deleteAccess()) {
this.openPgpKeyForDeletion(null); this.openPgpKeyForDeletion(null);
if (openPgpKeyToRemove && PgpStore.openpgpKeyring) { if (openPgpKeyToRemove && PgpUserStore.openpgpKeyring) {
const findedItem = PgpStore.openpgpkeys.find(key => openPgpKeyToRemove === key); const findedItem = PgpUserStore.openpgpkeys.find(key => openPgpKeyToRemove === key);
if (findedItem) { if (findedItem) {
PgpStore.openpgpkeys.remove(findedItem); PgpUserStore.openpgpkeys.remove(findedItem);
delegateRunOnDestroy(findedItem); delegateRunOnDestroy(findedItem);
PgpStore.openpgpKeyring[findedItem.isPrivate ? 'privateKeys' : 'publicKeys'].removeForId(findedItem.guid); PgpUserStore.openpgpKeyring[findedItem.isPrivate ? 'privateKeys' : 'publicKeys'].removeForId(findedItem.guid);
PgpStore.openpgpKeyring.store(); PgpUserStore.openpgpKeyring.store();
} }
rl.app.reloadOpenPgpKeys(); rl.app.reloadOpenPgpKeys();

View file

@ -7,7 +7,7 @@ import { i18n, trigger as translatorTrigger } from 'Common/Translator';
import { showScreenPopup } from 'Knoin/Knoin'; import { showScreenPopup } from 'Knoin/Knoin';
import SettinsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -18,7 +18,7 @@ export class SecurityUserSettings {
this.capaAutoLogout = Settings.capa(Capa.AutoLogout); this.capaAutoLogout = Settings.capa(Capa.AutoLogout);
this.capaTwoFactor = Settings.capa(Capa.TwoFactor); this.capaTwoFactor = Settings.capa(Capa.TwoFactor);
this.autoLogout = SettinsStore.autoLogout; this.autoLogout = SettingsUserStore.autoLogout;
this.autoLogout.trigger = ko.observable(SaveSettingsStep.Idle); this.autoLogout.trigger = ko.observable(SaveSettingsStep.Idle);
let i18nLogout = (key, params) => i18n('SETTINGS_SECURITY/AUTOLOGIN_' + key, params); let i18nLogout = (key, params) => i18n('SETTINGS_SECURITY/AUTOLOGIN_' + key, params);

View file

@ -2,7 +2,7 @@ import ko from 'ko';
import { i18n } from 'Common/Translator'; import { i18n } from 'Common/Translator';
import TemplateStore from 'Stores/User/Template'; import { TemplateUserStore } from 'Stores/User/Template';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
import { showScreenPopup } from 'Knoin/Knoin'; import { showScreenPopup } from 'Knoin/Knoin';
@ -11,10 +11,10 @@ import { TemplatePopupView } from 'View/Popup/Template';
export class TemplatesUserSettings { export class TemplatesUserSettings {
constructor() { constructor() {
this.templates = TemplateStore.templates; this.templates = TemplateUserStore.templates;
this.processText = ko.computed(() => this.processText = ko.computed(() =>
TemplateStore.templates.loading() ? i18n('SETTINGS_TEMPLETS/LOADING_PROCESS') : '' TemplateUserStore.templates.loading() ? i18n('SETTINGS_TEMPLETS/LOADING_PROCESS') : ''
); );
this.visibility = ko.computed(() => this.processText() ? 'visible' : 'hidden'); this.visibility = ko.computed(() => this.processText() ? 'visible' : 'hidden');

View file

@ -1,36 +1,31 @@
import ko from 'ko'; import ko from 'ko';
import { SettingsGet } from 'Common/Globals'; import { SettingsGet } from 'Common/Globals';
class AccountUserStore { export const AccountUserStore = {
constructor() { accounts: ko.observableArray(),
ko.addObservablesTo(this, { loading: ko.observable(false).extend({ debounce: 100 }),
email: '',
parentEmail: '',
signature: ''
});
this.accounts = ko.observableArray(); getEmailAddresses: () => AccountUserStore.accounts.map(item => item ? item.email : null).filter(v => v),
this.accounts.loading = ko.observable(false).extend({ debounce: 100 });
this.getEmailAddresses = () => this.accounts.map(item => item ? item.email : null).filter(v => v); accountsUnreadCount: ko.computed(() => 0),
// accountsUnreadCount: ko.computed(() => {
// let result = 0;
// AccountUserStore.accounts().forEach(item => {
// if (item) {
// result += item.count();
// }
// });
// return result;
// }),
this.accountsUnreadCount = ko.computed(() => 0); populate: () => {
// this.accountsUnreadCount = ko.computed(() => { AccountUserStore.email(SettingsGet('Email'));
// let result = 0; AccountUserStore.parentEmail(SettingsGet('ParentEmail'));
// this.accounts().forEach(item => {
// if (item)
// {
// result += item.count();
// }
// });
// return result;
// });
} }
};
populate() { ko.addObservablesTo(AccountUserStore, {
this.email(SettingsGet('Email')); email: '',
this.parentEmail(SettingsGet('ParentEmail')); parentEmail: '',
} signature: ''
} });
export default new AccountUserStore();

View file

@ -4,63 +4,59 @@ import { Focused } from 'Common/EnumsUser';
import { keyScope, leftPanelDisabled, Settings, SettingsGet } from 'Common/Globals'; import { keyScope, leftPanelDisabled, Settings, SettingsGet } from 'Common/Globals';
import { ThemeStore } from 'Stores/Theme'; import { ThemeStore } from 'Stores/Theme';
class AppUserStore { export const AppUserStore = {
constructor() { attachmentsActions: ko.observableArray(),
ko.addObservablesTo(this, {
currentAudio: '',
focusedState: Focused.None, devEmail: '',
devPassword: '',
projectHash: '', populate: () => {
threadsAllowed: false, AppUserStore.projectHash(SettingsGet('ProjectHash'));
composeInEdit: false, AppUserStore.contactsAutosave(!!SettingsGet('ContactsAutosave'));
AppUserStore.useLocalProxyForExternalImages(!!SettingsGet('UseLocalProxyForExternalImages'));
contactsAutosave: false, AppUserStore.contactsIsAllowed(!!SettingsGet('ContactsIsAllowed'));
useLocalProxyForExternalImages: false,
contactsIsAllowed: false
});
this.focusedState.subscribe(value => {
switch (value) {
case Focused.MessageList:
keyScope(KeyState.MessageList);
ThemeStore.isMobile() && leftPanelDisabled(true);
break;
case Focused.MessageView:
keyScope(KeyState.MessageView);
ThemeStore.isMobile() && leftPanelDisabled(true);
break;
case Focused.FolderList:
keyScope(KeyState.FolderList);
ThemeStore.isMobile() && leftPanelDisabled(false);
break;
default:
break;
}
});
this.attachmentsActions = ko.observableArray();
this.devEmail = '';
this.devPassword = '';
}
populate() {
this.projectHash(SettingsGet('ProjectHash'));
this.contactsAutosave(!!SettingsGet('ContactsAutosave'));
this.useLocalProxyForExternalImages(!!SettingsGet('UseLocalProxyForExternalImages'));
this.contactsIsAllowed(!!SettingsGet('ContactsIsAllowed'));
const attachmentsActions = Settings.app('attachmentsActions'); const attachmentsActions = Settings.app('attachmentsActions');
this.attachmentsActions(Array.isNotEmpty(attachmentsActions) ? attachmentsActions : []); AppUserStore.attachmentsActions(Array.isNotEmpty(attachmentsActions) ? attachmentsActions : []);
this.devEmail = SettingsGet('DevEmail'); AppUserStore.devEmail = SettingsGet('DevEmail');
this.devPassword = SettingsGet('DevPassword'); AppUserStore.devPassword = SettingsGet('DevPassword');
} }
} };
export default new AppUserStore(); ko.addObservablesTo(AppUserStore, {
currentAudio: '',
focusedState: Focused.None,
projectHash: '',
threadsAllowed: false,
composeInEdit: false,
contactsAutosave: false,
useLocalProxyForExternalImages: false,
contactsIsAllowed: false
});
AppUserStore.focusedState.subscribe(value => {
switch (value) {
case Focused.MessageList:
keyScope(KeyState.MessageList);
ThemeStore.isMobile() && leftPanelDisabled(true);
break;
case Focused.MessageView:
keyScope(KeyState.MessageView);
ThemeStore.isMobile() && leftPanelDisabled(true);
break;
case Focused.FolderList:
keyScope(KeyState.FolderList);
ThemeStore.isMobile() && leftPanelDisabled(false);
break;
default:
break;
}
});

View file

@ -1,32 +1,25 @@
import ko from 'ko'; import ko from 'ko';
import { SettingsGet } from 'Common/Globals'; import { SettingsGet } from 'Common/Globals';
class ContactUserStore { export const ContactUserStore = ko.observableArray();
constructor() {
this.contacts = ko.observableArray();
this.contacts.loading = ko.observable(false).extend({ debounce: 200 });
this.contacts.importing = ko.observable(false).extend({ debounce: 200 });
this.contacts.syncing = ko.observable(false).extend({ debounce: 200 });
this.contacts.exportingVcf = ko.observable(false).extend({ debounce: 200 });
this.contacts.exportingCsv = ko.observable(false).extend({ debounce: 200 });
ko.addObservablesTo(this, { ContactUserStore.loading = ko.observable(false).extend({ debounce: 200 });
allowContactsSync: false, ContactUserStore.importing = ko.observable(false).extend({ debounce: 200 });
enableContactsSync: false, ContactUserStore.syncing = ko.observable(false).extend({ debounce: 200 });
contactsSyncUrl: '',
contactsSyncUser: '',
contactsSyncPass: ''
});
}
populate() { ko.addObservablesTo(ContactUserStore, {
this.allowContactsSync(!!SettingsGet('ContactsSyncIsAllowed')); allowSync: false,
this.enableContactsSync(!!SettingsGet('EnableContactsSync')); enableSync: false,
syncUrl: '',
syncUser: '',
syncPass: ''
});
this.contactsSyncUrl(SettingsGet('ContactsSyncUrl')); ContactUserStore.populate = function() {
this.contactsSyncUser(SettingsGet('ContactsSyncUser')); this.allowSync(!!SettingsGet('ContactsSyncIsAllowed'));
this.contactsSyncPass(SettingsGet('ContactsSyncPassword')); this.enableSync(!!SettingsGet('EnableContactsSync'));
}
}
export default new ContactUserStore(); this.syncUrl(SettingsGet('ContactsSyncUrl'));
this.syncUser(SettingsGet('ContactsSyncUser'));
this.syncPass(SettingsGet('ContactsSyncPassword'));
};

View file

@ -6,7 +6,7 @@ import { folderListOptionsBuilder } from 'Common/UtilsUser';
import { getFolderInboxName, getFolderFromCacheList } from 'Common/Cache'; import { getFolderInboxName, getFolderFromCacheList } from 'Common/Cache';
import { SettingsGet } from 'Common/Globals'; import { SettingsGet } from 'Common/Globals';
class FolderUserStore { export const FolderUserStore = new class {
constructor() { constructor() {
ko.addObservablesTo(this, { ko.addObservablesTo(this, {
/** /**
@ -124,10 +124,6 @@ class FolderUserStore {
) )
); );
this.subscribers();
}
subscribers() {
const fRemoveSystemFolderType = (observable) => () => { const fRemoveSystemFolderType = (observable) => () => {
const folder = getFolderFromCacheList(observable()); const folder = getFolderFromCacheList(observable());
if (folder) { if (folder) {
@ -200,6 +196,4 @@ class FolderUserStore {
return result.filter((value, index, self) => self.indexOf(value) == index); return result.filter((value, index, self) => self.indexOf(value) == index);
} }
} };
export default new FolderUserStore();

View file

@ -24,12 +24,12 @@ import { EmailCollectionModel } from 'Model/EmailCollection';
import { MessageModel } from 'Model/Message'; import { MessageModel } from 'Model/Message';
import { MessageCollectionModel } from 'Model/MessageCollection'; import { MessageCollectionModel } from 'Model/MessageCollection';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import AccountStore from 'Stores/User/Account'; import { AccountUserStore } from 'Stores/User/Account';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import PgpStore from 'Stores/User/Pgp'; import { PgpUserStore } from 'Stores/User/Pgp';
import SettingsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import NotificationStore from 'Stores/User/Notification'; import { NotificationUserStore } from 'Stores/User/Notification';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -66,7 +66,7 @@ const
doc.body.append(hcont); doc.body.append(hcont);
class MessageUserStore { export const MessageUserStore = new class {
constructor() { constructor() {
this.staticMessage = new MessageModel(); this.staticMessage = new MessageModel();
@ -128,7 +128,7 @@ class MessageUserStore {
); );
this.messageListPageCount = ko.computed(() => { this.messageListPageCount = ko.computed(() => {
const page = Math.ceil(this.messageListCount() / SettingsStore.messagesPerPage()); const page = Math.ceil(this.messageListCount() / SettingsUserStore.messagesPerPage());
return 0 >= page ? 1 : page; return 0 >= page ? 1 : page;
}); });
@ -136,7 +136,7 @@ class MessageUserStore {
read: this.messageListSearch, read: this.messageListSearch,
write: (value) => { write: (value) => {
rl.route.setHash( rl.route.setHash(
mailBox(FolderStore.currentFolderFullNameHash(), 1, value.toString().trim(), this.messageListThreadUid()) mailBox(FolderUserStore.currentFolderFullNameHash(), 1, value.toString().trim(), this.messageListThreadUid())
); );
} }
}); });
@ -226,11 +226,11 @@ class MessageUserStore {
this.message.subscribe(message => { this.message.subscribe(message => {
if (message) { if (message) {
if (!SettingsStore.usePreviewPane()) { if (!SettingsUserStore.usePreviewPane()) {
AppStore.focusedState(Focused.MessageView); AppUserStore.focusedState(Focused.MessageView);
} }
} else { } else {
AppStore.focusedState(Focused.MessageList); AppUserStore.focusedState(Focused.MessageList);
this.messageFullScreenMode(false); this.messageFullScreenMode(false);
this.hideMessageBodies(); this.hideMessageBodies();
@ -262,12 +262,12 @@ class MessageUserStore {
if (Array.isNotEmpty(newMessages)) { if (Array.isNotEmpty(newMessages)) {
newMessages.forEach(item => addNewMessageCache(folder, item.Uid)); newMessages.forEach(item => addNewMessageCache(folder, item.Uid));
NotificationStore.playSoundNotification(); NotificationUserStore.playSoundNotification();
const len = newMessages.length; const len = newMessages.length;
if (3 < len) { if (3 < len) {
NotificationStore.displayDesktopNotification( NotificationUserStore.displayDesktopNotification(
AccountStore.email(), AccountUserStore.email(),
i18n('MESSAGE_LIST/NEW_MESSAGE_NOTIFICATION', { i18n('MESSAGE_LIST/NEW_MESSAGE_NOTIFICATION', {
'COUNT': len 'COUNT': len
}), }),
@ -275,7 +275,7 @@ class MessageUserStore {
); );
} else { } else {
newMessages.forEach(item => { newMessages.forEach(item => {
NotificationStore.displayDesktopNotification( NotificationUserStore.displayDesktopNotification(
EmailCollectionModel.reviveFromJson(item.From).toString(), EmailCollectionModel.reviveFromJson(item.From).toString(),
item.Subject, item.Subject,
{ 'Folder': item.Folder, 'Uid': item.Uid } { 'Folder': item.Folder, 'Uid': item.Uid }
@ -306,11 +306,11 @@ class MessageUserStore {
messageList = this.messageList, messageList = this.messageList,
currentMessage = this.message(); currentMessage = this.message();
const trashFolder = FolderStore.trashFolder(), const trashFolder = FolderUserStore.trashFolder(),
spamFolder = FolderStore.spamFolder(), spamFolder = FolderUserStore.spamFolder(),
fromFolder = getFolderFromCacheList(fromFolderFullNameRaw), fromFolder = getFolderFromCacheList(fromFolderFullNameRaw),
toFolder = toFolderFullNameRaw ? getFolderFromCacheList(toFolderFullNameRaw) : null, toFolder = toFolderFullNameRaw ? getFolderFromCacheList(toFolderFullNameRaw) : null,
currentFolderFullNameRaw = FolderStore.currentFolderFullNameRaw(), currentFolderFullNameRaw = FolderUserStore.currentFolderFullNameRaw(),
messages = messages =
currentFolderFullNameRaw === fromFolderFullNameRaw currentFolderFullNameRaw === fromFolderFullNameRaw
? messageList.filter(item => item && uidForRemove.includes(pInt(item.uid))) ? messageList.filter(item => item && uidForRemove.includes(pInt(item.uid)))
@ -391,7 +391,7 @@ class MessageUserStore {
rl.route.setHash( rl.route.setHash(
mailBox( mailBox(
FolderStore.currentFolderFullNameHash(), FolderUserStore.currentFolderFullNameHash(),
this.messageListPage(), this.messageListPage(),
this.messageListSearch(), this.messageListSearch(),
this.messageListThreadUid() this.messageListThreadUid()
@ -405,7 +405,7 @@ class MessageUserStore {
rl.route.setHash( rl.route.setHash(
mailBox( mailBox(
FolderStore.currentFolderFullNameHash(), FolderUserStore.currentFolderFullNameHash(),
this.messageListPage(), this.messageListPage(),
this.messageListSearch(), this.messageListSearch(),
this.messageListThreadUid() this.messageListThreadUid()
@ -418,7 +418,7 @@ class MessageUserStore {
rl.route.setHash( rl.route.setHash(
mailBox( mailBox(
FolderStore.currentFolderFullNameHash(), FolderUserStore.currentFolderFullNameHash(),
this.messageListPageBeforeThread(), this.messageListPageBeforeThread(),
this.messageListSearch() this.messageListSearch()
), ),
@ -454,7 +454,7 @@ class MessageUserStore {
*/ */
initOpenPgpControls(messageTextBody, message) { initOpenPgpControls(messageTextBody, message) {
messageTextBody && messageTextBody.querySelectorAll('.b-plain-openpgp:not(.inited)').forEach(node => messageTextBody && messageTextBody.querySelectorAll('.b-plain-openpgp:not(.inited)').forEach(node =>
PgpStore.initMessageBodyControls(node, message) PgpUserStore.initMessageBodyControls(node, message)
); );
} }
@ -517,13 +517,13 @@ class MessageUserStore {
let isHtml = !!json.Html; let isHtml = !!json.Html;
if (isHtml) { if (isHtml) {
resultHtml = json.Html.toString(); resultHtml = json.Html.toString();
if (SettingsStore.removeColors()) { if (SettingsUserStore.removeColors()) {
resultHtml = removeColors(resultHtml); resultHtml = removeColors(resultHtml);
} }
} else if (json.Plain) { } else if (json.Plain) {
resultHtml = plainToHtml(json.Plain.toString()); resultHtml = plainToHtml(json.Plain.toString());
if ((message.isPgpSigned() || message.isPgpEncrypted()) && PgpStore.capaOpenPGP()) { if ((message.isPgpSigned() || message.isPgpEncrypted()) && PgpUserStore.capaOpenPGP()) {
plain = pString(json.Plain); plain = pString(json.Plain);
const isPgpEncrypted = /---BEGIN PGP MESSAGE---/.test(plain); const isPgpEncrypted = /---BEGIN PGP MESSAGE---/.test(plain);
@ -578,7 +578,7 @@ class MessageUserStore {
message.showInternalImages(); message.showInternalImages();
} }
if (message.hasImages() && SettingsStore.showImages()) { if (message.hasImages() && SettingsUserStore.showImages()) {
message.showExternalImages(); message.showExternalImages();
} }
@ -725,7 +725,7 @@ class MessageUserStore {
this.messageListCount(iCount); this.messageListCount(iCount);
this.messageListSearch(pString(collection.Search)); this.messageListSearch(pString(collection.Search));
this.messageListPage(Math.ceil(iOffset / SettingsStore.messagesPerPage() + 1)); this.messageListPage(Math.ceil(iOffset / SettingsUserStore.messagesPerPage() + 1));
this.messageListThreadUid(pString(data.Result.ThreadUid)); this.messageListThreadUid(pString(data.Result.ThreadUid));
this.messageListEndFolder(collection.Folder); this.messageListEndFolder(collection.Folder);
@ -740,7 +740,7 @@ class MessageUserStore {
clearNewMessageCache(); clearNewMessageCache();
if (folder && (cached || unreadCountChange || SettingsStore.useThreads())) { if (folder && (cached || unreadCountChange || SettingsUserStore.useThreads())) {
rl.app.folderInformation(folder.fullNameRaw, collection); rl.app.folderInformation(folder.fullNameRaw, collection);
} }
} else { } else {
@ -749,6 +749,4 @@ class MessageUserStore {
this.messageListError(getNotification(data && data.ErrorCode ? data.ErrorCode : Notification.CantGetMessageList)); this.messageListError(getNotification(data && data.ErrorCode ? data.ErrorCode : Notification.CantGetMessageList));
} }
} }
} };
export default new MessageUserStore();

View file

@ -1,6 +1,6 @@
import ko from 'ko'; import ko from 'ko';
import Audio from 'Common/Audio'; import { SMAudio } from 'Common/Audio';
import { SettingsGet } from 'Common/Globals'; import { SettingsGet } from 'Common/Globals';
import * as Links from 'Common/Links'; import * as Links from 'Common/Links';
@ -35,7 +35,7 @@ if (WorkerNotifications && ServiceWorkerRegistration && ServiceWorkerRegistratio
console.log('ServiceWorker Notifications not supported'); console.log('ServiceWorker Notifications not supported');
} }
class NotificationUserStore { export const NotificationUserStore = new class {
constructor() { constructor() {
this.enableSoundNotification = ko.observable(false); this.enableSoundNotification = ko.observable(false);
@ -58,7 +58,7 @@ class NotificationUserStore {
*/ */
playSoundNotification(skipSetting) { playSoundNotification(skipSetting) {
if (skipSetting ? true : this.enableSoundNotification()) { if (skipSetting ? true : this.enableSoundNotification()) {
Audio.playNotification(); SMAudio.playNotification();
} }
} }
@ -106,6 +106,4 @@ class NotificationUserStore {
this.enableSoundNotification(!!SettingsGet('SoundNotification')); this.enableSoundNotification(!!SettingsGet('SoundNotification'));
this.enableDesktopNotification(!!SettingsGet('DesktopNotifications')); this.enableDesktopNotification(!!SettingsGet('DesktopNotifications'));
} }
} };
export default new NotificationUserStore();

View file

@ -4,7 +4,7 @@ import { i18n } from 'Common/Translator';
import { pString } from 'Common/Utils'; import { pString } from 'Common/Utils';
import { doc } from 'Common/Globals'; import { doc } from 'Common/Globals';
import AccountStore from 'Stores/User/Account'; import { AccountUserStore } from 'Stores/User/Account';
import { showScreenPopup } from 'Knoin/Knoin'; import { showScreenPopup } from 'Knoin/Knoin';
@ -132,7 +132,7 @@ function domControlSignedClickHelper(store, dom, armoredMessage) {
}; };
} }
class PgpUserStore { export const PgpUserStore = new class {
constructor() { constructor() {
this.capaOpenPGP = ko.observable(false); this.capaOpenPGP = ko.observable(false);
@ -260,7 +260,7 @@ class PgpUserStore {
* @returns {?} * @returns {?}
*/ */
findSelfPrivateKey(password) { findSelfPrivateKey(password) {
return this.findPrivateKeyByEmail(AccountStore.email(), password); return this.findPrivateKeyByEmail(AccountUserStore.email(), password);
} }
decryptMessage(message, recipients, fCallback) { decryptMessage(message, recipients, fCallback) {
@ -365,6 +365,4 @@ class PgpUserStore {
} }
} }
} }
} };
export default new PgpUserStore();

View file

@ -1,6 +1,6 @@
import ko from 'ko'; import ko from 'ko';
class QuotaUserStore { export const QuotaUserStore = new class {
constructor() { constructor() {
this.quota = ko.observable(0); this.quota = ko.observable(0);
this.usage = ko.observable(0); this.usage = ko.observable(0);
@ -21,6 +21,4 @@ class QuotaUserStore {
this.quota(quota * 1024); this.quota(quota * 1024);
this.usage(usage * 1024); this.usage(usage * 1024);
} }
} };
export default new QuotaUserStore();

View file

@ -6,7 +6,7 @@ import { pInt } from 'Common/Utils';
import { $htmlCL, SettingsGet } from 'Common/Globals'; import { $htmlCL, SettingsGet } from 'Common/Globals';
import { ThemeStore } from 'Stores/Theme'; import { ThemeStore } from 'Stores/Theme';
class SettingsUserStore { export const SettingsUserStore = new class {
constructor() { constructor() {
this.layout = ko this.layout = ko
.observable(Layout.SidePreview) .observable(Layout.SidePreview)
@ -36,7 +36,12 @@ class SettingsUserStore {
this.usePreviewPane = ko.computed(() => Layout.NoPreview !== this.layout() && !ThemeStore.isMobile()); this.usePreviewPane = ko.computed(() => Layout.NoPreview !== this.layout() && !ThemeStore.isMobile());
this.subscribers(); this.layout.subscribe(value => {
$htmlCL.toggle('rl-no-preview-pane', Layout.NoPreview === value);
$htmlCL.toggle('rl-side-preview-pane', Layout.SidePreview === value);
$htmlCL.toggle('rl-bottom-preview-pane', Layout.BottomPreview === value);
dispatchEvent(new CustomEvent('rl-layout', {detail:value}));
});
let iAutoLogoutTimer; let iAutoLogoutTimer;
this.delayLogout = (() => { this.delayLogout = (() => {
@ -50,15 +55,6 @@ class SettingsUserStore {
}).throttle(5000); }).throttle(5000);
} }
subscribers() {
this.layout.subscribe(value => {
$htmlCL.toggle('rl-no-preview-pane', Layout.NoPreview === value);
$htmlCL.toggle('rl-side-preview-pane', Layout.SidePreview === value);
$htmlCL.toggle('rl-bottom-preview-pane', Layout.BottomPreview === value);
dispatchEvent(new CustomEvent('rl-layout', {detail:value}));
});
}
populate() { populate() {
this.layout(pInt(SettingsGet('Layout'))); this.layout(pInt(SettingsGet('Layout')));
this.editorDefaultType(SettingsGet('EditorDefaultType')); this.editorDefaultType(SettingsGet('EditorDefaultType'));
@ -75,6 +71,4 @@ class SettingsUserStore {
this.delayLogout(); this.delayLogout();
} }
} };
export default new SettingsUserStore();

View file

@ -2,7 +2,7 @@ import ko from 'ko';
// import Remote from 'Remote/User/Fetch'; // import Remote from 'Remote/User/Fetch';
class TemplateUserStore { export const TemplateUserStore = new class {
constructor() { constructor() {
this.templates = ko.observableArray(); this.templates = ko.observableArray();
this.templates.loading = ko.observable(false).extend({ debounce: 100 }); this.templates.loading = ko.observable(false).extend({ debounce: 100 });
@ -29,6 +29,4 @@ class TemplateUserStore {
// } // }
// }); // });
} }
} };
export default new TemplateUserStore();

View file

@ -1,4 +1,4 @@
import PgpStore from 'Stores/User/Pgp'; import { PgpUserStore } from 'Stores/User/Pgp';
import { decorateKoCommands } from 'Knoin/Knoin'; import { decorateKoCommands } from 'Knoin/Knoin';
import { AbstractViewPopup } from 'Knoin/AbstractViews'; import { AbstractViewPopup } from 'Knoin/AbstractViews';
@ -26,7 +26,7 @@ class AddOpenPgpKeyPopupView extends AbstractViewPopup {
addOpenPgpKeyCommand() { addOpenPgpKeyCommand() {
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
const reg = /[-]{3,6}BEGIN[\s]PGP[\s](PRIVATE|PUBLIC)[\s]KEY[\s]BLOCK[-]{3,6}[\s\S]+?[-]{3,6}END[\s]PGP[\s](PRIVATE|PUBLIC)[\s]KEY[\s]BLOCK[-]{3,6}/gi, const reg = /[-]{3,6}BEGIN[\s]PGP[\s](PRIVATE|PUBLIC)[\s]KEY[\s]BLOCK[-]{3,6}[\s\S]+?[-]{3,6}END[\s]PGP[\s](PRIVATE|PUBLIC)[\s]KEY[\s]BLOCK[-]{3,6}/gi,
openpgpKeyring = PgpStore.openpgpKeyring; openpgpKeyring = PgpUserStore.openpgpKeyring;
let keyTrimmed = this.key().trim(); let keyTrimmed = this.key().trim();

View file

@ -2,7 +2,7 @@ import ko from 'ko';
import { i18n, trigger as translatorTrigger } from 'Common/Translator'; import { i18n, trigger as translatorTrigger } from 'Common/Translator';
import MessageStore from 'Stores/User/Message'; import { MessageUserStore } from 'Stores/User/Message';
import { decorateKoCommands } from 'Knoin/Knoin'; import { decorateKoCommands } from 'Knoin/Knoin';
import { AbstractViewPopup } from 'Knoin/AbstractViews'; import { AbstractViewPopup } from 'Knoin/AbstractViews';
@ -47,7 +47,7 @@ class AdvancedSearchPopupView extends AbstractViewPopup {
searchCommand() { searchCommand() {
const search = this.buildSearchString(); const search = this.buildSearchString();
if (search) { if (search) {
MessageStore.mainMessageListSearch(search); MessageUserStore.mainMessageListSearch(search);
} }
this.cancelCommand(); this.cancelCommand();

View file

@ -24,13 +24,13 @@ import { timestampToString } from 'Common/Momentor';
import { MessageFlagsCache, setFolderHash } from 'Common/Cache'; import { MessageFlagsCache, setFolderHash } from 'Common/Cache';
import { Settings, SettingsGet } from 'Common/Globals'; import { Settings, SettingsGet } from 'Common/Globals';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import SettingsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import { IdentityUserStore } from 'Stores/User/Identity'; import { IdentityUserStore } from 'Stores/User/Identity';
import AccountStore from 'Stores/User/Account'; import { AccountUserStore } from 'Stores/User/Account';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import PgpStore from 'Stores/User/Pgp'; import { PgpUserStore } from 'Stores/User/Pgp';
import MessageStore from 'Stores/User/Message'; import { MessageUserStore } from 'Stores/User/Message';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -126,13 +126,13 @@ class ComposePopupView extends AbstractViewPopup {
this.sLastFocusedField = 'to'; this.sLastFocusedField = 'to';
this.allowContacts = !!AppStore.contactsIsAllowed(); this.allowContacts = !!AppUserStore.contactsIsAllowed();
this.bSkipNextHide = false; this.bSkipNextHide = false;
this.composeInEdit = AppStore.composeInEdit; this.composeInEdit = AppUserStore.composeInEdit;
this.editorDefaultType = SettingsStore.editorDefaultType; this.editorDefaultType = SettingsUserStore.editorDefaultType;
this.capaOpenPGP = PgpStore.capaOpenPGP; this.capaOpenPGP = PgpUserStore.capaOpenPGP;
this.identities = IdentityUserStore; this.identities = IdentityUserStore;
@ -319,8 +319,8 @@ class ComposePopupView extends AbstractViewPopup {
setInterval(() => { setInterval(() => {
if ( if (
this.modalVisibility() && this.modalVisibility() &&
!FolderStore.draftFolderNotEnabled() && !FolderUserStore.draftFolderNotEnabled() &&
SettingsStore.allowDraftAutosave() && SettingsUserStore.allowDraftAutosave() &&
!this.isEmptyForm(false) && !this.isEmptyForm(false) &&
!this.saving() && !this.saving() &&
!this.sending() && !this.sending() &&
@ -365,7 +365,7 @@ class ComposePopupView extends AbstractViewPopup {
} }
sendCommand() { sendCommand() {
let sSentFolder = FolderStore.sentFolder(); let sSentFolder = FolderUserStore.sentFolder();
this.attachmentsInProcessError(false); this.attachmentsInProcessError(false);
this.attachmentsInErrorError(false); this.attachmentsInErrorError(false);
@ -384,7 +384,7 @@ class ComposePopupView extends AbstractViewPopup {
} }
if (!this.emptyToError() && !this.attachmentsInErrorError() && !this.attachmentsInProcessError()) { if (!this.emptyToError() && !this.attachmentsInErrorError() && !this.attachmentsInProcessError()) {
if (SettingsStore.replySameFolder()) { if (SettingsUserStore.replySameFolder()) {
if ( if (
isArray(this.aDraftInfo) && isArray(this.aDraftInfo) &&
3 === this.aDraftInfo.length && 3 === this.aDraftInfo.length &&
@ -430,7 +430,7 @@ class ComposePopupView extends AbstractViewPopup {
} }
saveCommand() { saveCommand() {
if (FolderStore.draftFolderNotEnabled()) { if (FolderUserStore.draftFolderNotEnabled()) {
showScreenPopup(FolderSystemPopupView, [SetSystemFoldersNotification.Draft]); showScreenPopup(FolderSystemPopupView, [SetSystemFoldersNotification.Draft]);
} else { } else {
this.savedError(false); this.savedError(false);
@ -438,11 +438,11 @@ class ComposePopupView extends AbstractViewPopup {
this.autosaveStart(); this.autosaveStart();
setFolderHash(FolderStore.draftFolder(), ''); setFolderHash(FolderUserStore.draftFolder(), '');
Remote.saveMessage( Remote.saveMessage(
this.saveMessageResponse.bind(this), this.saveMessageResponse.bind(this),
this.getMessageRequestParams(FolderStore.draftFolder()) this.getMessageRequestParams(FolderUserStore.draftFolder())
); );
} }
@ -470,8 +470,8 @@ class ComposePopupView extends AbstractViewPopup {
this.modalVisibility() && this.modalVisibility() &&
!this.saving() && !this.saving() &&
!this.sending() && !this.sending() &&
!FolderStore.draftFolderNotEnabled() && !FolderUserStore.draftFolderNotEnabled() &&
SettingsStore.allowDraftAutosave() SettingsUserStore.allowDraftAutosave()
) { ) {
this.saveCommand(); this.saveCommand();
} }
@ -491,8 +491,8 @@ class ComposePopupView extends AbstractViewPopup {
autosaveFunction() { autosaveFunction() {
if ( if (
this.modalVisibility() && this.modalVisibility() &&
!FolderStore.draftFolderNotEnabled() && !FolderUserStore.draftFolderNotEnabled() &&
SettingsStore.allowDraftAutosave() && SettingsUserStore.allowDraftAutosave() &&
!this.isEmptyForm(false) && !this.isEmptyForm(false) &&
!this.saving() && !this.saving() &&
!this.sending() && !this.sending() &&
@ -518,7 +518,7 @@ class ComposePopupView extends AbstractViewPopup {
} }
openOpenPgpPopup() { openOpenPgpPopup() {
if (PgpStore.capaOpenPGP() && this.oEditor && !this.oEditor.isHtml()) { if (PgpUserStore.capaOpenPGP() && this.oEditor && !this.oEditor.isHtml()) {
showScreenPopup(ComposeOpenPgpPopupView, [ showScreenPopup(ComposeOpenPgpPopupView, [
result => this.editor(editor => editor.setPlain(result)), result => this.editor(editor => editor.setPlain(result)),
this.oEditor.getData(false), this.oEditor.getData(false),
@ -531,10 +531,10 @@ class ComposePopupView extends AbstractViewPopup {
} }
reloadDraftFolder() { reloadDraftFolder() {
const draftFolder = FolderStore.draftFolder(); const draftFolder = FolderUserStore.draftFolder();
if (draftFolder && UNUSED_OPTION_VALUE !== draftFolder) { if (draftFolder && UNUSED_OPTION_VALUE !== draftFolder) {
setFolderHash(draftFolder, ''); setFolderHash(draftFolder, '');
if (FolderStore.currentFolderFullNameRaw() === draftFolder) { if (FolderUserStore.currentFolderFullNameRaw() === draftFolder) {
rl.app.reloadMessageList(true); rl.app.reloadMessageList(true);
} else { } else {
rl.app.folderInformation(draftFolder); rl.app.folderInformation(draftFolder);
@ -627,9 +627,9 @@ class ComposePopupView extends AbstractViewPopup {
result = true; result = true;
if (this.bFromDraft) { if (this.bFromDraft) {
const message = MessageStore.message(); const message = MessageUserStore.message();
if (message && this.draftFolder() === message.folder && this.draftUid() === message.uid) { if (message && this.draftFolder() === message.folder && this.draftUid() === message.uid) {
MessageStore.message(null); MessageUserStore.message(null);
} }
} }
@ -656,7 +656,7 @@ class ComposePopupView extends AbstractViewPopup {
this.autosaveStop(); this.autosaveStop();
if (!this.bSkipNextHide) { if (!this.bSkipNextHide) {
AppStore.composeInEdit(false); AppUserStore.composeInEdit(false);
this.reset(); this.reset();
} }
@ -738,7 +738,7 @@ class ComposePopupView extends AbstractViewPopup {
this.autosaveStart(); this.autosaveStart();
if (AppStore.composeInEdit()) { if (AppUserStore.composeInEdit()) {
type = type || ComposeType.Empty; type = type || ComposeType.Empty;
if (ComposeType.Empty !== type) { if (ComposeType.Empty !== type) {
showScreenPopup(AskPopupView, [ showScreenPopup(AskPopupView, [
@ -811,7 +811,7 @@ class ComposePopupView extends AbstractViewPopup {
* @param {string=} sCustomPlainText = null * @param {string=} sCustomPlainText = null
*/ */
initOnShow(sType, oMessageOrArray, aToEmails, aCcEmails, aBccEmails, sCustomSubject, sCustomPlainText) { initOnShow(sType, oMessageOrArray, aToEmails, aCcEmails, aBccEmails, sCustomSubject, sCustomPlainText) {
AppStore.composeInEdit(true); AppUserStore.composeInEdit(true);
let sFrom = '', let sFrom = '',
sTo = '', sTo = '',
@ -825,7 +825,7 @@ class ComposePopupView extends AbstractViewPopup {
message = null; message = null;
const excludeEmail = {}, const excludeEmail = {},
mEmail = AccountStore.email(), mEmail = AccountUserStore.email(),
lineComposeType = sType || ComposeType.Empty; lineComposeType = sType || ComposeType.Empty;
oMessageOrArray = oMessageOrArray || null; oMessageOrArray = oMessageOrArray || null;

View file

@ -5,7 +5,7 @@ import { pString, defaultOptionsAfterRender } from 'Common/Utils';
import { KeyState } from 'Common/Enums'; import { KeyState } from 'Common/Enums';
import { i18n } from 'Common/Translator'; import { i18n } from 'Common/Translator';
import PgpStore from 'Stores/User/Pgp'; import { PgpUserStore } from 'Stores/User/Pgp';
import { EmailModel } from 'Model/Email'; import { EmailModel } from 'Model/Email';
@ -44,7 +44,7 @@ class ComposeOpenPgpPopupView extends AbstractViewPopup {
encryptKeysView: () => this.encryptKeys.map(oKey => (oKey ? oKey.key : null)).filter(v => v), encryptKeysView: () => this.encryptKeys.map(oKey => (oKey ? oKey.key : null)).filter(v => v),
privateKeysOptions: () => { privateKeysOptions: () => {
const opts = PgpStore.openpgpkeysPrivate().map(oKey => { const opts = PgpUserStore.openpgpkeysPrivate().map(oKey => {
if (this.signKey() && this.signKey().key.id === oKey.id) { if (this.signKey() && this.signKey().key.id === oKey.id) {
return null; return null;
} }
@ -59,7 +59,7 @@ class ComposeOpenPgpPopupView extends AbstractViewPopup {
}, },
publicKeysOptions: () => { publicKeysOptions: () => {
const opts = PgpStore.openpgpkeysPublic().map(oKey => { const opts = PgpUserStore.openpgpkeysPublic().map(oKey => {
if (this.encryptKeysView().includes(oKey)) { if (this.encryptKeysView().includes(oKey)) {
return null; return null;
} }
@ -176,19 +176,19 @@ class ComposeOpenPgpPopupView extends AbstractViewPopup {
try { try {
if (aPublicKeys.length) { if (aPublicKeys.length) {
if (privateKey) { if (privateKey) {
pgpPromise = PgpStore.openpgp.encrypt({ pgpPromise = PgpUserStore.openpgp.encrypt({
data: this.text(), data: this.text(),
publicKeys: aPublicKeys, publicKeys: aPublicKeys,
privateKeys: [privateKey] privateKeys: [privateKey]
}); });
} else { } else {
pgpPromise = PgpStore.openpgp.encrypt({ pgpPromise = PgpUserStore.openpgp.encrypt({
data: this.text(), data: this.text(),
publicKeys: aPublicKeys publicKeys: aPublicKeys
}); });
} }
} else if (privateKey) { } else if (privateKey) {
pgpPromise = PgpStore.openpgp.sign({ pgpPromise = PgpUserStore.openpgp.sign({
data: this.text(), data: this.text(),
privateKeys: [privateKey] privateKeys: [privateKey]
}); });
@ -342,7 +342,7 @@ class ComposeOpenPgpPopupView extends AbstractViewPopup {
emailLine = identity.email(); emailLine = identity.email();
rec.unshift(emailLine); rec.unshift(emailLine);
const keys = PgpStore.findAllPrivateKeysByEmailNotNative(emailLine); const keys = PgpUserStore.findAllPrivateKeysByEmailNotNative(emailLine);
if (keys && keys[0]) { if (keys && keys[0]) {
this.signKey({ this.signKey({
'users': keys[0].users || [emailLine], 'users': keys[0].users || [emailLine],
@ -359,7 +359,7 @@ class ComposeOpenPgpPopupView extends AbstractViewPopup {
if (rec.length) { if (rec.length) {
this.encryptKeys( this.encryptKeys(
rec.map(recEmail => { rec.map(recEmail => {
const keys = PgpStore.findAllPublicKeysByEmailNotNative(recEmail); const keys = PgpUserStore.findAllPublicKeysByEmailNotNative(recEmail);
return keys return keys
? keys.map(publicKey => ({ ? keys.map(publicKey => ({
'empty': !publicKey, 'empty': !publicKey,

View file

@ -16,8 +16,8 @@ import { Selector } from 'Common/Selector';
import { serverRequestRaw, serverRequest } from 'Common/Links'; import { serverRequestRaw, serverRequest } from 'Common/Links';
import { i18n, getNotification } from 'Common/Translator'; import { i18n, getNotification } from 'Common/Translator';
import SettingsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import ContactStore from 'Stores/User/Contact'; import { ContactUserStore } from 'Stores/User/Contact';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -39,8 +39,8 @@ class ContactsPopupView extends AbstractViewPopup {
this.bBackToCompose = false; this.bBackToCompose = false;
this.sLastComposeFocusedField = ''; this.sLastComposeFocusedField = '';
this.allowContactsSync = ContactStore.allowContactsSync; this.allowContactsSync = ContactUserStore.allowSync;
this.enableContactsSync = ContactStore.enableContactsSync; this.enableContactsSync = ContactUserStore.enableSync;
this.addObservables({ this.addObservables({
search: '', search: '',
@ -66,14 +66,14 @@ class ContactsPopupView extends AbstractViewPopup {
watchHash: false watchHash: false
}); });
this.contacts = ContactStore.contacts; this.contacts = ContactUserStore;
this.viewProperties = ko.observableArray(); this.viewProperties = ko.observableArray();
this.useCheckboxesInList = SettingsStore.useCheckboxesInList; this.useCheckboxesInList = SettingsUserStore.useCheckboxesInList;
this.selector = new Selector( this.selector = new Selector(
this.contacts, ContactUserStore,
this.currentContact, this.currentContact,
null, null,
'.e-contact-item .actionHandle', '.e-contact-item .actionHandle',
@ -119,7 +119,7 @@ class ContactsPopupView extends AbstractViewPopup {
contactHasValidName: () => !!this.viewProperties.find(prop => propertyIsName(prop) && prop.isValid()), contactHasValidName: () => !!this.viewProperties.find(prop => propertyIsName(prop) && prop.isValid()),
contactsCheckedOrSelected: () => { contactsCheckedOrSelected: () => {
const checked = this.contacts.filter(item => item.checked && item.checked()), const checked = ContactUserStore.filter(item => item.checked && item.checked()),
selected = this.currentContact(); selected = this.currentContact();
return selected return selected
@ -347,9 +347,9 @@ class ContactsPopupView extends AbstractViewPopup {
if (j) { if (j) {
j.on('onStart', () => { j.on('onStart', () => {
this.contacts.importing(true); ContactUserStore.importing(true);
}).on('onComplete', (id, result, data) => { }).on('onComplete', (id, result, data) => {
this.contacts.importing(false); ContactUserStore.importing(false);
this.reloadContactList(); this.reloadContactList();
if (!id || !result || !data || !data.Result) { if (!id || !result || !data || !data.Result) {
alert(i18n('CONTACTS/ERROR_IMPORT_FILE')); alert(i18n('CONTACTS/ERROR_IMPORT_FILE'));
@ -360,11 +360,10 @@ class ContactsPopupView extends AbstractViewPopup {
} }
removeCheckedOrSelectedContactsFromList() { removeCheckedOrSelectedContactsFromList() {
const koContacts = this.contacts, const contacts = this.contactsCheckedOrSelected();
contacts = this.contactsCheckedOrSelected();
let currentContact = this.currentContact(), let currentContact = this.currentContact(),
count = this.contacts.length; count = ContactUserStore.length;
if (contacts.length) { if (contacts.length) {
contacts.forEach(contact => { contacts.forEach(contact => {
@ -383,7 +382,7 @@ class ContactsPopupView extends AbstractViewPopup {
setTimeout(() => { setTimeout(() => {
contacts.forEach(contact => { contacts.forEach(contact => {
koContacts.remove(contact); ContactUserStore.remove(contact);
delegateRunOnDestroy(contact); delegateRunOnDestroy(contact);
}); });
}, 500); }, 500);
@ -459,7 +458,7 @@ class ContactsPopupView extends AbstractViewPopup {
offset = 0; offset = 0;
} }
this.contacts.loading(true); ContactUserStore.loading(true);
Remote.contacts( Remote.contacts(
(result, data) => { (result, data) => {
let count = 0, let count = 0,
@ -479,10 +478,10 @@ class ContactsPopupView extends AbstractViewPopup {
this.contactsCount(count); this.contactsCount(count);
delegateRunOnDestroy(this.contacts()); delegateRunOnDestroy(ContactUserStore());
this.contacts(list); ContactUserStore(list);
this.contacts.loading(false); ContactUserStore.loading(false);
this.viewClearSearch(!!this.search()); this.viewClearSearch(!!this.search());
}, },
offset, offset,
@ -533,8 +532,8 @@ class ContactsPopupView extends AbstractViewPopup {
this.search(''); this.search('');
this.contactsCount(0); this.contactsCount(0);
delegateRunOnDestroy(this.contacts()); delegateRunOnDestroy(ContactUserStore());
this.contacts([]); ContactUserStore([]);
this.sLastComposeFocusedField = ''; this.sLastComposeFocusedField = '';

View file

@ -5,7 +5,7 @@ import { FilterConditionField, FilterConditionType } from 'Model/FilterCondition
import { defaultOptionsAfterRender } from 'Common/Utils'; import { defaultOptionsAfterRender } from 'Common/Utils';
import { i18n, initOnStartOrLangChange } from 'Common/Translator'; import { i18n, initOnStartOrLangChange } from 'Common/Translator';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import { SieveUserStore } from 'Stores/User/Sieve'; import { SieveUserStore } from 'Stores/User/Sieve';
import { decorateKoCommands } from 'Knoin/Knoin'; import { decorateKoCommands } from 'Knoin/Knoin';
@ -25,7 +25,7 @@ class FilterPopupView extends AbstractViewPopup {
this.fTrueCallback = null; this.fTrueCallback = null;
this.defaultOptionsAfterRender = defaultOptionsAfterRender; this.defaultOptionsAfterRender = defaultOptionsAfterRender;
this.folderSelectList = FolderStore.folderMenuForFilters; this.folderSelectList = FolderUserStore.folderMenuForFilters;
this.selectedFolderValue.subscribe(() => this.filter() && this.filter().actionValueError(false)); this.selectedFolderValue.subscribe(() => this.filter() && this.filter().actionValueError(false));

View file

@ -2,7 +2,7 @@ import { StorageResultType, Notification } from 'Common/Enums';
import { i18n, getNotification } from 'Common/Translator'; import { i18n, getNotification } from 'Common/Translator';
import { setFolderHash } from 'Common/Cache'; import { setFolderHash } from 'Common/Cache';
import MessageStore from 'Stores/User/Message'; import { MessageUserStore } from 'Stores/User/Message';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -44,8 +44,8 @@ class FolderClearPopupView extends AbstractViewPopup {
clearCommand() { clearCommand() {
const folderToClear = this.selectedFolder(); const folderToClear = this.selectedFolder();
if (folderToClear) { if (folderToClear) {
MessageStore.message(null); MessageUserStore.message(null);
MessageStore.messageList([]); MessageUserStore.messageList([]);
this.clearingProcess(true); this.clearingProcess(true);

View file

@ -5,7 +5,7 @@ import { UNUSED_OPTION_VALUE } from 'Common/Consts';
import { defaultOptionsAfterRender } from 'Common/Utils'; import { defaultOptionsAfterRender } from 'Common/Utils';
import { folderListOptionsBuilder } from 'Common/UtilsUser'; import { folderListOptionsBuilder } from 'Common/UtilsUser';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -25,17 +25,15 @@ class FolderCreatePopupView extends AbstractViewPopup {
this.parentFolderSelectList = ko.computed(() => { this.parentFolderSelectList = ko.computed(() => {
const top = [], const top = [],
list = FolderStore.folderList(), list = FolderUserStore.folderList(),
fRenameCallback = (oItem) => fDisableCallback = FolderUserStore.namespace
? item => FolderUserStore.namespace !== item.fullNameRaw.substr(0, FolderUserStore.namespace.length)
: null,
fRenameCallback = oItem =>
oItem ? (oItem.isSystemFolder() ? oItem.name() + ' ' + oItem.manageFolderSystemName() : oItem.name()) : ''; oItem ? (oItem.isSystemFolder() ? oItem.name() + ' ' + oItem.manageFolderSystemName() : oItem.name()) : '';
top.push(['', '']); top.push(['', '']);
let fDisableCallback = null;
if (FolderStore.namespace) {
fDisableCallback = (item) => FolderStore.namespace !== item.fullNameRaw.substr(0, FolderStore.namespace.length);
}
return folderListOptionsBuilder([], list, [], top, null, fDisableCallback, null, fRenameCallback); return folderListOptionsBuilder([], list, [], top, null, fDisableCallback, null, fRenameCallback);
}); });
@ -48,8 +46,8 @@ class FolderCreatePopupView extends AbstractViewPopup {
createFolderCommand() { createFolderCommand() {
let parentFolderName = this.selectedParentValue(); let parentFolderName = this.selectedParentValue();
if (!parentFolderName && 1 < FolderStore.namespace.length) { if (!parentFolderName && 1 < FolderUserStore.namespace.length) {
parentFolderName = FolderStore.namespace.substr(0, FolderStore.namespace.length - 1); parentFolderName = FolderUserStore.namespace.substr(0, FolderUserStore.namespace.length - 1);
} }
rl.app.foldersPromisesActionHelper( rl.app.foldersPromisesActionHelper(

View file

@ -7,7 +7,7 @@ import { defaultOptionsAfterRender } from 'Common/Utils';
import { folderListOptionsBuilder } from 'Common/UtilsUser'; import { folderListOptionsBuilder } from 'Common/UtilsUser';
import { initOnStartOrLangChange, i18n } from 'Common/Translator'; import { initOnStartOrLangChange, i18n } from 'Common/Translator';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -30,8 +30,8 @@ class FolderSystemPopupView extends AbstractViewPopup {
this.folderSelectList = ko.computed(() => this.folderSelectList = ko.computed(() =>
folderListOptionsBuilder( folderListOptionsBuilder(
[], [],
FolderStore.folderList(), FolderUserStore.folderList(),
FolderStore.folderListSystemNames(), FolderUserStore.folderListSystemNames(),
[ [
['', this.sChooseOnText], ['', this.sChooseOnText],
[UNUSED_OPTION_VALUE, this.sUnuseText] [UNUSED_OPTION_VALUE, this.sUnuseText]
@ -45,28 +45,28 @@ class FolderSystemPopupView extends AbstractViewPopup {
) )
); );
this.sentFolder = FolderStore.sentFolder; this.sentFolder = FolderUserStore.sentFolder;
this.draftFolder = FolderStore.draftFolder; this.draftFolder = FolderUserStore.draftFolder;
this.spamFolder = FolderStore.spamFolder; this.spamFolder = FolderUserStore.spamFolder;
this.trashFolder = FolderStore.trashFolder; this.trashFolder = FolderUserStore.trashFolder;
this.archiveFolder = FolderStore.archiveFolder; this.archiveFolder = FolderUserStore.archiveFolder;
const settingsSet = Settings.set, const settingsSet = Settings.set,
fSetSystemFolders = () => { fSetSystemFolders = () => {
settingsSet('SentFolder', FolderStore.sentFolder()); settingsSet('SentFolder', FolderUserStore.sentFolder());
settingsSet('DraftFolder', FolderStore.draftFolder()); settingsSet('DraftFolder', FolderUserStore.draftFolder());
settingsSet('SpamFolder', FolderStore.spamFolder()); settingsSet('SpamFolder', FolderUserStore.spamFolder());
settingsSet('TrashFolder', FolderStore.trashFolder()); settingsSet('TrashFolder', FolderUserStore.trashFolder());
settingsSet('ArchiveFolder', FolderStore.archiveFolder()); settingsSet('ArchiveFolder', FolderUserStore.archiveFolder());
}, },
fSaveSystemFolders = (()=>{ fSaveSystemFolders = (()=>{
fSetSystemFolders(); fSetSystemFolders();
Remote.saveSystemFolders(()=>{}, { Remote.saveSystemFolders(()=>{}, {
SentFolder: FolderStore.sentFolder(), SentFolder: FolderUserStore.sentFolder(),
DraftFolder: FolderStore.draftFolder(), DraftFolder: FolderUserStore.draftFolder(),
SpamFolder: FolderStore.spamFolder(), SpamFolder: FolderUserStore.spamFolder(),
TrashFolder: FolderStore.trashFolder(), TrashFolder: FolderUserStore.trashFolder(),
ArchiveFolder: FolderStore.archiveFolder(), ArchiveFolder: FolderUserStore.archiveFolder(),
NullFolder: 'NullFolder' NullFolder: 'NullFolder'
}); });
}).debounce(1000), }).debounce(1000),
@ -75,7 +75,7 @@ class FolderSystemPopupView extends AbstractViewPopup {
fSaveSystemFolders(); fSaveSystemFolders();
}; };
ko.addSubscribablesTo(FolderStore, { ko.addSubscribablesTo(FolderUserStore, {
sentFolder: fCallback, sentFolder: fCallback,
draftFolder: fCallback, draftFolder: fCallback,
spamFolder: fCallback, spamFolder: fCallback,

View file

@ -1,6 +1,6 @@
import { pInt } from 'Common/Utils'; import { pInt } from 'Common/Utils';
import PgpStore from 'Stores/User/Pgp'; import { PgpUserStore } from 'Stores/User/Pgp';
import { decorateKoCommands } from 'Knoin/Knoin'; import { decorateKoCommands } from 'Knoin/Knoin';
import { AbstractViewPopup } from 'Knoin/AbstractViews'; import { AbstractViewPopup } from 'Knoin/AbstractViews';
@ -31,7 +31,7 @@ class NewOpenPgpKeyPopupView extends AbstractViewPopup {
generateOpenPgpKeyCommand() { generateOpenPgpKeyCommand() {
const userId = {}, const userId = {},
openpgpKeyring = PgpStore.openpgpKeyring; openpgpKeyring = PgpUserStore.openpgpKeyring;
this.emailError(!this.email().trim()); this.emailError(!this.email().trim());
if (!openpgpKeyring || this.emailError()) { if (!openpgpKeyring || this.emailError()) {
@ -48,7 +48,7 @@ class NewOpenPgpKeyPopupView extends AbstractViewPopup {
setTimeout(() => { setTimeout(() => {
try { try {
PgpStore.openpgp PgpUserStore.openpgp
.generateKey({ .generateKey({
userIds: [userId], userIds: [userId],
numBits: pInt(this.keyBitLength()), numBits: pInt(this.keyBitLength()),

View file

@ -1,6 +1,6 @@
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import AccountStore from 'Stores/User/Account'; import { AccountUserStore } from 'Stores/User/Account';
import MessageStore from 'Stores/User/Message'; import { MessageUserStore } from 'Stores/User/Message';
import { Capa, KeyState } from 'Common/Enums'; import { Capa, KeyState } from 'Common/Enums';
import { settings } from 'Common/Links'; import { settings } from 'Common/Links';
@ -23,24 +23,25 @@ export class AbstractSystemDropDownUserView extends AbstractViewRight {
this.allowSettings = Settings.capa(Capa.Settings); this.allowSettings = Settings.capa(Capa.Settings);
this.allowHelp = Settings.capa(Capa.Help); this.allowHelp = Settings.capa(Capa.Help);
this.currentAudio = AppStore.currentAudio; this.currentAudio = AppUserStore.currentAudio;
this.accountEmail = AccountStore.email; this.accountEmail = AccountUserStore.email;
this.accounts = AccountStore.accounts; this.accounts = AccountUserStore.accounts;
this.accountsUnreadCount = AccountStore.accountsUnreadCount; this.accountsLoading = AccountUserStore.loading;
this.accountsUnreadCount = AccountUserStore.accountsUnreadCount;
this.addObservables({ this.addObservables({
accountMenuDropdownTrigger: false, accountMenuDropdownTrigger: false,
capaAdditionalAccounts: Settings.capa(Capa.AdditionalAccounts) capaAdditionalAccounts: Settings.capa(Capa.AdditionalAccounts)
}); });
this.allowContacts = !!AppStore.contactsIsAllowed(); this.allowContacts = !!AppUserStore.contactsIsAllowed();
this.addAccountClick = this.addAccountClick.bind(this); this.addAccountClick = this.addAccountClick.bind(this);
addEventListener('audio.stop', () => AppStore.currentAudio('')); addEventListener('audio.stop', () => AppUserStore.currentAudio(''));
addEventListener('audio.start', e => AppStore.currentAudio(e.detail)); addEventListener('audio.start', e => AppUserStore.currentAudio(e.detail));
} }
stopPlay() { stopPlay() {
@ -49,15 +50,15 @@ export class AbstractSystemDropDownUserView extends AbstractViewRight {
accountClick(account, event) { accountClick(account, event) {
if (account && 0 === event.button) { if (account && 0 === event.button) {
AccountStore.accounts.loading(true); AccountUserStore.loading(true);
setTimeout(() => AccountStore.accounts.loading(false), 1000); setTimeout(() => AccountUserStore.loading(false), 1000);
} }
return true; return true;
} }
emailTitle() { emailTitle() {
return AccountStore.email(); return AccountUserStore.email();
} }
settingsClick() { settingsClick() {
@ -107,7 +108,7 @@ export class AbstractSystemDropDownUserView extends AbstractViewRight {
onBuild() { onBuild() {
shortcuts.add('m,contextmenu', '', [KeyState.MessageList, KeyState.MessageView, KeyState.Settings], () => { shortcuts.add('m,contextmenu', '', [KeyState.MessageList, KeyState.MessageView, KeyState.Settings], () => {
if (this.viewModelVisible) { if (this.viewModelVisible) {
MessageStore.messageFullScreenMode(false); MessageUserStore.messageFullScreenMode(false);
this.accountMenuDropdownTrigger(true); this.accountMenuDropdownTrigger(true);
return false; return false;
} }

View file

@ -9,7 +9,7 @@ import { ClientSideKeyName } from 'Common/EnumsUser';
import { getNotification, getNotificationFromResponse, reload as translatorReload, convertLangName } from 'Common/Translator'; import { getNotification, getNotificationFromResponse, reload as translatorReload, convertLangName } from 'Common/Translator';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import { LanguageStore } from 'Stores/Language'; import { LanguageStore } from 'Stores/Language';
import * as Local from 'Storage/Client'; import * as Local from 'Storage/Client';
@ -233,8 +233,8 @@ class LoginUserView extends AbstractViewCenter {
break; break;
} }
this.email(AppStore.devEmail); this.email(AppUserStore.devEmail);
this.password(AppStore.devPassword); this.password(AppUserStore.devPassword);
setTimeout(() => { setTimeout(() => {
LanguageStore.language.subscribe((value) => { LanguageStore.language.subscribe((value) => {

View file

@ -6,10 +6,10 @@ import { leftPanelDisabled, moveAction, Settings } from 'Common/Globals';
import { mailBox, settings } from 'Common/Links'; import { mailBox, settings } from 'Common/Links';
import { setFolderHash } from 'Common/Cache'; import { setFolderHash } from 'Common/Cache';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import SettingsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import MessageStore from 'Stores/User/Message'; import { MessageUserStore } from 'Stores/User/Message';
import { ThemeStore } from 'Stores/Theme'; import { ThemeStore } from 'Stores/Theme';
import { showScreenPopup } from 'Knoin/Knoin'; import { showScreenPopup } from 'Knoin/Knoin';
@ -25,29 +25,29 @@ export class FolderListMailBoxUserView extends AbstractViewLeft {
this.oContentScrollable = null; this.oContentScrollable = null;
this.composeInEdit = AppStore.composeInEdit; this.composeInEdit = AppUserStore.composeInEdit;
this.messageList = MessageStore.messageList; this.messageList = MessageUserStore.messageList;
this.folderList = FolderStore.folderList; this.folderList = FolderUserStore.folderList;
this.folderListSystem = FolderStore.folderListSystem; this.folderListSystem = FolderUserStore.folderListSystem;
this.foldersChanging = FolderStore.foldersChanging; this.foldersChanging = FolderUserStore.foldersChanging;
this.moveAction = moveAction; this.moveAction = moveAction;
this.foldersListWithSingleInboxRootFolder = FolderStore.foldersListWithSingleInboxRootFolder; this.foldersListWithSingleInboxRootFolder = FolderUserStore.foldersListWithSingleInboxRootFolder;
this.leftPanelDisabled = leftPanelDisabled; this.leftPanelDisabled = leftPanelDisabled;
this.allowComposer = Settings.capa(Capa.Composer); this.allowComposer = Settings.capa(Capa.Composer);
this.allowContacts = !!AppStore.contactsIsAllowed(); this.allowContacts = !!AppUserStore.contactsIsAllowed();
this.folderListFocused = ko.computed(() => Focused.FolderList === AppStore.focusedState()); this.folderListFocused = ko.computed(() => Focused.FolderList === AppUserStore.focusedState());
this.isInboxStarred = ko.computed( this.isInboxStarred = ko.computed(
() => () =>
FolderStore.currentFolder() && FolderUserStore.currentFolder() &&
FolderStore.currentFolder().isInbox() && FolderUserStore.currentFolder().isInbox() &&
MessageStore.messageListSearch().trim().includes('is:flagged') MessageUserStore.messageListSearch().trim().includes('is:flagged')
); );
} }
@ -69,17 +69,17 @@ export class FolderListMailBoxUserView extends AbstractViewLeft {
if (isMove) { if (isMove) {
moveAction(false); moveAction(false);
rl.app.moveMessagesToFolder( rl.app.moveMessagesToFolder(
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(), MessageUserStore.messageListCheckedOrSelectedUidsWithSubMails(),
folder.fullNameRaw, folder.fullNameRaw,
event.ctrlKey event.ctrlKey
); );
} else { } else {
if (!SettingsStore.usePreviewPane()) { if (!SettingsUserStore.usePreviewPane()) {
MessageStore.message(null); MessageUserStore.message(null);
} }
if (folder.fullNameRaw === FolderStore.currentFolderFullNameRaw()) { if (folder.fullNameRaw === FolderUserStore.currentFolderFullNameRaw()) {
setFolderHash(folder.fullNameRaw, ''); setFolderHash(folder.fullNameRaw, '');
} }
@ -89,7 +89,7 @@ export class FolderListMailBoxUserView extends AbstractViewLeft {
); );
} }
AppStore.focusedState(Focused.MessageList); AppUserStore.focusedState(Focused.MessageList);
} }
}; };
@ -144,7 +144,7 @@ export class FolderListMailBoxUserView extends AbstractViewLeft {
shortcuts.add('enter,open', '', KeyState.FolderList, () => { shortcuts.add('enter,open', '', KeyState.FolderList, () => {
const item = qs('.b-folders .e-item .e-link:not(.hidden).focused'); const item = qs('.b-folders .e-item .e-link:not(.hidden).focused');
if (item) { if (item) {
AppStore.focusedState(Focused.MessageList); AppUserStore.focusedState(Focused.MessageList);
item.click(); item.click();
} }
@ -165,12 +165,12 @@ export class FolderListMailBoxUserView extends AbstractViewLeft {
// shortcuts.add('tab', 'shift', KeyState.FolderList, () => { // shortcuts.add('tab', 'shift', KeyState.FolderList, () => {
shortcuts.add('escape,tab,arrowright', '', KeyState.FolderList, () => { shortcuts.add('escape,tab,arrowright', '', KeyState.FolderList, () => {
AppStore.focusedState(Focused.MessageList); AppUserStore.focusedState(Focused.MessageList);
moveAction(false); moveAction(false);
return false; return false;
}); });
AppStore.focusedState.subscribe(value => { AppUserStore.focusedState.subscribe(value => {
let el = qs('.b-folders .e-item .e-link.focused'); let el = qs('.b-folders .e-item .e-link.focused');
el && qs('.b-folders .e-item .e-link.focused').classList.remove('focused'); el && qs('.b-folders .e-item .e-link.focused').classList.remove('focused');
if (Focused.FolderList === value) { if (Focused.FolderList === value) {

View file

@ -32,11 +32,11 @@ import {
addRequestedMessage addRequestedMessage
} from 'Common/Cache'; } from 'Common/Cache';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import QuotaStore from 'Stores/User/Quota'; import { QuotaUserStore } from 'Stores/User/Quota';
import SettingsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import MessageStore from 'Stores/User/Message'; import { MessageUserStore } from 'Stores/User/Message';
import { ThemeStore } from 'Stores/Theme'; import { ThemeStore } from 'Stores/Theme';
import Remote from 'Remote/User/Fetch'; import Remote from 'Remote/User/Fetch';
@ -48,7 +48,7 @@ import { FolderClearPopupView } from 'View/Popup/FolderClear';
import { AdvancedSearchPopupView } from 'View/Popup/AdvancedSearch'; import { AdvancedSearchPopupView } from 'View/Popup/AdvancedSearch';
const const
canBeMovedHelper = () => MessageStore.hasCheckedOrSelected(); canBeMovedHelper = () => MessageUserStore.hasCheckedOrSelected();
export class MessageListMailBoxUserView extends AbstractViewRight { export class MessageListMailBoxUserView extends AbstractViewRight {
constructor() { constructor() {
@ -71,39 +71,40 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
this.popupVisibility = popupVisibility; this.popupVisibility = popupVisibility;
this.message = MessageStore.message; this.message = MessageUserStore.message;
this.messageList = MessageStore.messageList; this.messageList = MessageUserStore.messageList;
this.messageListDisableAutoSelect = MessageStore.messageListDisableAutoSelect; this.messageListDisableAutoSelect = MessageUserStore.messageListDisableAutoSelect;
this.folderList = FolderStore.folderList; this.folderList = FolderUserStore.folderList;
this.composeInEdit = AppStore.composeInEdit; this.composeInEdit = AppUserStore.composeInEdit;
this.leftPanelDisabled = leftPanelDisabled; this.leftPanelDisabled = leftPanelDisabled;
this.selectorMessageSelected = MessageStore.selectorMessageSelected; this.selectorMessageSelected = MessageUserStore.selectorMessageSelected;
this.selectorMessageFocused = MessageStore.selectorMessageFocused; this.selectorMessageFocused = MessageUserStore.selectorMessageFocused;
this.isMessageSelected = MessageStore.isMessageSelected; this.isMessageSelected = MessageUserStore.isMessageSelected;
this.messageListSearch = MessageStore.messageListSearch; this.messageListSearch = MessageUserStore.messageListSearch;
this.messageListThreadUid = MessageStore.messageListThreadUid; this.messageListThreadUid = MessageUserStore.messageListThreadUid;
this.messageListError = MessageStore.messageListError; this.messageListError = MessageUserStore.messageListError;
this.folderMenuForMove = FolderStore.folderMenuForMove; this.folderMenuForMove = FolderUserStore.folderMenuForMove;
this.useCheckboxesInList = SettingsStore.useCheckboxesInList; this.useCheckboxesInList = SettingsUserStore.useCheckboxesInList;
this.mainMessageListSearch = MessageStore.mainMessageListSearch; this.mainMessageListSearch = MessageUserStore.mainMessageListSearch;
this.messageListEndFolder = MessageStore.messageListEndFolder; this.messageListEndFolder = MessageUserStore.messageListEndFolder;
this.messageListEndThreadUid = MessageStore.messageListEndThreadUid; this.messageListEndThreadUid = MessageUserStore.messageListEndThreadUid;
this.messageListCheckedOrSelected = MessageStore.messageListCheckedOrSelected; this.messageListCheckedOrSelected = MessageUserStore.messageListCheckedOrSelected;
this.messageListCheckedOrSelectedUidsWithSubMails = MessageStore.messageListCheckedOrSelectedUidsWithSubMails; this.messageListCheckedOrSelectedUidsWithSubMails = MessageUserStore.messageListCheckedOrSelectedUidsWithSubMails;
this.messageListCompleteLoadingThrottle = MessageStore.messageListCompleteLoadingThrottle; this.messageListCompleteLoadingThrottle = MessageUserStore.messageListCompleteLoadingThrottle;
this.messageListCompleteLoadingThrottleForAnimation = MessageStore.messageListCompleteLoadingThrottleForAnimation; this.messageListCompleteLoadingThrottleForAnimation =
MessageUserStore.messageListCompleteLoadingThrottleForAnimation;
initOnStartOrLangChange(() => this.emptySubjectValue = i18n('MESSAGE_LIST/EMPTY_SUBJECT_TEXT')); initOnStartOrLangChange(() => this.emptySubjectValue = i18n('MESSAGE_LIST/EMPTY_SUBJECT_TEXT'));
this.userQuota = QuotaStore.quota; this.userQuota = QuotaUserStore.quota;
this.userUsageSize = QuotaStore.usage; this.userUsageSize = QuotaUserStore.usage;
this.userUsageProc = QuotaStore.percentage; this.userUsageProc = QuotaUserStore.percentage;
this.addObservables({ this.addObservables({
moveDropdownTrigger: false, moveDropdownTrigger: false,
@ -123,17 +124,18 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
this.addComputables({ this.addComputables({
messageListSearchDesc: () => { messageListSearchDesc: () => {
const value = MessageStore.messageListEndSearch(); const value = MessageUserStore.messageListEndSearch();
return value ? i18n('MESSAGE_LIST/SEARCH_RESULT_FOR', { 'SEARCH': value }) : '' return value ? i18n('MESSAGE_LIST/SEARCH_RESULT_FOR', { 'SEARCH': value }) : ''
}, },
messageListPaginator: computedPaginatorHelper(MessageStore.messageListPage, MessageStore.messageListPageCount), messageListPaginator: computedPaginatorHelper(MessageUserStore.messageListPage,
MessageUserStore.messageListPageCount),
checkAll: { checkAll: {
read: () => 0 < MessageStore.messageListChecked().length, read: () => 0 < MessageUserStore.messageListChecked().length,
write: (value) => { write: (value) => {
value = !!value; value = !!value;
MessageStore.messageList.forEach(message => message.checked(value)); MessageUserStore.messageList.forEach(message => message.checked(value));
} }
}, },
@ -143,25 +145,25 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
}, },
isIncompleteChecked: () => { isIncompleteChecked: () => {
const c = MessageStore.messageListChecked().length; const c = MessageUserStore.messageListChecked().length;
return c && MessageStore.messageList.length > c; return c && MessageUserStore.messageList.length > c;
}, },
hasMessages: () => 0 < this.messageList.length, hasMessages: () => 0 < this.messageList.length,
isSpamFolder: () => FolderStore.spamFolder() === this.messageListEndFolder() && FolderStore.spamFolder(), isSpamFolder: () => (FolderUserStore.spamFolder() || 0) === this.messageListEndFolder(),
isSpamDisabled: () => UNUSED_OPTION_VALUE === FolderStore.spamFolder(), isSpamDisabled: () => UNUSED_OPTION_VALUE === FolderUserStore.spamFolder(),
isTrashFolder: () => FolderStore.trashFolder() === this.messageListEndFolder() && FolderStore.trashFolder(), isTrashFolder: () => (FolderUserStore.trashFolder() || 0) === this.messageListEndFolder(),
isDraftFolder: () => FolderStore.draftFolder() === this.messageListEndFolder() && FolderStore.draftFolder(), isDraftFolder: () => (FolderUserStore.draftFolder() || 0) === this.messageListEndFolder(),
isSentFolder: () => FolderStore.sentFolder() === this.messageListEndFolder() && FolderStore.sentFolder(), isSentFolder: () => (FolderUserStore.sentFolder() || 0) === this.messageListEndFolder(),
isArchiveFolder: () => FolderStore.archiveFolder() === this.messageListEndFolder() && FolderStore.archiveFolder(), isArchiveFolder: () => (FolderUserStore.archiveFolder() || 0) === this.messageListEndFolder(),
isArchiveDisabled: () => UNUSED_OPTION_VALUE === FolderStore.archiveFolder(), isArchiveDisabled: () => UNUSED_OPTION_VALUE === FolderUserStore.archiveFolder(),
isArchiveVisible: () => !this.isArchiveFolder() && !this.isArchiveDisabled() && !this.isDraftFolder(), isArchiveVisible: () => !this.isArchiveFolder() && !this.isArchiveDisabled() && !this.isDraftFolder(),
@ -171,16 +173,16 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
isUnSpamVisible: () => isUnSpamVisible: () =>
this.isSpamFolder() && !this.isSpamDisabled() && !this.isDraftFolder() && !this.isSentFolder(), this.isSpamFolder() && !this.isSpamDisabled() && !this.isDraftFolder() && !this.isSentFolder(),
mobileCheckedStateShow: () => ThemeStore.isMobile() ? 0 < MessageStore.messageListChecked().length : true, mobileCheckedStateShow: () => ThemeStore.isMobile() ? 0 < MessageUserStore.messageListChecked().length : true,
mobileCheckedStateHide: () => ThemeStore.isMobile() ? !MessageStore.messageListChecked().length : true, mobileCheckedStateHide: () => ThemeStore.isMobile() ? !MessageUserStore.messageListChecked().length : true,
messageListFocused: () => Focused.MessageList === AppStore.focusedState() messageListFocused: () => Focused.MessageList === AppUserStore.focusedState()
}); });
// this.messageListChecked = MessageStore.messageListChecked; // this.messageListChecked = MessageUserStore.messageListChecked;
this.hasCheckedOrSelectedLines = MessageStore.hasCheckedOrSelected, this.hasCheckedOrSelectedLines = MessageUserStore.hasCheckedOrSelected,
this.quotaTooltip = this.quotaTooltip.bind(this); this.quotaTooltip = this.quotaTooltip.bind(this);
@ -194,7 +196,7 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
'.messageListItem.focused' '.messageListItem.focused'
); );
this.selector.on('onItemSelect', message => MessageStore.selectMessage(message)); this.selector.on('onItemSelect', message => MessageUserStore.selectMessage(message));
this.selector.on('onItemGetUid', message => (message ? message.generateUid() : '')); this.selector.on('onItemGetUid', message => (message ? message.generateUid() : ''));
@ -228,11 +230,11 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
rl.route.setHash(mailBox(sFolder, 1)); rl.route.setHash(mailBox(sFolder, 1));
} }
MessageStore.selectMessageByFolderAndUid(sFolder, sUid); MessageUserStore.selectMessageByFolderAndUid(sFolder, sUid);
} }
}); });
MessageStore.messageListEndHash.subscribe((() => MessageUserStore.messageListEndHash.subscribe((() =>
this.selector.scrollToFocused() this.selector.scrollToFocused()
).throttle(50)); ).throttle(50));
@ -252,12 +254,12 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
clearCommand() { clearCommand() {
if (Settings.capa(Capa.DangerousActions)) { if (Settings.capa(Capa.DangerousActions)) {
showScreenPopup(FolderClearPopupView, [FolderStore.currentFolder()]); showScreenPopup(FolderClearPopupView, [FolderUserStore.currentFolder()]);
} }
} }
reloadCommand() { reloadCommand() {
if (!MessageStore.messageListCompleteLoadingThrottleForAnimation() && this.allowReload) { if (!MessageUserStore.messageListCompleteLoadingThrottleForAnimation() && this.allowReload) {
rl.app.reloadMessageList(false, true); rl.app.reloadMessageList(false, true);
} }
} }
@ -265,7 +267,7 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
multyForwardCommand() { multyForwardCommand() {
showMessageComposer([ showMessageComposer([
ComposeType.ForwardAsAttachment, ComposeType.ForwardAsAttachment,
MessageStore.messageListCheckedOrSelected() MessageUserStore.messageListCheckedOrSelected()
]); ]);
} }
@ -273,8 +275,8 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
if (Settings.capa(Capa.DangerousActions)) { if (Settings.capa(Capa.DangerousActions)) {
rl.app.deleteMessagesFromFolder( rl.app.deleteMessagesFromFolder(
FolderType.Trash, FolderType.Trash,
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(), MessageUserStore.messageListCheckedOrSelectedUidsWithSubMails(),
false false
); );
} }
@ -283,8 +285,8 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
deleteCommand() { deleteCommand() {
rl.app.deleteMessagesFromFolder( rl.app.deleteMessagesFromFolder(
FolderType.Trash, FolderType.Trash,
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(), MessageUserStore.messageListCheckedOrSelectedUidsWithSubMails(),
true true
); );
} }
@ -292,8 +294,8 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
archiveCommand() { archiveCommand() {
rl.app.deleteMessagesFromFolder( rl.app.deleteMessagesFromFolder(
FolderType.Archive, FolderType.Archive,
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(), MessageUserStore.messageListCheckedOrSelectedUidsWithSubMails(),
true true
); );
} }
@ -301,8 +303,8 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
spamCommand() { spamCommand() {
rl.app.deleteMessagesFromFolder( rl.app.deleteMessagesFromFolder(
FolderType.Spam, FolderType.Spam,
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(), MessageUserStore.messageListCheckedOrSelectedUidsWithSubMails(),
true true
); );
} }
@ -310,8 +312,8 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
notSpamCommand() { notSpamCommand() {
rl.app.deleteMessagesFromFolder( rl.app.deleteMessagesFromFolder(
FolderType.NotSpam, FolderType.NotSpam,
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(), MessageUserStore.messageListCheckedOrSelectedUidsWithSubMails(),
true true
); );
} }
@ -326,7 +328,7 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
} }
let b = moveAction(); let b = moveAction();
AppStore.focusedState(b ? Focused.MessageList : Focused.FolderList); AppUserStore.focusedState(b ? Focused.MessageList : Focused.FolderList);
moveAction(!b); moveAction(!b);
} }
} }
@ -350,7 +352,7 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
} }
goToUpUpOrDownDown(up) { goToUpUpOrDownDown(up) {
if (MessageStore.messageListChecked().length) { if (MessageUserStore.messageListChecked().length) {
return false; return false;
} }
@ -379,7 +381,7 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
return false; return false;
}); });
if (!SettingsStore.usePreviewPane() && !this.message()) { if (!SettingsUserStore.usePreviewPane() && !this.message()) {
this.selector.iFocusedNextHelper = up ? -1 : 1; this.selector.iFocusedNextHelper = up ? -1 : 1;
} else { } else {
this.selector.iSelectNextHelper = up ? -1 : 1; this.selector.iSelectNextHelper = up ? -1 : 1;
@ -397,7 +399,7 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
useAutoSelect() { useAutoSelect() {
return !this.messageListDisableAutoSelect() return !this.messageListDisableAutoSelect()
&& !/is:unseen/.test(this.mainMessageListSearch()) && !/is:unseen/.test(this.mainMessageListSearch())
&& SettingsStore.usePreviewPane(); && SettingsUserStore.usePreviewPane();
} }
searchEnterAction() { searchEnterAction() {
@ -413,9 +415,9 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
cancelThreadUid() { cancelThreadUid() {
rl.route.setHash( rl.route.setHash(
mailBox( mailBox(
FolderStore.currentFolderFullNameHash(), FolderUserStore.currentFolderFullNameHash(),
MessageStore.messageListPageBeforeThread(), MessageUserStore.messageListPageBeforeThread(),
MessageStore.messageListSearch() MessageUserStore.messageListSearch()
) )
); );
} }
@ -426,10 +428,10 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
* @returns {boolean} * @returns {boolean}
*/ */
moveSelectedMessagesToFolder(sToFolderFullNameRaw, bCopy) { moveSelectedMessagesToFolder(sToFolderFullNameRaw, bCopy) {
if (MessageStore.hasCheckedOrSelected()) { if (MessageUserStore.hasCheckedOrSelected()) {
rl.app.moveMessagesToFolder( rl.app.moveMessagesToFolder(
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageStore.messageListCheckedOrSelectedUidsWithSubMails(), MessageUserStore.messageListCheckedOrSelectedUidsWithSubMails(),
sToFolderFullNameRaw, sToFolderFullNameRaw,
bCopy bCopy
); );
@ -441,11 +443,11 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
getDragData(event) { getDragData(event) {
const item = ko.dataFor(doc.elementFromPoint(event.clientX, event.clientY)); const item = ko.dataFor(doc.elementFromPoint(event.clientX, event.clientY));
item && item.checked && item.checked(true); item && item.checked && item.checked(true);
const uids = MessageStore.messageListCheckedOrSelectedUidsWithSubMails(); const uids = MessageUserStore.messageListCheckedOrSelectedUidsWithSubMails();
item && !uids.includes(item.uid) && uids.push(item.uid); item && !uids.includes(item.uid) && uids.push(item.uid);
return uids.length ? { return uids.length ? {
copy: event.ctrlKey, copy: event.ctrlKey,
folder: FolderStore.currentFolderFullNameRaw(), folder: FolderUserStore.currentFolderFullNameRaw(),
uids: uids uids: uids
} : null; } : null;
} }
@ -477,7 +479,7 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
case MessageSetAction.SetSeen: case MessageSetAction.SetSeen:
folder = getFolderFromCacheList(sFolderFullNameRaw); folder = getFolderFromCacheList(sFolderFullNameRaw);
if (folder) { if (folder) {
MessageStore.messageList.forEach(message => { MessageUserStore.messageList.forEach(message => {
if (message.isUnseen()) { if (message.isUnseen()) {
++cnt; ++cnt;
} }
@ -503,7 +505,7 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
case MessageSetAction.UnsetSeen: case MessageSetAction.UnsetSeen:
folder = getFolderFromCacheList(sFolderFullNameRaw); folder = getFolderFromCacheList(sFolderFullNameRaw);
if (folder) { if (folder) {
MessageStore.messageList.forEach(message => { MessageUserStore.messageList.forEach(message => {
if (!message.isUnseen()) { if (!message.isUnseen()) {
++cnt; ++cnt;
} }
@ -536,15 +538,15 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
listSetSeen() { listSetSeen() {
this.setAction( this.setAction(
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageSetAction.SetSeen, MessageSetAction.SetSeen,
MessageStore.messageListCheckedOrSelected() MessageUserStore.messageListCheckedOrSelected()
); );
} }
listSetAllSeen() { listSetAllSeen() {
this.setActionForAll( this.setActionForAll(
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageSetAction.SetSeen, MessageSetAction.SetSeen,
this.messageListEndThreadUid() this.messageListEndThreadUid()
); );
@ -552,25 +554,25 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
listUnsetSeen() { listUnsetSeen() {
this.setAction( this.setAction(
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageSetAction.UnsetSeen, MessageSetAction.UnsetSeen,
MessageStore.messageListCheckedOrSelected() MessageUserStore.messageListCheckedOrSelected()
); );
} }
listSetFlags() { listSetFlags() {
this.setAction( this.setAction(
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageSetAction.SetFlag, MessageSetAction.SetFlag,
MessageStore.messageListCheckedOrSelected() MessageUserStore.messageListCheckedOrSelected()
); );
} }
listUnsetFlags() { listUnsetFlags() {
this.setAction( this.setAction(
FolderStore.currentFolderFullNameRaw(), FolderUserStore.currentFolderFullNameRaw(),
MessageSetAction.UnsetFlag, MessageSetAction.UnsetFlag,
MessageStore.messageListCheckedOrSelected() MessageUserStore.messageListCheckedOrSelected()
); );
} }
@ -637,20 +639,20 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
gotoPage(page) { gotoPage(page) {
page && rl.route.setHash( page && rl.route.setHash(
mailBox( mailBox(
FolderStore.currentFolderFullNameHash(), FolderUserStore.currentFolderFullNameHash(),
page.value, page.value,
MessageStore.messageListSearch(), MessageUserStore.messageListSearch(),
MessageStore.messageListThreadUid() MessageUserStore.messageListThreadUid()
) )
); );
} }
gotoThread(message) { gotoThread(message) {
if (message && 0 < message.threadsLen()) { if (message && 0 < message.threadsLen()) {
MessageStore.messageListPageBeforeThread(MessageStore.messageListPage()); MessageUserStore.messageListPageBeforeThread(MessageUserStore.messageListPage());
rl.route.setHash( rl.route.setHash(
mailBox(FolderStore.currentFolderFullNameHash(), 1, MessageStore.messageListSearch(), message.uid) mailBox(FolderUserStore.currentFolderFullNameHash(), 1, MessageUserStore.messageListSearch(), message.uid)
); );
} }
} }
@ -673,8 +675,8 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
dom.addEventListener('click', event => { dom.addEventListener('click', event => {
ThemeStore.isMobile() && leftPanelDisabled(true); ThemeStore.isMobile() && leftPanelDisabled(true);
if (eqs(event, '.messageList .b-message-list-wrapper') && Focused.MessageView === AppStore.focusedState()) { if (eqs(event, '.messageList .b-message-list-wrapper') && Focused.MessageView === AppUserStore.focusedState()) {
AppStore.focusedState(Focused.MessageList); AppUserStore.focusedState(Focused.MessageList);
} }
let el = eqs(event, '.e-paginator .e-page'); let el = eqs(event, '.e-paginator .e-page');
@ -721,12 +723,12 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
// delete // delete
shortcuts.add('delete', 'shift', KeyState.MessageList, () => { shortcuts.add('delete', 'shift', KeyState.MessageList, () => {
MessageStore.messageListCheckedOrSelected().length && this.deleteWithoutMoveCommand(); MessageUserStore.messageListCheckedOrSelected().length && this.deleteWithoutMoveCommand();
return false; return false;
}); });
// shortcuts.add('3', 'shift', KeyState.MessageList, () => { // shortcuts.add('3', 'shift', KeyState.MessageList, () => {
shortcuts.add('delete', '', KeyState.MessageList, () => { shortcuts.add('delete', '', KeyState.MessageList, () => {
MessageStore.messageListCheckedOrSelected().length && this.deleteCommand(); MessageUserStore.messageListCheckedOrSelected().length && this.deleteCommand();
return false; return false;
}); });
} }
@ -827,15 +829,15 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
// change focused state // change focused state
shortcuts.add('tab', 'shift', KeyState.MessageList, () => { shortcuts.add('tab', 'shift', KeyState.MessageList, () => {
AppStore.focusedState(Focused.FolderList); AppUserStore.focusedState(Focused.FolderList);
return false; return false;
}); });
shortcuts.add('arrowleft', '', KeyState.MessageList, () => { shortcuts.add('arrowleft', '', KeyState.MessageList, () => {
AppStore.focusedState(Focused.FolderList); AppUserStore.focusedState(Focused.FolderList);
return false; return false;
}); });
shortcuts.add('tab,arrowright', '', KeyState.MessageList, () => { shortcuts.add('tab,arrowright', '', KeyState.MessageList, () => {
this.message() && AppStore.focusedState(Focused.MessageView); this.message() && AppUserStore.focusedState(Focused.MessageView);
return false; return false;
}); });
@ -892,7 +894,7 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
queueSize: 1, queueSize: 1,
multipleSizeLimit: 1, multipleSizeLimit: 1,
hidden: { hidden: {
Folder: () => FolderStore.currentFolderFullNameRaw() Folder: () => FolderUserStore.currentFolderFullNameRaw()
}, },
dragAndDropElement: this.dragOverArea(), dragAndDropElement: this.dragOverArea(),
dragAndDropBodyElement: this.dragOverBodyArea() dragAndDropBodyElement: this.dragOverBodyArea()
@ -907,7 +909,7 @@ export class MessageListMailBoxUserView extends AbstractViewRight {
.on('onBodyDragLeave', () => this.dragOver(false)) .on('onBodyDragLeave', () => this.dragOver(false))
.on('onSelect', (sUid, oData) => { .on('onSelect', (sUid, oData) => {
if (sUid && oData && 'message/rfc822' === oData.Type) { if (sUid && oData && 'message/rfc822' === oData.Type) {
MessageStore.messageListLoading(true); MessageUserStore.messageListLoading(true);
return true; return true;
} }

View file

@ -20,18 +20,18 @@ import { doc, $htmlCL, leftPanelDisabled, keyScopeReal, moveAction, Settings } f
import { inFocus } from 'Common/Utils'; import { inFocus } from 'Common/Utils';
import { mailToHelper, showMessageComposer } from 'Common/UtilsUser'; import { mailToHelper, showMessageComposer } from 'Common/UtilsUser';
import Audio from 'Common/Audio'; import { SMAudio } from 'Common/Audio';
import { i18n } from 'Common/Translator'; import { i18n } from 'Common/Translator';
import { attachmentDownload } from 'Common/Links'; import { attachmentDownload } from 'Common/Links';
import { MessageFlagsCache } from 'Common/Cache'; import { MessageFlagsCache } from 'Common/Cache';
import AppStore from 'Stores/User/App'; import { AppUserStore } from 'Stores/User/App';
import SettingsStore from 'Stores/User/Settings'; import { SettingsUserStore } from 'Stores/User/Settings';
import AccountStore from 'Stores/User/Account'; import { AccountUserStore } from 'Stores/User/Account';
import FolderStore from 'Stores/User/Folder'; import { FolderUserStore } from 'Stores/User/Folder';
import MessageStore from 'Stores/User/Message'; import { MessageUserStore } from 'Stores/User/Message';
import { ThemeStore } from 'Stores/Theme'; import { ThemeStore } from 'Stores/Theme';
import * as Local from 'Storage/Client'; import * as Local from 'Storage/Client';
@ -84,22 +84,22 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
this.allowMessageActions = Settings.capa(Capa.MessageActions); this.allowMessageActions = Settings.capa(Capa.MessageActions);
this.allowMessageListActions = Settings.capa(Capa.MessageListActions); this.allowMessageListActions = Settings.capa(Capa.MessageListActions);
this.attachmentsActions = AppStore.attachmentsActions; this.attachmentsActions = AppUserStore.attachmentsActions;
this.message = MessageStore.message; this.message = MessageUserStore.message;
// this.messageListChecked = MessageStore.messageListChecked; // this.messageListChecked = MessageUserStore.messageListChecked;
this.hasCheckedMessages = MessageStore.hasCheckedMessages; this.hasCheckedMessages = MessageUserStore.hasCheckedMessages;
this.messageListCheckedOrSelectedUidsWithSubMails = MessageStore.messageListCheckedOrSelectedUidsWithSubMails; this.messageListCheckedOrSelectedUidsWithSubMails = MessageUserStore.messageListCheckedOrSelectedUidsWithSubMails;
this.messageLoadingThrottle = MessageStore.messageLoadingThrottle; this.messageLoadingThrottle = MessageUserStore.messageLoadingThrottle;
this.messagesBodiesDom = MessageStore.messagesBodiesDom; this.messagesBodiesDom = MessageUserStore.messagesBodiesDom;
this.useThreads = SettingsStore.useThreads; this.useThreads = SettingsUserStore.useThreads;
this.replySameFolder = SettingsStore.replySameFolder; this.replySameFolder = SettingsUserStore.replySameFolder;
this.layout = SettingsStore.layout; this.layout = SettingsUserStore.layout;
this.isMessageSelected = MessageStore.isMessageSelected; this.isMessageSelected = MessageUserStore.isMessageSelected;
this.messageActiveDom = MessageStore.messageActiveDom; this.messageActiveDom = MessageUserStore.messageActiveDom;
this.messageError = MessageStore.messageError; this.messageError = MessageUserStore.messageError;
this.fullScreenMode = MessageStore.messageFullScreenMode; this.fullScreenMode = MessageUserStore.messageFullScreenMode;
this.messageListOfThreadsLoading = ko.observable(false).extend({ rateLimit: 1 }); this.messageListOfThreadsLoading = ko.observable(false).extend({ rateLimit: 1 });
this.highlightUnselectedAttachments = ko.observable(false).extend({ falseTimeout: 2000 }); this.highlightUnselectedAttachments = ko.observable(false).extend({ falseTimeout: 2000 });
@ -191,10 +191,10 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
return ''; return '';
}, },
messageFocused: () => Focused.MessageView === AppStore.focusedState(), messageFocused: () => Focused.MessageView === AppUserStore.focusedState(),
messageListAndMessageViewLoading: messageListAndMessageViewLoading:
() => MessageStore.messageListCompleteLoadingThrottle() || MessageStore.messageLoadingThrottle() () => MessageUserStore.messageListCompleteLoadingThrottle() || MessageUserStore.messageLoadingThrottle()
}); });
this.addSubscribables({ this.addSubscribables({
@ -241,7 +241,7 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
this.viewIsImportant(message.isImportant()); this.viewIsImportant(message.isImportant());
this.viewIsFlagged(message.isFlagged()); this.viewIsFlagged(message.isFlagged());
} else { } else {
MessageStore.selectorMessageSelected(null); MessageUserStore.selectorMessageSelected(null);
this.viewFolder = ''; this.viewFolder = '';
this.viewUid = ''; this.viewUid = '';
@ -260,7 +260,7 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
} }
}); });
MessageStore.messageViewTrigger.subscribe(() => { MessageUserStore.messageViewTrigger.subscribe(() => {
const message = this.message(); const message = this.message();
message ? this.viewIsFlagged(message.isFlagged()) : this.viewIsFlagged(false); message ? this.viewIsFlagged(message.isFlagged()) : this.viewIsFlagged(false);
}); });
@ -281,7 +281,7 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
} }
closeMessageCommand() { closeMessageCommand() {
MessageStore.message(null); MessageUserStore.message(null);
} }
messageVisibilityCommand() {} messageVisibilityCommand() {}
@ -292,19 +292,19 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
goUpCommand() { goUpCommand() {
dispatchEvent(new CustomEvent('mailbox.message-list.selector.go-up', dispatchEvent(new CustomEvent('mailbox.message-list.selector.go-up',
{detail:SettingsStore.usePreviewPane() || !!this.message()} // bForceSelect {detail:SettingsUserStore.usePreviewPane() || !!this.message()} // bForceSelect
)); ));
} }
goDownCommand() { goDownCommand() {
dispatchEvent(new CustomEvent('mailbox.message-list.selector.go-down', dispatchEvent(new CustomEvent('mailbox.message-list.selector.go-down',
{detail:SettingsStore.usePreviewPane() || !!this.message()} // bForceSelect {detail:SettingsUserStore.usePreviewPane() || !!this.message()} // bForceSelect
)); ));
} }
detectDomBackgroundColor(dom) { detectDomBackgroundColor(dom) {
let color = ''; let color = '';
if (dom && !SettingsStore.removeColors()) { if (dom && !SettingsUserStore.removeColors()) {
let limit = 5, let limit = 5,
aC = dom; aC = dom;
while (!color && aC && limit--) { while (!color && aC && limit--) {
@ -336,7 +336,7 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
* @returns {void} * @returns {void}
*/ */
replyOrforward(sType) { replyOrforward(sType) {
showMessageComposer([sType, MessageStore.message()]); showMessageComposer([sType, MessageUserStore.message()]);
} }
checkHeaderHeight() { checkHeaderHeight() {
@ -395,7 +395,7 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
} }
onBuild(dom) { onBuild(dom) {
this.fullScreenMode.subscribe(value => value && this.message() && AppStore.focusedState(Focused.MessageView)); this.fullScreenMode.subscribe(value => value && this.message() && AppUserStore.focusedState(Focused.MessageView));
this.showFullInfo.subscribe(value => Local.set(ClientSideKeyName.MessageHeaderFullInfo, value ? '1' : '0')); this.showFullInfo.subscribe(value => Local.set(ClientSideKeyName.MessageHeaderFullInfo, value ? '1' : '0'));
@ -446,16 +446,16 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
if (el) { if (el) {
event.stopPropagation(); event.stopPropagation();
const attachment = ko.dataFor(el); // eslint-disable-line no-invalid-this const attachment = ko.dataFor(el); // eslint-disable-line no-invalid-this
if (attachment && Audio.supported) { if (attachment && SMAudio.supported) {
switch (true) { switch (true) {
case Audio.supportedMp3 && attachment.isMp3(): case SMAudio.supportedMp3 && attachment.isMp3():
Audio.playMp3(attachment.linkDownload(), attachment.fileName); SMAudio.playMp3(attachment.linkDownload(), attachment.fileName);
break; break;
case Audio.supportedOgg && attachment.isOgg(): case SMAudio.supportedOgg && attachment.isOgg():
Audio.playOgg(attachment.linkDownload(), attachment.fileName); SMAudio.playOgg(attachment.linkDownload(), attachment.fileName);
break; break;
case Audio.supportedWav && attachment.isWav(): case SMAudio.supportedWav && attachment.isWav():
Audio.playWav(attachment.linkDownload(), attachment.fileName); SMAudio.playWav(attachment.linkDownload(), attachment.fileName);
break; break;
// no default // no default
} }
@ -494,7 +494,7 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
} }
}); });
AppStore.focusedState.subscribe((value) => { AppUserStore.focusedState.subscribe((value) => {
if (Focused.MessageView !== value) { if (Focused.MessageView !== value) {
this.scrollMessageToTop(); this.scrollMessageToTop();
this.scrollMessageToLeft(); this.scrollMessageToLeft();
@ -513,17 +513,17 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
*/ */
escShortcuts() { escShortcuts() {
if (this.viewModelVisible && this.message()) { if (this.viewModelVisible && this.message()) {
const preview = SettingsStore.usePreviewPane(); const preview = SettingsUserStore.usePreviewPane();
if (this.fullScreenMode()) { if (this.fullScreenMode()) {
this.fullScreenMode(false); this.fullScreenMode(false);
if (preview) { if (preview) {
AppStore.focusedState(Focused.MessageList); AppUserStore.focusedState(Focused.MessageList);
} }
} else if (!preview) { } else if (!preview) {
this.message(null); this.message(null);
} else { } else {
AppStore.focusedState(Focused.MessageList); AppUserStore.focusedState(Focused.MessageList);
} }
return false; return false;
@ -544,7 +544,7 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
// reply // reply
shortcuts.add('r,mailreply', '', [KeyState.MessageList, KeyState.MessageView], () => { shortcuts.add('r,mailreply', '', [KeyState.MessageList, KeyState.MessageView], () => {
if (MessageStore.message()) { if (MessageUserStore.message()) {
this.replyCommand(); this.replyCommand();
return false; return false;
} }
@ -553,14 +553,14 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
// replaAll // replaAll
shortcuts.add('a', '', [KeyState.MessageList, KeyState.MessageView], () => { shortcuts.add('a', '', [KeyState.MessageList, KeyState.MessageView], () => {
if (MessageStore.message()) { if (MessageUserStore.message()) {
this.replyAllCommand(); this.replyAllCommand();
return false; return false;
} }
return true; return true;
}); });
shortcuts.add('mailreply', 'shift', [KeyState.MessageList, KeyState.MessageView], () => { shortcuts.add('mailreply', 'shift', [KeyState.MessageList, KeyState.MessageView], () => {
if (MessageStore.message()) { if (MessageUserStore.message()) {
this.replyAllCommand(); this.replyAllCommand();
return false; return false;
} }
@ -569,7 +569,7 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
// forward // forward
shortcuts.add('f,mailforward', '', [KeyState.MessageList, KeyState.MessageView], () => { shortcuts.add('f,mailforward', '', [KeyState.MessageList, KeyState.MessageView], () => {
if (MessageStore.message()) { if (MessageUserStore.message()) {
this.forwardCommand(); this.forwardCommand();
return false; return false;
} }
@ -579,7 +579,7 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
// message information // message information
shortcuts.add('i', 'meta', [KeyState.MessageList, KeyState.MessageView], () => { shortcuts.add('i', 'meta', [KeyState.MessageList, KeyState.MessageView], () => {
if (MessageStore.message()) { if (MessageUserStore.message()) {
this.showFullInfo(!this.showFullInfo()); this.showFullInfo(!this.showFullInfo());
} }
return false; return false;
@ -587,7 +587,7 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
// toggle message blockquotes // toggle message blockquotes
shortcuts.add('b', '', [KeyState.MessageList, KeyState.MessageView], () => { shortcuts.add('b', '', [KeyState.MessageList, KeyState.MessageView], () => {
const message = MessageStore.message(); const message = MessageUserStore.message();
if (message && message.body) { if (message && message.body) {
message.body.querySelectorAll('.rlBlockquoteSwitcher').forEach(node => node.click()); message.body.querySelectorAll('.rlBlockquoteSwitcher').forEach(node => node.click());
return false; return false;
@ -623,18 +623,18 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
// change focused state // change focused state
shortcuts.add('arrowleft', '', KeyState.MessageView, () => { shortcuts.add('arrowleft', '', KeyState.MessageView, () => {
if (!this.fullScreenMode() && this.message() && SettingsStore.usePreviewPane()) { if (!this.fullScreenMode() && this.message() && SettingsUserStore.usePreviewPane()) {
if (this.oMessageScrollerDom && 0 < this.oMessageScrollerDom.scrollLeft) { if (this.oMessageScrollerDom && 0 < this.oMessageScrollerDom.scrollLeft) {
return true; return true;
} }
AppStore.focusedState(Focused.MessageList); AppUserStore.focusedState(Focused.MessageList);
return false; return false;
} }
}); });
// shortcuts.add('tab', 'shift', KeyState.MessageView, (event, handler) => { // shortcuts.add('tab', 'shift', KeyState.MessageView, (event, handler) => {
shortcuts.add('tab', '', KeyState.MessageView, () => { shortcuts.add('tab', '', KeyState.MessageView, () => {
if (!this.fullScreenMode() && this.message() && SettingsStore.usePreviewPane()) { if (!this.fullScreenMode() && this.message() && SettingsUserStore.usePreviewPane()) {
AppStore.focusedState(Focused.MessageList); AppUserStore.focusedState(Focused.MessageList);
} }
return false; return false;
}); });
@ -644,42 +644,42 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
* @returns {boolean} * @returns {boolean}
*/ */
isDraftFolder() { isDraftFolder() {
return MessageStore.message() && FolderStore.draftFolder() === MessageStore.message().folder; return MessageUserStore.message() && FolderUserStore.draftFolder() === MessageUserStore.message().folder;
} }
/** /**
* @returns {boolean} * @returns {boolean}
*/ */
isSentFolder() { isSentFolder() {
return MessageStore.message() && FolderStore.sentFolder() === MessageStore.message().folder; return MessageUserStore.message() && FolderUserStore.sentFolder() === MessageUserStore.message().folder;
} }
/** /**
* @returns {boolean} * @returns {boolean}
*/ */
isSpamFolder() { isSpamFolder() {
return MessageStore.message() && FolderStore.spamFolder() === MessageStore.message().folder; return MessageUserStore.message() && FolderUserStore.spamFolder() === MessageUserStore.message().folder;
} }
/** /**
* @returns {boolean} * @returns {boolean}
*/ */
isSpamDisabled() { isSpamDisabled() {
return MessageStore.message() && FolderStore.spamFolder() === UNUSED_OPTION_VALUE; return MessageUserStore.message() && FolderUserStore.spamFolder() === UNUSED_OPTION_VALUE;
} }
/** /**
* @returns {boolean} * @returns {boolean}
*/ */
isArchiveFolder() { isArchiveFolder() {
return MessageStore.message() && FolderStore.archiveFolder() === MessageStore.message().folder; return MessageUserStore.message() && FolderUserStore.archiveFolder() === MessageUserStore.message().folder;
} }
/** /**
* @returns {boolean} * @returns {boolean}
*/ */
isArchiveDisabled() { isArchiveDisabled() {
return MessageStore.message() && FolderStore.archiveFolder() === UNUSED_OPTION_VALUE; return MessageUserStore.message() && FolderUserStore.archiveFolder() === UNUSED_OPTION_VALUE;
} }
/** /**
@ -694,8 +694,8 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
} }
editMessage() { editMessage() {
if (MessageStore.message()) { if (MessageUserStore.message()) {
showMessageComposer([ComposeType.Draft, MessageStore.message()]); showMessageComposer([ComposeType.Draft, MessageUserStore.message()]);
} }
} }
@ -766,7 +766,7 @@ class MessageViewMailBoxUserView extends AbstractViewRight {
oMessage.uid, oMessage.uid,
oMessage.readReceipt(), oMessage.readReceipt(),
i18n('READ_RECEIPT/SUBJECT', { 'SUBJECT': oMessage.subject() }), i18n('READ_RECEIPT/SUBJECT', { 'SUBJECT': oMessage.subject() }),
i18n('READ_RECEIPT/BODY', { 'READ-RECEIPT': AccountStore.email() }) i18n('READ_RECEIPT/BODY', { 'READ-RECEIPT': AccountUserStore.email() })
); );
oMessage.isReadReceipt(true); oMessage.isReadReceipt(true);

View file

@ -2,7 +2,7 @@ import { mailbox } from 'Common/Links';
import { getFolderInboxName } from 'Common/Cache'; import { getFolderInboxName } from 'Common/Cache';
import { leftPanelDisabled } from 'Common/Globals'; import { leftPanelDisabled } from 'Common/Globals';
import MessageStore from 'Stores/User/Message'; import { MessageUserStore } from 'Stores/User/Message';
import { ThemeStore } from 'Stores/Theme'; import { ThemeStore } from 'Stores/Theme';
import { AbstractViewRight } from 'Knoin/AbstractViews'; import { AbstractViewRight } from 'Knoin/AbstractViews';
@ -15,7 +15,7 @@ export class PaneSettingsUserView extends AbstractViewRight {
} }
onShow() { onShow() {
MessageStore.message(null); MessageUserStore.message(null);
} }
hideLeft(item, event) { hideLeft(item, event) {

View file

@ -33,13 +33,13 @@
</li> </li>
<li class="e-item dividerbar" role="presentation"> <li class="e-item dividerbar" role="presentation">
<a class="e-link menuitem" href="#" tabindex="-1" data-bind="click: exportCsv"> <a class="e-link menuitem" href="#" tabindex="-1" data-bind="click: exportCsv">
<i data-bind="css: {'icon-export': !contacts.exportingCsv(), 'icon-spinner': contacts.exportingCsv}"></i> <i class="icon-export"></i>
<span data-i18n="CONTACTS/BUTTON_EXPORT_CSV"></span> <span data-i18n="CONTACTS/BUTTON_EXPORT_CSV"></span>
</a> </a>
</li> </li>
<li class="e-item" role="presentation"> <li class="e-item" role="presentation">
<a class="e-link menuitem" href="#" tabindex="-1" data-bind="click: exportVcf"> <a class="e-link menuitem" href="#" tabindex="-1" data-bind="click: exportVcf">
<i data-bind="css: {'icon-export': !contacts.exportingVcf(), 'icon-spinner': contacts.exportingVcf}"></i> <i class="icon-export"></i>
<span data-i18n="CONTACTS/BUTTON_EXPORT_VCARD"></span> <span data-i18n="CONTACTS/BUTTON_EXPORT_VCARD"></span>
</a> </a>
</li> </li>

View file

@ -4,7 +4,7 @@
<div class="legend"> <div class="legend">
<span data-i18n="SETTINGS_ACCOUNTS/LEGEND_ACCOUNTS"></span> <span data-i18n="SETTINGS_ACCOUNTS/LEGEND_ACCOUNTS"></span>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;
<i class="icon-spinner" style="margin-top: 5px" data-bind="visible: accounts.loading"></i> <i class="icon-spinner" style="margin-top: 5px" data-bind="visible: loading"></i>
</div> </div>
</div> </div>
<a class="btn" data-bind="click: addNewAccount"> <a class="btn" data-bind="click: addNewAccount">

View file

@ -13,7 +13,7 @@
<div class="accountPlace hide-mobile" data-bind="text: emailTitle()"></div> <div class="accountPlace hide-mobile" data-bind="text: emailTitle()"></div>
<div class="btn-group dropdown colored-toggle" data-bind="registerBootstrapDropdown: true, openDropdownTrigger: accountMenuDropdownTrigger"> <div class="btn-group dropdown colored-toggle" data-bind="registerBootstrapDropdown: true, openDropdownTrigger: accountMenuDropdownTrigger">
<a id="top-system-dropdown-id" href="#" tabindex="-1" class="btn single btn-block dropdown-toggle" data-toggle="dropdown"> <a id="top-system-dropdown-id" href="#" tabindex="-1" class="btn single btn-block dropdown-toggle" data-toggle="dropdown">
<i class="fontastic" data-bind="css: {'icon-spinner': accounts.loading()}">👤</i> <i class="fontastic" data-bind="css: {'icon-spinner': accountsLoading()}">👤</i>
<!-- <!--
<b data-bind="text: accountsUnreadCount, visible: 100 > accountsUnreadCount() && 0 < accountsUnreadCount()"></b> <b data-bind="text: accountsUnreadCount, visible: 100 > accountsUnreadCount() && 0 < accountsUnreadCount()"></b>
<b data-bind="visible: 99 < accountsUnreadCount()">99+</b> <b data-bind="visible: 99 < accountsUnreadCount()">99+</b>