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 (