From 90d830a2818b5a6b98ab90604c3a19ab116b4cc4 Mon Sep 17 00:00:00 2001 From: Julian Adams Date: Tue, 27 Nov 2018 09:47:02 -0500 Subject: [PATCH] Websocket: Detect lost connection. Fix #535 --- electron_app/src/socketClient.js | 13 +++++++++++-- email_mailbox/src/components/MessageWrapper.js | 6 +++++- email_mailbox/src/data/message.js | 11 +++-------- email_mailbox/src/lang/en.js | 3 +-- email_mailbox/src/lang/es.js | 5 ++--- .../src/utils/electronEventInterface.js | 16 ++++++++++++++++ 6 files changed, 38 insertions(+), 16 deletions(-) diff --git a/electron_app/src/socketClient.js b/electron_app/src/socketClient.js index d5200fd01..0391ef940 100644 --- a/electron_app/src/socketClient.js +++ b/electron_app/src/socketClient.js @@ -4,6 +4,7 @@ const SOCKET_URL = process.env.NODE_ENV === 'development' ? DEV_SOCKET_URL : PROD_SOCKET_URL; let client, reconnect, messageListener, socketConnection; const reconnectDelay = 2000; +const mailboxWindow = require('./windows/mailbox'); const globalManager = require('./globalManager'); const NETWORK_STATUS = { ONLINE: 'online', @@ -78,13 +79,20 @@ const handleError = (error, errorMessage) => { }; const setConnectionStatus = networkStatus => { + const prevNetworkStatus = globalManager.internetConnection.getStatus(); switch (networkStatus) { case NETWORK_STATUS.ONLINE: { - globalManager.internetConnection.setStatus(true); + if (prevNetworkStatus !== true) { + globalManager.internetConnection.setStatus(true); + mailboxWindow.send('network-connection-established', null); + } break; } case NETWORK_STATUS.OFFLINE: { - globalManager.internetConnection.setStatus(false); + if (prevNetworkStatus !== false) { + globalManager.internetConnection.setStatus(false); + mailboxWindow.send('lost-network-connection', null); + } break; } default: @@ -100,6 +108,7 @@ const initPingParams = () => { const checkAlive = () => { if (shouldSendPing === undefined || shouldSendPing === '1') { shouldSendPing = 0; + setConnectionStatus(NETWORK_STATUS.ONLINE); } else { setConnectionStatus(NETWORK_STATUS.OFFLINE); log('Error: Lost Connection. Check internet'); diff --git a/email_mailbox/src/components/MessageWrapper.js b/email_mailbox/src/components/MessageWrapper.js index 304e0cd2d..465c537e0 100644 --- a/email_mailbox/src/components/MessageWrapper.js +++ b/email_mailbox/src/components/MessageWrapper.js @@ -2,6 +2,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import Message from './Message'; import { Event, addEvent, removeEvent } from '../utils/electronEventInterface'; +import { messagePriorities } from '../data/message'; const MESSAGE_DURATION = 5000; const QUESTION_DURATION = 5 * 60 * 1000; @@ -106,7 +107,10 @@ class MessageWrapper extends Component { displayMessage: true }; this.setState(newState, () => { - const duration = ask ? QUESTION_DURATION : MESSAGE_DURATION; + const isAskOrNetworkError = ask || priority === messagePriorities.HIGH; + const duration = isAskOrNetworkError + ? QUESTION_DURATION + : MESSAGE_DURATION; this.hideMessageTimeout = setTimeout(() => { this.hideMessage(); }, duration); diff --git a/email_mailbox/src/data/message.js b/email_mailbox/src/data/message.js index 596716a8e..64e8362ef 100644 --- a/email_mailbox/src/data/message.js +++ b/email_mailbox/src/data/message.js @@ -15,9 +15,6 @@ const actionHandlerKeys = { }, success: { emailSent: 'view-message' - }, - error: { - network: 'try-reconnect' } }; @@ -112,10 +109,8 @@ const messagesContent = { description: string.messages.fetchEmails.description }, network: { - priority: messagePriorities.TOP, - description: string.messages.network.description, - action: string.messages.network.action, - actionHandlerKey: actionHandlerKeys.error.network + priority: messagePriorities.HIGH, + description: string.messages.network.description }, recoveryEmailChanged: { priority: messagePriorities.MEDIUM, @@ -171,4 +166,4 @@ const messagesContent = { } }; -export { messagesContent as default, actionHandlerKeys }; +export { messagesContent as default, actionHandlerKeys, messagePriorities }; diff --git a/email_mailbox/src/lang/en.js b/email_mailbox/src/lang/en.js index 595c6e7c5..2c8a166ae 100644 --- a/email_mailbox/src/lang/en.js +++ b/email_mailbox/src/lang/en.js @@ -114,8 +114,7 @@ export default { description: 'Connection reestablished' }, network: { - description: 'Not connected, conecting in 10s', - action: 'Try Now' + description: 'Not connected. Trying to reconnect' }, new_device: { ask: 'Are you trying to access from' diff --git a/email_mailbox/src/lang/es.js b/email_mailbox/src/lang/es.js index b3c5cabc4..119c92c30 100644 --- a/email_mailbox/src/lang/es.js +++ b/email_mailbox/src/lang/es.js @@ -112,11 +112,10 @@ export default { 'Falló al pedir emails. Revisa tu conexión e intenta de nuevo' }, internet: { - description: 'Conexión restalecida' + description: 'Conexión restablecida' }, network: { - description: 'Sin conexión, conectando en 10s', - action: 'Intentar ahora' + description: 'Sin conexión. Intentando reconectar' }, new_device: { ask: 'Estás tratando de acceder desde' diff --git a/email_mailbox/src/utils/electronEventInterface.js b/email_mailbox/src/utils/electronEventInterface.js index 8bc539d24..c93accea5 100644 --- a/email_mailbox/src/utils/electronEventInterface.js +++ b/email_mailbox/src/utils/electronEventInterface.js @@ -771,6 +771,22 @@ ipcRenderer.on( } ); +ipcRenderer.on('network-connection-established', () => { + const messageData = { + ...Messages.establish.internet, + type: MessageType.ESTABLISH + }; + emitter.emit(Event.DISPLAY_MESSAGE, messageData); +}); + +ipcRenderer.on('lost-network-connection', () => { + const messageData = { + ...Messages.error.network, + type: MessageType.ERROR + }; + emitter.emit(Event.DISPLAY_MESSAGE, messageData); +}); + /* Window events ----------------------------- */ export const sendOpenEventErrorMessage = () => {