Skip to content

Commit c1290fd

Browse files
authored
Merge pull request element-hq#3061 from vector-im/kegan/rageshake-glue
Glue the dialog to rageshake: honour sendLogs flag.
2 parents 527c988 + 0a9f02a commit c1290fd

3 files changed

Lines changed: 171 additions & 40 deletions

File tree

src/component-index.js

Lines changed: 31 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -27,60 +27,62 @@ limitations under the License.
2727
module.exports.components = require('matrix-react-sdk/lib/component-index').components;
2828

2929
import structures$BottomLeftMenu from './components/structures/BottomLeftMenu';
30-
module.exports.components['structures.BottomLeftMenu'] = structures$BottomLeftMenu;
30+
structures$BottomLeftMenu && (module.exports.components['structures.BottomLeftMenu'] = structures$BottomLeftMenu);
3131
import structures$CompatibilityPage from './components/structures/CompatibilityPage';
32-
module.exports.components['structures.CompatibilityPage'] = structures$CompatibilityPage;
32+
structures$CompatibilityPage && (module.exports.components['structures.CompatibilityPage'] = structures$CompatibilityPage);
3333
import structures$LeftPanel from './components/structures/LeftPanel';
34-
module.exports.components['structures.LeftPanel'] = structures$LeftPanel;
34+
structures$LeftPanel && (module.exports.components['structures.LeftPanel'] = structures$LeftPanel);
3535
import structures$RightPanel from './components/structures/RightPanel';
36-
module.exports.components['structures.RightPanel'] = structures$RightPanel;
36+
structures$RightPanel && (module.exports.components['structures.RightPanel'] = structures$RightPanel);
3737
import structures$RoomDirectory from './components/structures/RoomDirectory';
38-
module.exports.components['structures.RoomDirectory'] = structures$RoomDirectory;
38+
structures$RoomDirectory && (module.exports.components['structures.RoomDirectory'] = structures$RoomDirectory);
3939
import structures$RoomSubList from './components/structures/RoomSubList';
40-
module.exports.components['structures.RoomSubList'] = structures$RoomSubList;
40+
structures$RoomSubList && (module.exports.components['structures.RoomSubList'] = structures$RoomSubList);
4141
import structures$SearchBox from './components/structures/SearchBox';
42-
module.exports.components['structures.SearchBox'] = structures$SearchBox;
42+
structures$SearchBox && (module.exports.components['structures.SearchBox'] = structures$SearchBox);
4343
import structures$ViewSource from './components/structures/ViewSource';
44-
module.exports.components['structures.ViewSource'] = structures$ViewSource;
44+
structures$ViewSource && (module.exports.components['structures.ViewSource'] = structures$ViewSource);
4545
import views$context_menus$MessageContextMenu from './components/views/context_menus/MessageContextMenu';
46-
module.exports.components['views.context_menus.MessageContextMenu'] = views$context_menus$MessageContextMenu;
46+
views$context_menus$MessageContextMenu && (module.exports.components['views.context_menus.MessageContextMenu'] = views$context_menus$MessageContextMenu);
4747
import views$context_menus$NotificationStateContextMenu from './components/views/context_menus/NotificationStateContextMenu';
48-
module.exports.components['views.context_menus.NotificationStateContextMenu'] = views$context_menus$NotificationStateContextMenu;
48+
views$context_menus$NotificationStateContextMenu && (module.exports.components['views.context_menus.NotificationStateContextMenu'] = views$context_menus$NotificationStateContextMenu);
4949
import views$context_menus$RoomTagContextMenu from './components/views/context_menus/RoomTagContextMenu';
50-
module.exports.components['views.context_menus.RoomTagContextMenu'] = views$context_menus$RoomTagContextMenu;
50+
views$context_menus$RoomTagContextMenu && (module.exports.components['views.context_menus.RoomTagContextMenu'] = views$context_menus$RoomTagContextMenu);
51+
import views$dialogs$BugReportDialog from './components/views/dialogs/BugReportDialog';
52+
views$dialogs$BugReportDialog && (module.exports.components['views.dialogs.BugReportDialog'] = views$dialogs$BugReportDialog);
5153
import views$dialogs$ChangelogDialog from './components/views/dialogs/ChangelogDialog';
52-
module.exports.components['views.dialogs.ChangelogDialog'] = views$dialogs$ChangelogDialog;
54+
views$dialogs$ChangelogDialog && (module.exports.components['views.dialogs.ChangelogDialog'] = views$dialogs$ChangelogDialog);
5355
import views$directory$NetworkDropdown from './components/views/directory/NetworkDropdown';
54-
module.exports.components['views.directory.NetworkDropdown'] = views$directory$NetworkDropdown;
56+
views$directory$NetworkDropdown && (module.exports.components['views.directory.NetworkDropdown'] = views$directory$NetworkDropdown);
5557
import views$elements$ImageView from './components/views/elements/ImageView';
56-
module.exports.components['views.elements.ImageView'] = views$elements$ImageView;
58+
views$elements$ImageView && (module.exports.components['views.elements.ImageView'] = views$elements$ImageView);
5759
import views$elements$Spinner from './components/views/elements/Spinner';
58-
module.exports.components['views.elements.Spinner'] = views$elements$Spinner;
60+
views$elements$Spinner && (module.exports.components['views.elements.Spinner'] = views$elements$Spinner);
5961
import views$globals$GuestWarningBar from './components/views/globals/GuestWarningBar';
60-
module.exports.components['views.globals.GuestWarningBar'] = views$globals$GuestWarningBar;
62+
views$globals$GuestWarningBar && (module.exports.components['views.globals.GuestWarningBar'] = views$globals$GuestWarningBar);
6163
import views$globals$MatrixToolbar from './components/views/globals/MatrixToolbar';
62-
module.exports.components['views.globals.MatrixToolbar'] = views$globals$MatrixToolbar;
64+
views$globals$MatrixToolbar && (module.exports.components['views.globals.MatrixToolbar'] = views$globals$MatrixToolbar);
6365
import views$globals$NewVersionBar from './components/views/globals/NewVersionBar';
64-
module.exports.components['views.globals.NewVersionBar'] = views$globals$NewVersionBar;
66+
views$globals$NewVersionBar && (module.exports.components['views.globals.NewVersionBar'] = views$globals$NewVersionBar);
6567
import views$login$VectorCustomServerDialog from './components/views/login/VectorCustomServerDialog';
66-
module.exports.components['views.login.VectorCustomServerDialog'] = views$login$VectorCustomServerDialog;
68+
views$login$VectorCustomServerDialog && (module.exports.components['views.login.VectorCustomServerDialog'] = views$login$VectorCustomServerDialog);
6769
import views$login$VectorLoginFooter from './components/views/login/VectorLoginFooter';
68-
module.exports.components['views.login.VectorLoginFooter'] = views$login$VectorLoginFooter;
70+
views$login$VectorLoginFooter && (module.exports.components['views.login.VectorLoginFooter'] = views$login$VectorLoginFooter);
6971
import views$login$VectorLoginHeader from './components/views/login/VectorLoginHeader';
70-
module.exports.components['views.login.VectorLoginHeader'] = views$login$VectorLoginHeader;
72+
views$login$VectorLoginHeader && (module.exports.components['views.login.VectorLoginHeader'] = views$login$VectorLoginHeader);
7173
import views$messages$DateSeparator from './components/views/messages/DateSeparator';
72-
module.exports.components['views.messages.DateSeparator'] = views$messages$DateSeparator;
74+
views$messages$DateSeparator && (module.exports.components['views.messages.DateSeparator'] = views$messages$DateSeparator);
7375
import views$messages$MessageTimestamp from './components/views/messages/MessageTimestamp';
74-
module.exports.components['views.messages.MessageTimestamp'] = views$messages$MessageTimestamp;
76+
views$messages$MessageTimestamp && (module.exports.components['views.messages.MessageTimestamp'] = views$messages$MessageTimestamp);
7577
import views$rooms$DNDRoomTile from './components/views/rooms/DNDRoomTile';
76-
module.exports.components['views.rooms.DNDRoomTile'] = views$rooms$DNDRoomTile;
78+
views$rooms$DNDRoomTile && (module.exports.components['views.rooms.DNDRoomTile'] = views$rooms$DNDRoomTile);
7779
import views$rooms$RoomDropTarget from './components/views/rooms/RoomDropTarget';
78-
module.exports.components['views.rooms.RoomDropTarget'] = views$rooms$RoomDropTarget;
80+
views$rooms$RoomDropTarget && (module.exports.components['views.rooms.RoomDropTarget'] = views$rooms$RoomDropTarget);
7981
import views$rooms$RoomTooltip from './components/views/rooms/RoomTooltip';
80-
module.exports.components['views.rooms.RoomTooltip'] = views$rooms$RoomTooltip;
82+
views$rooms$RoomTooltip && (module.exports.components['views.rooms.RoomTooltip'] = views$rooms$RoomTooltip);
8183
import views$rooms$SearchBar from './components/views/rooms/SearchBar';
82-
module.exports.components['views.rooms.SearchBar'] = views$rooms$SearchBar;
84+
views$rooms$SearchBar && (module.exports.components['views.rooms.SearchBar'] = views$rooms$SearchBar);
8385
import views$settings$IntegrationsManager from './components/views/settings/IntegrationsManager';
84-
module.exports.components['views.settings.IntegrationsManager'] = views$settings$IntegrationsManager;
86+
views$settings$IntegrationsManager && (module.exports.components['views.settings.IntegrationsManager'] = views$settings$IntegrationsManager);
8587
import views$settings$Notifications from './components/views/settings/Notifications';
86-
module.exports.components['views.settings.Notifications'] = views$settings$Notifications;
88+
views$settings$Notifications && (module.exports.components['views.settings.Notifications'] = views$settings$Notifications);
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
/*
2+
Copyright 2017 OpenMarket Ltd
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
import React from 'react';
18+
import sdk from 'matrix-react-sdk';
19+
import rageshake from '../../../vector/rageshake';
20+
21+
export default class BugReportDialog extends React.Component {
22+
constructor(props, context) {
23+
super(props, context);
24+
this.state = {
25+
sendLogs: true,
26+
busy: false,
27+
err: null,
28+
text: "",
29+
};
30+
this._onSubmit = this._onSubmit.bind(this);
31+
this._onCancel = this._onCancel.bind(this);
32+
this._onTextChange = this._onTextChange.bind(this);
33+
this._onSendLogsChange = this._onSendLogsChange.bind(this);
34+
}
35+
36+
_onCancel(ev) {
37+
this.props.onFinished(false);
38+
}
39+
40+
_onSubmit(ev) {
41+
const sendLogs = this.state.sendLogs;
42+
const userText = this.state.text;
43+
if (!sendLogs && userText.trim().length === 0) {
44+
this.setState({
45+
err: "Please describe the bug and/or send logs.",
46+
});
47+
return;
48+
}
49+
this.setState({ busy: true, err: null });
50+
rageshake.sendBugReport(userText, sendLogs).then(() => {
51+
this.setState({ busy: false });
52+
}, (err) => {
53+
this.setState({ busy: false, err: `Failed: ${err.message}` });
54+
});
55+
}
56+
57+
_onTextChange(ev) {
58+
this.setState({ text: ev.target.value });
59+
}
60+
61+
_onSendLogsChange(ev) {
62+
this.setState({ sendLogs: ev.target.checked });
63+
}
64+
65+
render() {
66+
const Loader = sdk.getComponent("elements.Spinner");
67+
68+
let error = null;
69+
if (this.state.err) {
70+
error = <div className="error">
71+
{this.state.err}
72+
</div>;
73+
}
74+
75+
const okLabel = this.state.busy ? <Loader /> : 'Send';
76+
77+
let cancelButton = null;
78+
if (!this.state.busy) {
79+
cancelButton = <button onClick={this._onCancel}>
80+
Cancel
81+
</button>;
82+
}
83+
84+
return (
85+
<div className="mx_BugReportDialog">
86+
<div className="mx_Dialog_title">
87+
Report a bug
88+
</div>
89+
<div className="mx_Dialog_content">
90+
<p>Please describe the bug. What did you do?
91+
What did you expect to happen?
92+
What actually happened?</p>
93+
<textarea
94+
className="mx_BugReportDialog_input"
95+
rows={5}
96+
onChange={this._onTextChange}
97+
value={this.state.text}
98+
placeholder="Describe your problem here."
99+
/>
100+
<p>In order to diagnose problems, logs from this client will be sent with
101+
this bug report.
102+
If you would prefer to only send the text above, please untick:</p>
103+
<input type="checkbox" checked={this.state.sendLogs}
104+
onChange={this._onSendLogsChange} id="mx_BugReportDialog_logs"/>
105+
<label htmlFor="mx_BugReportDialog_logs">Send logs</label>
106+
{error}
107+
</div>
108+
<div className="mx_Dialog_buttons">
109+
<button
110+
className="mx_Dialog_primary danger"
111+
onClick={this._onSubmit}
112+
autoFocus={true}
113+
>
114+
{okLabel}
115+
</button>
116+
117+
{cancelButton}
118+
</div>
119+
</div>
120+
);
121+
}
122+
}
123+
124+
BugReportDialog.propTypes = {
125+
onFinished: React.PropTypes.func.isRequired,
126+
};

src/vector/rageshake.js

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -430,9 +430,10 @@ module.exports = {
430430
/**
431431
* Send a bug report.
432432
* @param {string} userText Any additional user input.
433+
* @param {boolean} sendLogs True to send logs
433434
* @return {Promise} Resolved when the bug report is sent.
434435
*/
435-
sendBugReport: async function(userText) {
436+
sendBugReport: async function(userText, sendLogs) {
436437
if (!logger) {
437438
throw new Error(
438439
"No console logger, did you forget to call init()?"
@@ -457,16 +458,18 @@ module.exports = {
457458
// sending to work going off the in-memory console logs.
458459
console.log("Sending bug report.");
459460
let logs = [];
460-
if (store) {
461-
// flush most recent logs
462-
await store.flush();
463-
logs = await store.consume();
464-
}
465-
else {
466-
logs.push({
467-
lines: logger.flush(true),
468-
id: "-",
469-
});
461+
if (sendLogs) {
462+
if (store) {
463+
// flush most recent logs
464+
await store.flush();
465+
logs = await store.consume();
466+
}
467+
else {
468+
logs.push({
469+
lines: logger.flush(true),
470+
id: "-",
471+
});
472+
}
470473
}
471474

472475
await q.Promise((resolve, reject) => {

0 commit comments

Comments
 (0)