summaryrefslogtreecommitdiffhomepage
path: root/app/containers/SupportPage.js
diff options
context:
space:
mode:
authorErik Larkö <erik@mullvad.net>2017-11-02 10:51:12 +0100
committerErik Larkö <erik@mullvad.net>2017-11-09 12:42:56 +0100
commitae8e86bb81cc722d9667c439d3508660398da707 (patch)
tree05a467e918755c290194df119d5977862d1e6f4b /app/containers/SupportPage.js
parent01d617bab821f25412f4874354468afea30bd7b9 (diff)
downloadmullvadvpn-ae8e86bb81cc722d9667c439d3508660398da707.tar.xz
mullvadvpn-ae8e86bb81cc722d9667c439d3508660398da707.zip
Problem report
Diffstat (limited to 'app/containers/SupportPage.js')
-rw-r--r--app/containers/SupportPage.js75
1 files changed, 73 insertions, 2 deletions
diff --git a/app/containers/SupportPage.js b/app/containers/SupportPage.js
index fe579395f6..e57985d7d3 100644
--- a/app/containers/SupportPage.js
+++ b/app/containers/SupportPage.js
@@ -1,16 +1,87 @@
+import log from 'electron-log';
+import { shell, ipcRenderer } from 'electron';
import { connect } from 'react-redux';
import { push } from 'react-router-redux';
import Support from '../components/Support';
+import { resolveBin } from '../lib/proc';
+import { execFile } from 'child_process';
+import uuid from 'uuid';
const mapStateToProps = (state) => {
return state;
};
+const unAnsweredIpcCalls = new Map();
+function reapIpcCall(id) {
+ const promise = unAnsweredIpcCalls.get(id);
+ unAnsweredIpcCalls.delete(id);
+
+ if (promise) {
+ promise.reject(new Error('Timed out'));
+ }
+}
+ipcRenderer.on('collect-logs-reply', (_event, id, err, reportId) => {
+ const promise = unAnsweredIpcCalls.get(id);
+ unAnsweredIpcCalls.delete(id);
+
+ if (err) {
+ promise.reject(err);
+ } else if (promise) {
+ promise.resolve(reportId);
+ }
+});
+
const mapDispatchToProps = (dispatch, _props) => {
return {
onClose: () => dispatch(push('/settings')),
- onViewLogs: () => {},
- onSend: (_report) => {}
+
+ onCollectLog: () => {
+ return new Promise((resolve, reject) => {
+
+ const id = uuid.v4();
+ unAnsweredIpcCalls.set(id, { resolve, reject });
+ ipcRenderer.send('collect-logs', id);
+ setTimeout(() => reapIpcCall(id), 1000);
+ })
+ .catch((e) => {
+ const { err, stdout } = e;
+ log.error('Failed collecting problem report', err);
+ log.error(' stdout: ' + stdout);
+
+ throw e;
+ });
+ },
+
+ onViewLog: (path) => shell.openItem(path),
+
+ onSend: (email, message, savedReport) => {
+
+ const args = ['send',
+ '--email', email,
+ '--message', message,
+ '--report', savedReport,
+ ];
+
+ const binPath = resolveBin('problem-report');
+
+ return new Promise((resolve, reject) => {
+ execFile(binPath, args, { windowsHide: true }, (err, stdout, stderr) => {
+ if (err) {
+ reject({ err, stdout, stderr });
+ } else {
+ log.debug('Report sent');
+ resolve();
+ }
+ });
+ })
+ .catch((e) => {
+ const { err, stdout } = e;
+ log.error('Failed sending problem report', err);
+ log.error(' stdout: ' + stdout);
+
+ throw e;
+ });
+ }
};
};