Skip to content

Commit dd31b97

Browse files
author
Erika Perugachi
authored
Merge pull request #1201 from Hirobreak/daniel-fixes1
UX Improvements
2 parents 998ebb6 + 08291ce commit dd31b97

File tree

23 files changed

+284
-141
lines changed

23 files changed

+284
-141
lines changed

electron_app/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@
135135
"electron-builder": "^20.37.0"
136136
},
137137
"dependencies": {
138-
"@criptext/api": "0.15.21",
138+
"@criptext/api": "^0.15.22",
139139
"@criptext/data-transfer-client": "^0.1.1",
140140
"@criptext/electron-better-ipc": "^0.1.2-rc5",
141141
"@criptext/electron-push-receiver": "^2.1.2-rc1",

electron_app/src/ipc/mailbox.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const {
1818
const { getUsername, genUUID } = require('./../utils/stringUtils');
1919
const { showWindows } = require('./../windows/windowUtils');
2020
const { restartSocket } = require('./../socketClient');
21+
const { checkAlive } = require('./../reachabilityTask');
2122

2223
ipc.answerRenderer('close-mailbox', () => {
2324
mailboxWindow.close();
@@ -124,4 +125,7 @@ ipc.answerRenderer('check-for-updates', showDialog => {
124125

125126
ipc.answerRenderer('generate-label-uuid', genUUID);
126127

127-
ipc.answerRenderer('restart-socket', jwt => restartSocket({ jwt }));
128+
ipc.answerRenderer('restart-connection', jwt => {
129+
restartSocket({ jwt });
130+
checkAlive(true);
131+
});
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
const { SERVER_URL } = require('./utils/const');
2+
const globalManager = require('./globalManager');
3+
const mailboxWindow = require('./windows/mailbox');
4+
const { processEventsQueue } = require('./eventQueueManager');
5+
const reconnectDelay = 2000;
6+
const NETWORK_STATUS = {
7+
ONLINE: 'online',
8+
OFFLINE: 'offline'
9+
};
10+
const https = require('https');
11+
const normalPingDelayMs = 15000;
12+
const failedPingDelayMs = 5000;
13+
let pingFailedCounter = 0;
14+
let reachabilityTask = null;
15+
let checkingConnectionToServer = false;
16+
17+
const setConnectionStatus = networkStatus => {
18+
const prevNetworkStatus = globalManager.internetConnection.getStatus();
19+
switch (networkStatus) {
20+
case NETWORK_STATUS.ONLINE: {
21+
if (prevNetworkStatus === true) return;
22+
if (prevNetworkStatus === false) {
23+
mailboxWindow.send('network-connection-established');
24+
}
25+
globalManager.internetConnection.setStatus(true);
26+
processEventsQueue();
27+
break;
28+
}
29+
case NETWORK_STATUS.OFFLINE: {
30+
if (prevNetworkStatus === false) return;
31+
setTimeout(() => {
32+
mailboxWindow.send('lost-network-connection');
33+
}, reconnectDelay);
34+
globalManager.internetConnection.setStatus(false);
35+
break;
36+
}
37+
default:
38+
break;
39+
}
40+
};
41+
42+
/* Check alive
43+
----------------------*/
44+
45+
const checkAlive = async force => {
46+
if (checkingConnectionToServer) return;
47+
checkingConnectionToServer = true;
48+
if (reachabilityTask && !force) {
49+
checkingConnectionToServer = false;
50+
return;
51+
}
52+
clearTimeout(reachabilityTask);
53+
const prevNetworkStatus = globalManager.internetConnection.getStatus();
54+
let delayTime = normalPingDelayMs;
55+
try {
56+
await ping();
57+
if (prevNetworkStatus !== NETWORK_STATUS.ONLINE) {
58+
setConnectionStatus(NETWORK_STATUS.ONLINE);
59+
}
60+
} catch (ex) {
61+
pingFailedCounter++;
62+
delayTime = failedPingDelayMs;
63+
if (pingFailedCounter > 3 && prevNetworkStatus !== NETWORK_STATUS.OFFLINE) {
64+
setConnectionStatus(NETWORK_STATUS.OFFLINE);
65+
pingFailedCounter = 0;
66+
}
67+
}
68+
reachabilityTask = setTimeout(() => {
69+
reachabilityTask = null;
70+
checkAlive();
71+
}, delayTime);
72+
checkingConnectionToServer = false;
73+
};
74+
75+
const ping = () => {
76+
return new Promise((resolve, reject) => {
77+
const req = https.get(`${SERVER_URL}/ping`, () => {
78+
resolve();
79+
});
80+
81+
req.on('error', () => {
82+
reject();
83+
});
84+
85+
req.end();
86+
});
87+
};
88+
89+
module.exports = {
90+
checkAlive
91+
};

electron_app/src/socketClient.js

Lines changed: 3 additions & 100 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,14 @@
11
const { client: WebSocketClient } = require('websocket');
22
const { SOCKET_URL } = require('./utils/const');
3-
const { percentRegex } = require('./utils/RegexUtils');
4-
const globalManager = require('./globalManager');
5-
const mailboxWindow = require('./windows/mailbox');
6-
const { processEventsQueue } = require('./eventQueueManager');
73
let client, reconnect, messageListener, socketConnection;
84
let shouldReconnect = true;
95
const reconnectDelay = 2000;
10-
const NETWORK_STATUS = {
11-
ONLINE: 'online',
12-
OFFLINE: 'offline'
13-
};
14-
const exec = require('child_process').exec;
15-
const normalPingDelayMs = 15000;
16-
const failedPingDelayMs = 5000;
17-
let pingFailedCounter = 0;
18-
let checkConnTimeout = null;
19-
let checkDelay = normalPingDelayMs;
206

217
const setMessageListener = mListener => (messageListener = mListener);
228

239
const disconnect = () => {
2410
if (!socketConnection) return;
2511
try {
26-
clearInterval(checkConnTimeout);
2712
socketConnection.on('close', () => {
2813
socketConnection = undefined;
2914
});
@@ -35,29 +20,25 @@ const disconnect = () => {
3520

3621
const start = ({ jwt }) => {
3722
client = new WebSocketClient();
38-
pingFailedCounter = 0;
39-
checkDelay = normalPingDelayMs;
4023
client.connect(
4124
`${SOCKET_URL}?token=${jwt}`,
4225
'criptext-protocol'
4326
);
4427

4528
client.on('connectFailed', error => {
46-
handleError(error, 'Failed to connect');
4729
if (shouldReconnect) {
4830
reconnect();
4931
}
32+
log(error);
5033
});
5134

5235
client.on('connect', connection => {
5336
socketConnection = connection;
54-
setConnectionStatus(NETWORK_STATUS.ONLINE);
5537
log('Socket connection opened');
56-
checkAlive();
5738

5839
connection.on('error', error => {
59-
handleError(error, 'Connection Error');
6040
reconnect();
41+
log(error);
6142
});
6243
connection.on('close', () => {
6344
log('Socket connection closed');
@@ -84,86 +65,8 @@ const log = message => {
8465
}
8566
};
8667

87-
const handleError = (error, errorMessage) => {
88-
if (error.code === 'ENOTFOUND') {
89-
setConnectionStatus(NETWORK_STATUS.OFFLINE);
90-
}
91-
log(`${errorMessage || 'Error'}: ${error.toString()}`);
92-
};
93-
94-
const setConnectionStatus = networkStatus => {
95-
const prevNetworkStatus = globalManager.internetConnection.getStatus();
96-
switch (networkStatus) {
97-
case NETWORK_STATUS.ONLINE: {
98-
if (prevNetworkStatus === true) return;
99-
if (prevNetworkStatus === false) {
100-
mailboxWindow.send('network-connection-established');
101-
}
102-
globalManager.internetConnection.setStatus(true);
103-
processEventsQueue();
104-
break;
105-
}
106-
case NETWORK_STATUS.OFFLINE: {
107-
if (prevNetworkStatus === false) return;
108-
setTimeout(() => {
109-
mailboxWindow.send('lost-network-connection');
110-
}, reconnectDelay);
111-
globalManager.internetConnection.setStatus(false);
112-
break;
113-
}
114-
default:
115-
break;
116-
}
117-
};
118-
119-
/* Check alive
120-
----------------------*/
121-
const isWindows = process.platform === 'win32';
122-
123-
const getDelay = () => checkDelay;
124-
125-
const checkAlive = () => {
126-
checkConnTimeout = setInterval(() => {
127-
exec(
128-
`ping -${isWindows ? 'n' : 'c'} 1 www.criptext.com`,
129-
{ encoding: 'utf8', windowsHide: true },
130-
(err, stdout, stderr) => {
131-
let totalLost = 0;
132-
if (stdout) {
133-
const stdoutString = stdout.toString();
134-
if (stdoutString) {
135-
const match = stdoutString.match(percentRegex);
136-
if (match) {
137-
const [lostPackages] = match;
138-
totalLost = Number(lostPackages.replace('%', ''));
139-
}
140-
}
141-
}
142-
if (err !== null || !!stderr || totalLost > 50) {
143-
if (pingFailedCounter === 0) {
144-
checkDelay = failedPingDelayMs;
145-
clearInterval(checkConnTimeout);
146-
checkAlive();
147-
} else if (pingFailedCounter + 1 > 2) {
148-
setConnectionStatus(NETWORK_STATUS.OFFLINE);
149-
}
150-
pingFailedCounter++;
151-
} else if (stdout) {
152-
setConnectionStatus(NETWORK_STATUS.ONLINE);
153-
if (pingFailedCounter > 0) {
154-
pingFailedCounter = 0;
155-
checkDelay = normalPingDelayMs;
156-
clearInterval(checkConnTimeout);
157-
checkAlive();
158-
}
159-
}
160-
}
161-
);
162-
}, getDelay());
163-
};
164-
16568
process.on('exit', () => {
166-
checkConnTimeout = null;
69+
disconnect();
16770
});
16871

16972
const restartSocket = ({ jwt }) => {

electron_app/src/windows/mailbox.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ const show = async ({ firstOpenApp = false }) => {
106106
}
107107
} else if (!existVisibleWindow.length || !mailboxWindow) {
108108
await create();
109-
mailboxWindow.on('ready-to-show', () => {
109+
mailboxWindow.webContents.on('dom-ready', () => {
110110
mailboxWindow.show();
111111
createTrayIcon();
112112
if (firstOpenApp) {

electron_app/yarn.lock

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,20 @@
103103
lodash "^4.2.0"
104104
to-fast-properties "^2.0.0"
105105

106-
"@criptext/api@^0.15.21":
106+
"@criptext/[email protected]":
107107
version "0.15.21"
108108
resolved "https://registry.yarnpkg.com/@criptext/api/-/api-0.15.21.tgz#7b4fc4176cb52b4ff8b0088d818a5a8df9ace250"
109109
integrity sha512-A0r8A+bCy+IT89MuyvgQBbt7GiYAS4ZR9fbZJ8Zy7Yr/VQZGfbjQS+DAMMyzhEE2k7X8V5x4+lu6Uz2xM/lM/A==
110110
dependencies:
111111
superagent "^3.8.2"
112112

113+
"@criptext/api@^0.15.22":
114+
version "0.15.22"
115+
resolved "https://registry.yarnpkg.com/@criptext/api/-/api-0.15.22.tgz#9488e4b513d31878a6b24de13ad09d70ed990be6"
116+
integrity sha512-a6ZcNpnUmd6KwKdsMwbH46Opfg+95qVXSxoq7YCQrOVvfGYcG3beSmm7eL1sFZQyEWaeovI3yrFL7hud0rQPow==
117+
dependencies:
118+
superagent "^3.8.2"
119+
113120
"@criptext/data-transfer-client@^0.1.1":
114121
version "0.1.1"
115122
resolved "https://registry.yarnpkg.com/@criptext/data-transfer-client/-/data-transfer-client-0.1.1.tgz#a7f1b446106a71aa0a381fe0042868c18ae8b746"

email_login/src/components/RecoveryCodePopup.js

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import React from 'react';
22
import PropTypes from 'prop-types';
33
import Button, { ButtonType } from './Button';
44
import string from '../lang';
5+
import './recoverycodepopup.scss';
56

67
const { recoveryCode } = string.popUp;
78

@@ -30,21 +31,25 @@ const RecoveryCodePopup = props => (
3031
const Content = props => (
3132
<div className="popup-items">
3233
<p>
33-
{props.codeAlreadySent ? recoveryCode.alreadySent : recoveryCode.message}
34+
{string.formatString(
35+
props.codeAlreadySent ? recoveryCode.alreadySent : recoveryCode.message,
36+
<b>{props.recoveryEmail || ''}</b>
37+
)}
3438
</p>
35-
<div className="popup-input">
39+
<div>
3640
<input
41+
className="recovery-code-input"
3742
type="text"
3843
value={props.valueInputCode}
3944
onChange={props.onInputCodeChange}
4045
onKeyDown={props.onKeyDown}
4146
/>
4247
</div>
43-
{props.errorInputCode && (
44-
<div>
48+
<div className="recovery-code-input-error">
49+
{props.errorInputCode && (
4550
<span className="popup-error">{props.errorInputCode}</span>
46-
</div>
47-
)}
51+
)}
52+
</div>
4853
</div>
4954
);
5055

@@ -54,6 +59,7 @@ Content.propTypes = {
5459
errorInputCode: PropTypes.string,
5560
onKeyDown: PropTypes.func,
5661
onInputCodeChange: PropTypes.func,
62+
recoveryEmail: PropTypes.string,
5763
validateButtonState: PropTypes.number,
5864
valueInputCode: PropTypes.string
5965
};

email_login/src/components/RecoveryCodeWrapperPopup.js

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@ class RecoveryCodeWrapperPopup extends Component {
1616
valueInputCode: '',
1717
errorInputCode: null,
1818
codeAlreadySent: false,
19-
validateButtonState: ButtonState.ENABLED
19+
validateButtonState: ButtonState.ENABLED,
20+
recoveryEmail: null
2021
};
2122
}
2223

@@ -31,6 +32,7 @@ class RecoveryCodeWrapperPopup extends Component {
3132
codeAlreadySent={this.state.codeAlreadySent}
3233
validateButtonState={this.state.validateButtonState}
3334
onKeyDown={this.handleKeyDown}
35+
recoveryEmail={this.state.recoveryEmail}
3436
/>
3537
);
3638
}
@@ -62,19 +64,24 @@ class RecoveryCodeWrapperPopup extends Component {
6264
resendRecoveryCodeEnable: false
6365
},
6466
async () => {
65-
const { status } = await sendRecoveryCode({
67+
const res = await sendRecoveryCode({
6668
jwt: this.props.jwt,
6769
newDeviceData: {
6870
recipientId,
6971
domain
7072
}
7173
});
74+
const { status } = res;
7275
switch (status) {
7376
case 200:
77+
this.setState({
78+
recoveryEmail: res.body.address
79+
});
7480
return;
7581
case 400:
7682
this.setState({
77-
codeAlreadySent: true
83+
codeAlreadySent: true,
84+
recoveryEmail: res.body.address
7885
});
7986
return;
8087
default:

0 commit comments

Comments
 (0)