diff options
| author | Erik Larkö <erik@mullvad.net> | 2017-11-02 10:51:12 +0100 |
|---|---|---|
| committer | Erik Larkö <erik@mullvad.net> | 2017-11-09 12:42:56 +0100 |
| commit | ae8e86bb81cc722d9667c439d3508660398da707 (patch) | |
| tree | 05a467e918755c290194df119d5977862d1e6f4b /app/containers/SupportPage.js | |
| parent | 01d617bab821f25412f4874354468afea30bd7b9 (diff) | |
| download | mullvadvpn-ae8e86bb81cc722d9667c439d3508660398da707.tar.xz mullvadvpn-ae8e86bb81cc722d9667c439d3508660398da707.zip | |
Problem report
Diffstat (limited to 'app/containers/SupportPage.js')
| -rw-r--r-- | app/containers/SupportPage.js | 75 |
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; + }); + } }; }; |
