diff --git a/electron_app/electron-starter.js b/electron_app/electron-starter.js index 9e3d91f31..7f0eda0d4 100644 --- a/electron_app/electron-starter.js +++ b/electron_app/electron-starter.js @@ -17,6 +17,7 @@ const { isFromStore, getSystemLanguage } = require('./src/windows/windowUtils'); +const {initNucleus} = require('./src/nucleusManager'); require('./src/ipc/composer.js'); require('./src/ipc/loading.js'); require('./src/ipc/login.js'); @@ -25,6 +26,7 @@ require('./src/ipc/database.js'); require('./src/ipc/manager.js'); require('./src/ipc/dataTransfer.js'); require('./src/ipc/backup.js'); +require('./src/ipc/nucleus.js'); const ipcUtils = require('./src/ipc/utils.js'); globalManager.forcequit.set(false); @@ -36,7 +38,7 @@ async function initApp() { } catch (ex) { console.log(ex); } - + const [existingAccount] = await dbManager.getAccount(); if (existingAccount) { if (!!existingAccount.deviceId) { @@ -44,16 +46,19 @@ async function initApp() { const settings = Object.assign(appSettings, { isFromStore }); myAccount.initialize(existingAccount); mySettings.initialize(settings); + initNucleus({language: mySettings.language}); wsClient.start(myAccount); createAppMenu(); mailboxWindow.show({ firstOpenApp: true }); } else { - await getUserLanguage(); + const language = await getUserLanguage(); + initNucleus({language}); createAppMenu(); loginWindow.show(); } } else { - await getUserLanguage(); + const language = await getUserLanguage(); + initNucleus({language}); createAppMenu(); loginWindow.show({}); } @@ -97,6 +102,7 @@ if ((isWindows || isLinux) && !isDev) { const getUserLanguage = async () => { const osLanguage = await getSystemLanguage(); await dbManager.updateSettings({ language: osLanguage }); + return osLanguage; }; app.on('ready', () => { diff --git a/electron_app/package.json b/electron_app/package.json index 9ebf06422..abacf6779 100644 --- a/electron_app/package.json +++ b/electron_app/package.json @@ -1,6 +1,6 @@ { "name": "criptext", - "version": "0.23.4", + "version": "0.23.5", "author": { "name": "Criptext Inc", "email": "support@criptext.com", @@ -141,7 +141,7 @@ "dotenv": "^6.2.0", "electron-context-menu": "^0.10.1", "electron-dl": "^1.12.0", - "electron-nucleus": "^2.2.1", + "electron-nucleus": "^2.3.0", "electron-updater": "^3.0.3", "electron-window-state": "^4.1.1", "getos": "^3.1.1", diff --git a/electron_app/src/ipc/loading.js b/electron_app/src/ipc/loading.js index 865e657c7..b08394cf0 100644 --- a/electron_app/src/ipc/loading.js +++ b/electron_app/src/ipc/loading.js @@ -7,7 +7,7 @@ ipc.answerRenderer('close-create-keys-loading', () => { globalManager.loadingData.set({}); }); -ipc.answerRenderer('open-create-keys-loading', arg => { - globalManager.loadingData.set(arg); - loadingWindow.show(); +ipc.answerRenderer('open-create-keys-loading', params => { + globalManager.loadingData.set(params); + loadingWindow.show({ type: params.loadingType }); }); diff --git a/electron_app/src/ipc/nucleus.js b/electron_app/src/ipc/nucleus.js new file mode 100644 index 000000000..c9b6ad289 --- /dev/null +++ b/electron_app/src/ipc/nucleus.js @@ -0,0 +1,6 @@ +const ipc = require('@criptext/electron-better-ipc'); +const { addEventError, NUCLEUS_EVENTS } = require('./../nucleusManager'); + +ipc.answerRenderer('nucleups-report-content-unencrypted', error => + addEventError(NUCLEUS_EVENTS.REPORT_CONTENT_UNENCRYPTED, { error }) +); diff --git a/electron_app/src/nucleusManager.js b/electron_app/src/nucleusManager.js new file mode 100644 index 000000000..347a3e938 --- /dev/null +++ b/electron_app/src/nucleusManager.js @@ -0,0 +1,42 @@ +const { APP_VERSION, NUCLEUS_ID } = require('./utils/const'); +const myAccount = require('./Account'); +let Nucleus; + +const initNucleus = ({ userId }) => { + const data = { + onlyMainProcess: true, + userId: userId || 'unknown', + version: APP_VERSION + }; + Nucleus = require('electron-nucleus')(NUCLEUS_ID, data); +}; + +const addEventError = (event, data) => { + Nucleus.trackError(event, data); +}; + +const addEventTrack = (event, data) => { + Nucleus.track(event, data); +}; + +const updateUserData = () => { + Nucleus.setUserId(myAccount.recipientId); +}; + +const NUCLEUS_EVENTS = { + LOGIN_OPENED: 'LOGIN_OPENED', + LOGIN_NEW_USER: 'LOGIN_NEW_USER', + LOGIN_NEW_DEVICE: 'LOGIN_NEW_DEVICE', + LOGIN_NEW_ENTERPRISE: 'LOGIN_NEW_ENTERPRISE', + MAILBOX_OPENED: 'MAILBOX_OPENED', + NEW_USER: 'NEW_USER', + REPORT_CONTENT_UNENCRYPTED: 'REPORT_CONTENT_UNENCRYPTED' +}; + +module.exports = { + initNucleus, + addEventError, + addEventTrack, + updateUserData, + NUCLEUS_EVENTS +}; diff --git a/electron_app/src/socketClient.js b/electron_app/src/socketClient.js index ff07292d7..c65b94d1c 100644 --- a/electron_app/src/socketClient.js +++ b/electron_app/src/socketClient.js @@ -35,6 +35,8 @@ const disconnect = () => { const start = ({ jwt }) => { client = new WebSocketClient(); + pingFailedCounter = 0; + checkDelay = normalPingDelayMs; client.connect( `${SOCKET_URL}?token=${jwt}`, 'criptext-protocol' diff --git a/electron_app/src/windows/composer.js b/electron_app/src/windows/composer.js index 014963903..93892c556 100644 --- a/electron_app/src/windows/composer.js +++ b/electron_app/src/windows/composer.js @@ -133,13 +133,15 @@ const destroy = async ({ const { type, key } = emailToEdit; if (type === composerEvents.EDIT_DRAFT) { const [oldDraftEmail] = await dbManager.getEmailByKey(key); - const oldEmailId = oldDraftEmail.id; - await dbManager.deleteEmailLabelAndContactByEmailId( - oldEmailId, - undefined - ); + if (oldDraftEmail) { + const oldEmailId = oldDraftEmail.id; + await dbManager.deleteEmailLabelAndContactByEmailId( + oldEmailId, + undefined + ); + } event = 'composer-email-delete'; - params = { threadId, oldEmailId }; + params = { threadId }; } else if ( type === composerEvents.REPLY || type === composerEvents.REPLY_ALL diff --git a/electron_app/src/windows/loading.js b/electron_app/src/windows/loading.js index 60f209cc3..8e5bd114f 100644 --- a/electron_app/src/windows/loading.js +++ b/electron_app/src/windows/loading.js @@ -2,6 +2,11 @@ const { BrowserWindow } = require('electron'); const path = require('path'); const { loadingUrl } = require('./../window_routing'); const globalManager = require('./../globalManager'); +const { + updateUserData, + addEventTrack, + NUCLEUS_EVENTS +} = require('./../nucleusManager'); let loadingWindow; const LINK_DEVICE_LOADING_TYPES = { @@ -23,7 +28,6 @@ const create = () => { show: false, frame: false, transparent: true, - alwaysOnTop: true, center: true }); loadingWindow.loadURL(loadingUrl); @@ -53,6 +57,7 @@ const create = () => { }; const close = () => { + updateUserData(); if (loadingWindow) { loadingWindow.close(); } @@ -66,15 +71,36 @@ const send = (message, data) => { loadingWindow.webContents.send(message, data); }; -const show = async () => { +const show = async ({ type }) => { if (!loadingWindow) { await create(); } loadingWindow.once('ready-to-show', () => { loadingWindow.show(); + sendTrack(type); }); }; +const sendTrack = type => { + let event; + switch (type) { + case 'signin-new-password': + event = NUCLEUS_EVENTS.LOGIN_NEW_ENTERPRISE; + break; + case 'signup': + event = NUCLEUS_EVENTS.LOGIN_NEW_USER; + break; + case 'signin': + case 'link-new-device': + event = NUCLEUS_EVENTS.LOGIN_NEW_DEVICE; + break; + default: + event = ''; + break; + } + addEventTrack(event); +}; + module.exports = { close, send, diff --git a/electron_app/src/windows/login.js b/electron_app/src/windows/login.js index fe6adf3ae..bcce383e9 100644 --- a/electron_app/src/windows/login.js +++ b/electron_app/src/windows/login.js @@ -1,7 +1,8 @@ const { BrowserWindow, shell } = require('electron'); +const path = require('path'); const { loginUrl } = require('./../window_routing'); const globalManager = require('./../globalManager'); -const path = require('path'); +const { addEventTrack, NUCLEUS_EVENTS } = require('./../nucleusManager'); let loginWindow; const loginSize = { @@ -52,10 +53,12 @@ const create = () => { const show = async () => { if (loginWindow) { loginWindow.show(); + addEventTrack(NUCLEUS_EVENTS.LOGIN_OPENED); } else { await create(); loginWindow.once('ready-to-show', () => { loginWindow.show(); + addEventTrack(NUCLEUS_EVENTS.LOGIN_OPENED); }); } }; diff --git a/electron_app/src/windows/mailbox.js b/electron_app/src/windows/mailbox.js index 44049b4b4..973439b42 100644 --- a/electron_app/src/windows/mailbox.js +++ b/electron_app/src/windows/mailbox.js @@ -8,12 +8,12 @@ const { appUpdater } = require('./../updater'); const globalManager = require('./../globalManager'); const { mailtoProtocolRegex } = require('./../utils/RegexUtils'); const { removeProtocolFromUrl } = require('./../utils/stringUtils'); +const { isFromStore, isDev } = require('./windowUtils'); const { - isFromStore, - isDev, - nucleusTrack, + updateUserData, + addEventTrack, NUCLEUS_EVENTS -} = require('./windowUtils'); +} = require('./../nucleusManager'); const { createTrayIcon, destroyTrayIcon } = require('./tray'); const { isWindows } = require('./../utils/osUtils'); @@ -101,17 +101,25 @@ const show = async ({ firstOpenApp = false }) => { if (mailboxWindow) { mailboxWindow.show(); createTrayIcon(); - if (firstOpenApp) nucleusTrack(NUCLEUS_EVENTS.MAILBOX_TRACK); + if (firstOpenApp) { + updateUserData(); + addEventTrack(NUCLEUS_EVENTS.MAILBOX_OPENED); + } } else if (!existVisibleWindow.length || !mailboxWindow) { await create(); mailboxWindow.on('ready-to-show', () => { mailboxWindow.show(); createTrayIcon(); - if (firstOpenApp) nucleusTrack(NUCLEUS_EVENTS.MAILBOX_TRACK); + if (firstOpenApp) { + updateUserData(); + addEventTrack(NUCLEUS_EVENTS.MAILBOX_OPENED); + } }); mailboxWindow.on('focus', () => { if (!globalManager.windowsEvents.checkDisabled()) { - ipc.callRenderer(mailboxWindow, 'get-events'); + if (mailboxWindow) { + ipc.callRenderer(mailboxWindow, 'get-events'); + } } }); } diff --git a/electron_app/src/windows/windowUtils.js b/electron_app/src/windows/windowUtils.js index 3aa6b8e16..4ef66eaf9 100644 --- a/electron_app/src/windows/windowUtils.js +++ b/electron_app/src/windows/windowUtils.js @@ -1,9 +1,6 @@ const { app, BrowserWindow } = require('electron'); const osLocale = require('os-locale'); const globalManager = require('./../globalManager'); -const myAccount = require('./../Account'); -const mySettings = require('./../Settings'); -const { APP_VERSION, NUCLEUS_ID } = require('./../utils/const'); const showWindows = () => { const visibleWindows = BrowserWindow.getAllWindows(); @@ -42,23 +39,6 @@ const sendEventToAllWindows = (eventName, params) => { }); }; -const getNucleusPayload = () => ({ - onlyMainProcess: true, - userId: myAccount.recipientId, - version: APP_VERSION, - language: mySettings.language -}); - -const nucleusTrack = eventName => { - const data = getNucleusPayload(); - const Nucleus = require('electron-nucleus')(NUCLEUS_ID, data); - Nucleus.track(eventName); -}; - -const NUCLEUS_EVENTS = { - MAILBOX_TRACK: 'MAILBOX_TRACK' -}; - module.exports = { quit, isDev, @@ -68,7 +48,5 @@ module.exports = { isFromStore, showWindows, getSystemLanguage, - sendEventToAllWindows, - NUCLEUS_EVENTS, - nucleusTrack + sendEventToAllWindows }; diff --git a/electron_app/yarn.lock b/electron_app/yarn.lock index baffc51ec..d3dd8fe38 100644 --- a/electron_app/yarn.lock +++ b/electron_app/yarn.lock @@ -1471,10 +1471,10 @@ electron-is-dev@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-1.0.1.tgz#6e0a184736fe7aea77d18210b0b0f6a02402c4bc" -electron-nucleus@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/electron-nucleus/-/electron-nucleus-2.2.1.tgz#c747dc1beb2af5251b33cd21f64e962a8c908821" - integrity sha512-Jglvm3dB4cFBIjZ6fLlPtX2xDpabeJhnOhbBFdCEIF3b14P2o68rRGj3+07r6V6uoovPz2vJwXizALPAySzVjg== +electron-nucleus@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/electron-nucleus/-/electron-nucleus-2.3.0.tgz#f8a81f4326dcfc43001f21aa5281fe63042308e4" + integrity sha512-lv10mhhhkScwsjLGca1706rYy4Lj6bljNa7p2qNVVvJrrAavDPsGwco/53b1eEwisEv9E0hCCWuuX/2rN38g1g== dependencies: electron-store "^4.0.0" node-machine-id "^1.1.12" diff --git a/email_composer/package.json b/email_composer/package.json index b65e80759..582ae64aa 100644 --- a/email_composer/package.json +++ b/email_composer/package.json @@ -1,6 +1,6 @@ { "name": "email_composer", - "version": "0.23.4", + "version": "0.23.5", "private": true, "dependencies": { "@criptext/electron-better-ipc": "^0.1.2-rc5", diff --git a/email_loading/package.json b/email_loading/package.json index 5617855ca..a26bebaa1 100644 --- a/email_loading/package.json +++ b/email_loading/package.json @@ -1,6 +1,6 @@ { "name": "email_loading", - "version": "0.23.4", + "version": "0.23.5", "private": true, "dependencies": { "@criptext/electron-better-ipc": "^0.1.2-rc5", diff --git a/email_login/package.json b/email_login/package.json index 40f57e6dd..be89eb2cc 100644 --- a/email_login/package.json +++ b/email_login/package.json @@ -1,6 +1,6 @@ { "name": "email_login", - "version": "0.23.4", + "version": "0.23.5", "private": true, "dependencies": { "@criptext/electron-better-ipc": "^0.1.2-rc5", diff --git a/email_mailbox/package.json b/email_mailbox/package.json index d78a9dfad..f1fbdd99c 100644 --- a/email_mailbox/package.json +++ b/email_mailbox/package.json @@ -1,6 +1,6 @@ { "name": "email_mailbox", - "version": "0.23.4", + "version": "0.23.5", "private": true, "dependencies": { "@criptext/electron-better-ipc": "^0.1.2-rc5", diff --git a/email_mailbox/src/components/EmptyMailbox.js b/email_mailbox/src/components/EmptyMailbox.js index feb37feb1..8de1acef9 100644 --- a/email_mailbox/src/components/EmptyMailbox.js +++ b/email_mailbox/src/components/EmptyMailbox.js @@ -7,7 +7,8 @@ import './emptymailbox.scss'; const EmptyMailbox = props => { const { header, subheader, iconClass } = defineEmptyParamsByMailbox( props.mailbox, - props.status + props.status, + props.isUnread ); return (
@@ -38,7 +39,7 @@ const defineClassComponent = status => { return `empty-container empty-mailbox-container ${statusClass}`; }; -const defineEmptyParamsByMailbox = (mailbox, status) => { +const defineEmptyParamsByMailbox = (mailbox, status, isUnread) => { const { id, text } = mailbox; let headerLoading = undefined; let iconLoading = undefined; @@ -51,7 +52,8 @@ const defineEmptyParamsByMailbox = (mailbox, status) => { switch (id) { case LabelType.inbox.id: { - const header = headerLoading || string.mailbox.empty.inbox.header; + let header = headerLoading || string.mailbox.empty.inbox.header; + if (isUnread) header = `${header} (${string.mailbox.unread})`; return { header, subheader: string.mailbox.empty.inbox.subheader, @@ -59,7 +61,8 @@ const defineEmptyParamsByMailbox = (mailbox, status) => { }; } case LabelType.starred.id: { - const header = headerLoading || string.mailbox.empty.starred.header; + let header = headerLoading || string.mailbox.empty.starred.header; + if (isUnread) header = `${header} (${string.mailbox.unread})`; return { header, subheader: string.mailbox.empty.starred.subheader, @@ -67,7 +70,8 @@ const defineEmptyParamsByMailbox = (mailbox, status) => { }; } case LabelType.trash.id: { - const header = headerLoading || string.mailbox.empty.trash.header; + let header = headerLoading || string.mailbox.empty.trash.header; + if (isUnread) header = `${header} (${string.mailbox.unread})`; return { header, subheader: string.mailbox.empty.trash.subheader, @@ -75,7 +79,8 @@ const defineEmptyParamsByMailbox = (mailbox, status) => { }; } case LabelType.draft.id: { - const header = headerLoading || string.mailbox.empty.draft.header; + let header = headerLoading || string.mailbox.empty.draft.header; + if (isUnread) header = `${header} (${string.mailbox.unread})`; return { header, subheader: string.mailbox.empty.draft.subheader, @@ -83,7 +88,8 @@ const defineEmptyParamsByMailbox = (mailbox, status) => { }; } case LabelType.sent.id: { - const header = headerLoading || string.mailbox.empty.sent.header; + let header = headerLoading || string.mailbox.empty.sent.header; + if (isUnread) header = `${header} (${string.mailbox.unread})`; return { header, subheader: string.mailbox.empty.sent.subheader, @@ -91,7 +97,8 @@ const defineEmptyParamsByMailbox = (mailbox, status) => { }; } case LabelType.spam.id: { - const header = headerLoading || string.mailbox.empty.spam.header; + let header = headerLoading || string.mailbox.empty.spam.header; + if (isUnread) header = `${header} (${string.mailbox.unread})`; return { header, subheader: string.mailbox.empty.spam.subheader, @@ -99,7 +106,8 @@ const defineEmptyParamsByMailbox = (mailbox, status) => { }; } case LabelType.allmail.id: { - const header = headerLoading || string.mailbox.empty.allmail.header; + let header = headerLoading || string.mailbox.empty.allmail.header; + if (isUnread) header = `${header} (${string.mailbox.unread})`; return { header, subheader: string.mailbox.empty.allmail.subheader, @@ -107,7 +115,8 @@ const defineEmptyParamsByMailbox = (mailbox, status) => { }; } case LabelType.search.id: { - const header = headerLoading || string.mailbox.empty.search.header; + let header = headerLoading || string.mailbox.empty.search.header; + if (isUnread) header = `${header} (${string.mailbox.unread})`; const iconClass = iconLoading || 'empty-search'; return { header, @@ -116,7 +125,8 @@ const defineEmptyParamsByMailbox = (mailbox, status) => { }; } default: { - const header = headerLoading || string.mailbox.empty.default.header; + let header = headerLoading || string.mailbox.empty.default.header; + if (isUnread) header = `${header} (${string.mailbox.unread})`; return { header, subheader: string.mailbox.empty.default.subheader, @@ -127,6 +137,7 @@ const defineEmptyParamsByMailbox = (mailbox, status) => { }; EmptyMailbox.propTypes = { + isUnread: PropTypes.bool, mailbox: PropTypes.object, status: PropTypes.number }; diff --git a/email_mailbox/src/components/PanelWrapper.js b/email_mailbox/src/components/PanelWrapper.js index fa679ce5b..bc52f5636 100644 --- a/email_mailbox/src/components/PanelWrapper.js +++ b/email_mailbox/src/components/PanelWrapper.js @@ -24,6 +24,7 @@ const MAILBOX_POPUP_TYPES = { }; const RESTORE_BACKUP_POPUP_DELAY = 1000; +const THREADS_SIZE = 22; class PanelWrapper extends Component { constructor(props) { @@ -336,7 +337,8 @@ class PanelWrapper extends Component { const currentLabelId = this.state.sectionSelected.params.mailboxSelected .id; const currentMailboxSize = this.props[currentLabelId]; - const limit = currentMailboxSize > 22 ? currentMailboxSize : undefined; + const limit = + currentMailboxSize > THREADS_SIZE ? currentMailboxSize : undefined; if (labelIds && isRenderingMailbox) { if (labelIds.includes(currentLabelId)) { this.props.onLoadThreads( diff --git a/email_mailbox/src/components/Threads.js b/email_mailbox/src/components/Threads.js index 4bf4af4d7..d0c0e4d48 100644 --- a/email_mailbox/src/components/Threads.js +++ b/email_mailbox/src/components/Threads.js @@ -75,6 +75,7 @@ const Threads = props => ( )} {props.threads.map((thread, index) => { diff --git a/email_mailbox/src/utils/FetchUtils.js b/email_mailbox/src/utils/FetchUtils.js index 3c51caaa2..ac2e26bf3 100644 --- a/email_mailbox/src/utils/FetchUtils.js +++ b/email_mailbox/src/utils/FetchUtils.js @@ -134,24 +134,28 @@ export const fetchGetSingleEvent = async ({ rowId, optionalToken }) => { method: 'GET', optionalToken }); - if (res.status === 200) { - const jsonRes = await res.json(); - const eventResponse = { - cmd: jsonRes.cmd, - rowid: jsonRes.rowid, - params: JSON.parse(jsonRes.params) - }; - return eventResponse; - } - if (res.status === 404) { - return {}; - } - const expiredResponse = await checkExpiredSession({ - response: { status: res.status }, - initialRequest: fetchGetSingleEvent, - requestParams: { rowId, optionalToken } - }); - if (expiredResponse.status === INITIAL_REQUEST_EMPTY_STATUS) { - return await fetchGetSingleEvent({ rowId, optionalToken }); + switch (res.status) { + case PENDING_EVENTS_STATUS_OK: { + const jsonRes = await res.json(); + const eventResponse = { + cmd: jsonRes.cmd, + rowid: jsonRes.rowid, + params: JSON.parse(jsonRes.params) + }; + return eventResponse; + } + case NO_EVENTS_STATUS: + case 404: + return undefined; + default: { + const expiredResponse = await checkExpiredSession({ + response: { status: res.status }, + initialRequest: fetchGetSingleEvent, + requestParams: { rowId, optionalToken } + }); + if (expiredResponse.status === INITIAL_REQUEST_EMPTY_STATUS) { + return await fetchGetSingleEvent({ rowId, optionalToken }); + } + } } }; diff --git a/email_mailbox/src/utils/electronEventInterface.js b/email_mailbox/src/utils/electronEventInterface.js index 516e0cf6c..2978e5f05 100644 --- a/email_mailbox/src/utils/electronEventInterface.js +++ b/email_mailbox/src/utils/electronEventInterface.js @@ -27,6 +27,7 @@ import { getLabelsByText, logoutApp, openFilledComposerWindow, + reportContentUnencrypted, restartSocket, sendEndLinkDevicesEvent, sendEndSyncDevicesEvent, @@ -188,8 +189,22 @@ const parseAndStoreEventsBatch = async ({ events, hasMoreEvents }) => { const parseAndDispatchEvent = async event => { try { - const { rowid } = await handleEvent(event); + const { + feedItemAdded, + rowid, + labelIds, + threadIds, + labels, + badgeLabelIds + } = await handleEvent(event); if (rowid) await setEventAsHandled([rowid]); + emitter.emit(Event.STORE_LOAD, { + feedItemHasAdded: feedItemAdded, + labelIds, + threadIds, + labels, + badgeLabelIds + }); } catch (error) { // eslint-disable-next-line no-console console.error(error); @@ -404,8 +419,8 @@ const handleNewMessageEvent = async ({ rowid, params }) => { ? contactSpamToCheck[0].spamScore > 1 : false; const isSpam = - labels & !isContactSpamer - ? labels.find(label => label === LabelType.spam.text) + labels && !isContactSpamer + ? !!labels.find(label => label === LabelType.spam.text) : isContactSpamer; const InboxLabelId = LabelType.inbox.id; const SentLabelId = LabelType.sent.id; @@ -435,6 +450,7 @@ const handleNewMessageEvent = async ({ rowid, params }) => { headers = decryptedHeaders; } catch (e) { body = 'Content unencrypted'; + reportContentUnencrypted(e); } let myFileKeys; if (fileKeys) { @@ -1059,14 +1075,7 @@ ipcRenderer.on( } ); -ipcRenderer.on('composer-email-delete', (ev, { threadId, oldEmailId }) => { - if (threadId && oldEmailId) { - return emitter.emit(Event.UPDATE_THREAD_EMAILS, { - threadId, - oldEmailId, - badgeLabelIds: [LabelType.draft.id] - }); - } +ipcRenderer.on('composer-email-delete', (ev, { threadId }) => { emitter.emit(Event.STORE_LOAD, { labelIds: [LabelType.sent.id, LabelType.draft.id], badgeLabelIds: [LabelType.draft.id], @@ -1438,10 +1447,12 @@ ipcRenderer.on(NOTIFICATION_RECEIVED, async (_, { data }) => { if (isGettingEvents) return; isGettingEvents = true; const eventData = await fetchGetSingleEvent({ rowId: data.rowId }); - await parseAndDispatchEvent(eventData); - sendNewEmailNotification(); + if (eventData) { + await parseAndDispatchEvent(eventData); + sendNewEmailNotification(); + sendLoadEventsEvent({ showNotification: true }); + } isGettingEvents = false; - sendLoadEventsEvent({ showNotification: true }); break; } case NOTIFICATION_ACTIONS.OPEN_EMAIL: { diff --git a/email_mailbox/src/utils/ipc.js b/email_mailbox/src/utils/ipc.js index 079b127e6..635002218 100644 --- a/email_mailbox/src/utils/ipc.js +++ b/email_mailbox/src/utils/ipc.js @@ -521,3 +521,9 @@ export const restoreBackupEncrypted = async params => { export const restoreBackupUnencrypted = async params => { return await callMain('restore-backup-unencrypted', params); }; + +/* Nucleus +----------------------------- */ +export const reportContentUnencrypted = async error => { + return await callMain('nucleups-report-content-unencrypted', error); +};