aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar vantezzen <hello@vantezzen.io>2019-10-29 21:18:14 +0100
committerLibravatar vantezzen <hello@vantezzen.io>2019-10-29 21:18:14 +0100
commitcddfc5027b84d8b201714f4198d4314b02c3c4c7 (patch)
tree348146bdf96f11c70ddefbaac420df6e370d70c7
parent Add @ammarmalhas as a contributor (diff)
downloadferdium-app-cddfc5027b84d8b201714f4198d4314b02c3c4c7.tar.gz
ferdium-app-cddfc5027b84d8b201714f4198d4314b02c3c4c7.tar.zst
ferdium-app-cddfc5027b84d8b201714f4198d4314b02c3c4c7.zip
Add publish debug log option
-rw-r--r--src/components/layout/AppLayout.js2
-rw-r--r--src/config.js2
-rw-r--r--src/features/publishDebugInfo/Component.js181
-rw-r--r--src/features/publishDebugInfo/index.js24
-rw-r--r--src/i18n/messages/src/components/layout/AppLayout.json16
-rw-r--r--src/i18n/messages/src/features/publishDebugInfo/Component.json80
-rw-r--r--src/i18n/messages/src/lib/Menu.json145
-rw-r--r--src/lib/Menu.js15
-rw-r--r--src/stores/FeaturesStore.js2
9 files changed, 390 insertions, 77 deletions
diff --git a/src/components/layout/AppLayout.js b/src/components/layout/AppLayout.js
index 80e6daf19..fe43c42d2 100644
--- a/src/components/layout/AppLayout.js
+++ b/src/components/layout/AppLayout.js
@@ -9,6 +9,7 @@ import InfoBar from '../ui/InfoBar';
9import { Component as BasicAuth } from '../../features/basicAuth'; 9import { Component as BasicAuth } from '../../features/basicAuth';
10import { Component as ShareFranz } from '../../features/shareFranz'; 10import { Component as ShareFranz } from '../../features/shareFranz';
11import { Component as QuickSwitch } from '../../features/quickSwitch'; 11import { Component as QuickSwitch } from '../../features/quickSwitch';
12import { Component as PublishDebugInfo } from '../../features/publishDebugInfo';
12import ErrorBoundary from '../util/ErrorBoundary'; 13import ErrorBoundary from '../util/ErrorBoundary';
13 14
14// import globalMessages from '../../i18n/globalMessages'; 15// import globalMessages from '../../i18n/globalMessages';
@@ -189,6 +190,7 @@ class AppLayout extends Component {
189 <BasicAuth /> 190 <BasicAuth />
190 <ShareFranz /> 191 <ShareFranz />
191 <QuickSwitch /> 192 <QuickSwitch />
193 <PublishDebugInfo />
192 {services} 194 {services}
193 {children} 195 {children}
194 <TrialStatusBar /> 196 <TrialStatusBar />
diff --git a/src/config.js b/src/config.js
index 1db881d35..834f89d01 100644
--- a/src/config.js
+++ b/src/config.js
@@ -14,6 +14,8 @@ export const LOCAL_API = 'http://localhost:3000';
14export const DEV_API = 'https://dev.franzinfra.com'; 14export const DEV_API = 'https://dev.franzinfra.com';
15export const LIVE_API = 'https://api.getferdi.com'; 15export const LIVE_API = 'https://api.getferdi.com';
16 16
17export const DEBUG_API = 'http://localhost:3333';
18
17export const LOCAL_WS_API = 'ws://localhost:3000'; 19export const LOCAL_WS_API = 'ws://localhost:3000';
18export const DEV_WS_API = 'wss://dev.franzinfra.com'; 20export const DEV_WS_API = 'wss://dev.franzinfra.com';
19export const LIVE_WS_API = 'wss://api.franzinfra.com'; 21export const LIVE_WS_API = 'wss://api.franzinfra.com';
diff --git a/src/features/publishDebugInfo/Component.js b/src/features/publishDebugInfo/Component.js
new file mode 100644
index 000000000..9e59fa205
--- /dev/null
+++ b/src/features/publishDebugInfo/Component.js
@@ -0,0 +1,181 @@
1import React, { Component } from 'react';
2import PropTypes from 'prop-types';
3import { observer, inject } from 'mobx-react';
4import { defineMessages, intlShape } from 'react-intl';
5import { H1 } from '@meetfranz/ui';
6import injectSheet from 'react-jss';
7
8import Input from '../../components/ui/Input';
9import Button from '../../components/ui/Button';
10import Modal from '../../components/ui/Modal';
11import { state as ModalState } from '.';
12import AppStore from '../../stores/AppStore';
13import { DEBUG_API } from '../../config';
14import { sendAuthRequest } from '../../api/utils/auth';
15
16const messages = defineMessages({
17 title: {
18 id: 'feature.publishDebugInfo.title',
19 defaultMessage: '!!!Publish debug information',
20 },
21 info: {
22 id: 'feature.publishDebugInfo.info',
23 defaultMessage: '!!!Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger\'s privacy policy and terms of service',
24 },
25 privacy: {
26 id: 'feature.publishDebugInfo.privacy',
27 defaultMessage: '!!!Privacy policy',
28 },
29 terms: {
30 id: 'feature.publishDebugInfo.terms',
31 defaultMessage: '!!!Terms of service',
32 },
33 publish: {
34 id: 'feature.publishDebugInfo.publish',
35 defaultMessage: '!!!Accept and publish',
36 },
37 published: {
38 id: 'feature.publishDebugInfo.published',
39 defaultMessage: '!!!Your debug log was published and is now availible at',
40 },
41});
42
43const styles = theme => ({
44 info: {
45 paddingTop: 20,
46 paddingBottom: 20,
47 },
48 link: {
49 color: theme.styleTypes.primary.accent + ' !important',
50 padding: 10,
51 cursor: 'pointer',
52 },
53 button: {
54 width: '100%',
55 marginTop: 10,
56 cursor: 'pointer',
57 },
58 url: {
59 marginTop: 20,
60
61 '& > div': {
62 fontFamily: 'SFMono-Regular,Consolas,Liberation Mono,Menlo,Courier,monospace',
63 },
64 },
65});
66
67export default @injectSheet(styles) @inject('stores') @observer class PublishDebugLogModal extends Component {
68 static propTypes = {
69 classes: PropTypes.object.isRequired,
70 };
71
72 static contextTypes = {
73 intl: intlShape,
74 };
75
76 state = {
77 log: null,
78 isSendingLog: false,
79 }
80
81 // Close this modal
82 close() {
83 ModalState.isModalVisible = false;
84 }
85
86 async publishDebugInfo() {
87 this.setState({
88 isSendingLog: true,
89 })
90
91 const debugInfo = JSON.stringify(this.props.stores.app.debugInfo);
92
93 const request = await sendAuthRequest(`${DEBUG_API}/create`, {
94 method: 'POST',
95 body: JSON.stringify({
96 log: debugInfo
97 }),
98 }, false);
99 const response = await request.json();
100 console.log(response);
101 if (response.id) {
102 this.setState({
103 log: response.id,
104 })
105 } else {
106 // TODO: Show error message
107 this.close();
108 }
109 }
110
111 render() {
112 const { isModalVisible } = ModalState;
113
114 const {
115 classes,
116 } = this.props;
117
118 const {
119 log
120 } = this.state;
121
122 const { intl } = this.context;
123
124 return (
125 <Modal
126 isOpen={isModalVisible}
127 shouldCloseOnOverlayClick
128 close={this.close.bind(this)}
129 >
130 <H1>
131 {intl.formatMessage(messages.title)}
132 </H1>
133 { log ? (
134 <>
135 <p className={classes.info}>{intl.formatMessage(messages.published)}</p>
136 <Input
137 className={classes.url}
138 showLabel={false}
139 field={{
140 type: 'url',
141 value: DEBUG_API + '/' + log,
142 disabled: true,
143 }}
144 readonly
145 />
146 </>
147 ) : (
148 <>
149 <p className={classes.info}>{intl.formatMessage(messages.info)}</p>
150
151 <a href={ DEBUG_API + '/privacy.html' } target="_blank" className={classes.link}>
152 {intl.formatMessage(messages.privacy)}
153 </a>
154 <a href={ DEBUG_API + '/terms.html' } target="_blank" className={classes.link}>
155 {intl.formatMessage(messages.terms)}
156 </a>
157
158 <Button
159 type="button"
160 label={intl.formatMessage(messages.publish)}
161 className={classes.button}
162 onClick={this.publishDebugInfo.bind(this)}
163 disabled={this.state.isSendingLog}
164 />
165 </>
166 ) }
167 </Modal>
168 );
169 }
170}
171
172PublishDebugLogModal.wrappedComponent.propTypes = {
173 stores: PropTypes.shape({
174 app: PropTypes.instanceOf(AppStore).isRequired,
175 }).isRequired,
176 actions: PropTypes.shape({
177 service: PropTypes.shape({
178 setActive: PropTypes.func.isRequired,
179 }).isRequired,
180 }).isRequired,
181};
diff --git a/src/features/publishDebugInfo/index.js b/src/features/publishDebugInfo/index.js
new file mode 100644
index 000000000..7d0d310c2
--- /dev/null
+++ b/src/features/publishDebugInfo/index.js
@@ -0,0 +1,24 @@
1import { observable } from 'mobx';
2
3export { default as Component } from './Component';
4
5const debug = require('debug')('Ferdi:feature:publishDebugInfo');
6
7const defaultState = {
8 isModalVisible: false,
9};
10
11export const state = observable(defaultState);
12
13export default function initialize() {
14 debug('Initialize publishDebugInfo feature');
15
16 function showModal() {
17 state.isModalVisible = true;
18 }
19
20 window.ferdi.features.publishDebugInfo = {
21 state,
22 showModal,
23 };
24}
diff --git a/src/i18n/messages/src/components/layout/AppLayout.json b/src/i18n/messages/src/components/layout/AppLayout.json
index bca181d0f..5a8e082f2 100644
--- a/src/i18n/messages/src/components/layout/AppLayout.json
+++ b/src/i18n/messages/src/components/layout/AppLayout.json
@@ -4,11 +4,11 @@
4 "defaultMessage": "!!!Your services have been updated.", 4 "defaultMessage": "!!!Your services have been updated.",
5 "file": "src/components/layout/AppLayout.js", 5 "file": "src/components/layout/AppLayout.js",
6 "start": { 6 "start": {
7 "line": 30, 7 "line": 31,
8 "column": 19 8 "column": 19
9 }, 9 },
10 "end": { 10 "end": {
11 "line": 33, 11 "line": 34,
12 "column": 3 12 "column": 3
13 } 13 }
14 }, 14 },
@@ -17,11 +17,11 @@
17 "defaultMessage": "!!!Reload services", 17 "defaultMessage": "!!!Reload services",
18 "file": "src/components/layout/AppLayout.js", 18 "file": "src/components/layout/AppLayout.js",
19 "start": { 19 "start": {
20 "line": 34, 20 "line": 35,
21 "column": 24 21 "column": 24
22 }, 22 },
23 "end": { 23 "end": {
24 "line": 37, 24 "line": 38,
25 "column": 3 25 "column": 3
26 } 26 }
27 }, 27 },
@@ -30,11 +30,11 @@
30 "defaultMessage": "!!!Could not load services and user information", 30 "defaultMessage": "!!!Could not load services and user information",
31 "file": "src/components/layout/AppLayout.js", 31 "file": "src/components/layout/AppLayout.js",
32 "start": { 32 "start": {
33 "line": 38, 33 "line": 39,
34 "column": 26 34 "column": 26
35 }, 35 },
36 "end": { 36 "end": {
37 "line": 41, 37 "line": 42,
38 "column": 3 38 "column": 3
39 } 39 }
40 }, 40 },
@@ -43,11 +43,11 @@
43 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.", 43 "defaultMessage": "!!!There were errors while trying to perform an authenticated request. Please try logging out and back in if this error persists.",
44 "file": "src/components/layout/AppLayout.js", 44 "file": "src/components/layout/AppLayout.js",
45 "start": { 45 "start": {
46 "line": 42, 46 "line": 43,
47 "column": 21 47 "column": 21
48 }, 48 },
49 "end": { 49 "end": {
50 "line": 45, 50 "line": 46,
51 "column": 3 51 "column": 3
52 } 52 }
53 } 53 }
diff --git a/src/i18n/messages/src/features/publishDebugInfo/Component.json b/src/i18n/messages/src/features/publishDebugInfo/Component.json
new file mode 100644
index 000000000..500f2c01b
--- /dev/null
+++ b/src/i18n/messages/src/features/publishDebugInfo/Component.json
@@ -0,0 +1,80 @@
1[
2 {
3 "id": "feature.publishDebugInfo.title",
4 "defaultMessage": "!!!Publish debug information",
5 "file": "src/features/publishDebugInfo/Component.js",
6 "start": {
7 "line": 17,
8 "column": 9
9 },
10 "end": {
11 "line": 20,
12 "column": 3
13 }
14 },
15 {
16 "id": "feature.publishDebugInfo.info",
17 "defaultMessage": "!!!Publishing your debug information helps us find issues and errors in Ferdi. By publishing your debug information you accept Ferdi Debugger's privacy policy and terms of service",
18 "file": "src/features/publishDebugInfo/Component.js",
19 "start": {
20 "line": 21,
21 "column": 8
22 },
23 "end": {
24 "line": 24,
25 "column": 3
26 }
27 },
28 {
29 "id": "feature.publishDebugInfo.privacy",
30 "defaultMessage": "!!!Privacy policy",
31 "file": "src/features/publishDebugInfo/Component.js",
32 "start": {
33 "line": 25,
34 "column": 11
35 },
36 "end": {
37 "line": 28,
38 "column": 3
39 }
40 },
41 {
42 "id": "feature.publishDebugInfo.terms",
43 "defaultMessage": "!!!Terms of service",
44 "file": "src/features/publishDebugInfo/Component.js",
45 "start": {
46 "line": 29,
47 "column": 9
48 },
49 "end": {
50 "line": 32,
51 "column": 3
52 }
53 },
54 {
55 "id": "feature.publishDebugInfo.publish",
56 "defaultMessage": "!!!Accept and publish",
57 "file": "src/features/publishDebugInfo/Component.js",
58 "start": {
59 "line": 33,
60 "column": 11
61 },
62 "end": {
63 "line": 36,
64 "column": 3
65 }
66 },
67 {
68 "id": "feature.publishDebugInfo.published",
69 "defaultMessage": "!!!Your debug log was published and is now availible at",
70 "file": "src/features/publishDebugInfo/Component.js",
71 "start": {
72 "line": 37,
73 "column": 13
74 },
75 "end": {
76 "line": 40,
77 "column": 3
78 }
79 }
80] \ No newline at end of file
diff --git a/src/i18n/messages/src/lib/Menu.json b/src/i18n/messages/src/lib/Menu.json
index f69d951fd..e323d6174 100644
--- a/src/i18n/messages/src/lib/Menu.json
+++ b/src/i18n/messages/src/lib/Menu.json
@@ -455,15 +455,28 @@
455 } 455 }
456 }, 456 },
457 { 457 {
458 "id": "menu.help.publishDebugInfo",
459 "defaultMessage": "!!!Publish Debug Information",
460 "file": "src/lib/Menu.js",
461 "start": {
462 "line": 157,
463 "column": 20
464 },
465 "end": {
466 "line": 160,
467 "column": 3
468 }
469 },
470 {
458 "id": "menu.help.debugInfoCopiedHeadline", 471 "id": "menu.help.debugInfoCopiedHeadline",
459 "defaultMessage": "!!!Ferdi Debug Information", 472 "defaultMessage": "!!!Ferdi Debug Information",
460 "file": "src/lib/Menu.js", 473 "file": "src/lib/Menu.js",
461 "start": { 474 "start": {
462 "line": 157, 475 "line": 161,
463 "column": 27 476 "column": 27
464 }, 477 },
465 "end": { 478 "end": {
466 "line": 160, 479 "line": 164,
467 "column": 3 480 "column": 3
468 } 481 }
469 }, 482 },
@@ -472,11 +485,11 @@
472 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.", 485 "defaultMessage": "!!!Your Debug Information has been copied to your clipboard.",
473 "file": "src/lib/Menu.js", 486 "file": "src/lib/Menu.js",
474 "start": { 487 "start": {
475 "line": 161, 488 "line": 165,
476 "column": 23 489 "column": 23
477 }, 490 },
478 "end": { 491 "end": {
479 "line": 164, 492 "line": 168,
480 "column": 3 493 "column": 3
481 } 494 }
482 }, 495 },
@@ -485,11 +498,11 @@
485 "defaultMessage": "!!!Terms of Service", 498 "defaultMessage": "!!!Terms of Service",
486 "file": "src/lib/Menu.js", 499 "file": "src/lib/Menu.js",
487 "start": { 500 "start": {
488 "line": 165, 501 "line": 169,
489 "column": 7 502 "column": 7
490 }, 503 },
491 "end": { 504 "end": {
492 "line": 168, 505 "line": 172,
493 "column": 3 506 "column": 3
494 } 507 }
495 }, 508 },
@@ -498,11 +511,11 @@
498 "defaultMessage": "!!!Privacy Statement", 511 "defaultMessage": "!!!Privacy Statement",
499 "file": "src/lib/Menu.js", 512 "file": "src/lib/Menu.js",
500 "start": { 513 "start": {
501 "line": 169, 514 "line": 173,
502 "column": 11 515 "column": 11
503 }, 516 },
504 "end": { 517 "end": {
505 "line": 172, 518 "line": 176,
506 "column": 3 519 "column": 3
507 } 520 }
508 }, 521 },
@@ -511,11 +524,11 @@
511 "defaultMessage": "!!!File", 524 "defaultMessage": "!!!File",
512 "file": "src/lib/Menu.js", 525 "file": "src/lib/Menu.js",
513 "start": { 526 "start": {
514 "line": 173, 527 "line": 177,
515 "column": 8 528 "column": 8
516 }, 529 },
517 "end": { 530 "end": {
518 "line": 176, 531 "line": 180,
519 "column": 3 532 "column": 3
520 } 533 }
521 }, 534 },
@@ -524,11 +537,11 @@
524 "defaultMessage": "!!!View", 537 "defaultMessage": "!!!View",
525 "file": "src/lib/Menu.js", 538 "file": "src/lib/Menu.js",
526 "start": { 539 "start": {
527 "line": 177, 540 "line": 181,
528 "column": 8 541 "column": 8
529 }, 542 },
530 "end": { 543 "end": {
531 "line": 180, 544 "line": 184,
532 "column": 3 545 "column": 3
533 } 546 }
534 }, 547 },
@@ -537,11 +550,11 @@
537 "defaultMessage": "!!!Services", 550 "defaultMessage": "!!!Services",
538 "file": "src/lib/Menu.js", 551 "file": "src/lib/Menu.js",
539 "start": { 552 "start": {
540 "line": 181, 553 "line": 185,
541 "column": 12 554 "column": 12
542 }, 555 },
543 "end": { 556 "end": {
544 "line": 184, 557 "line": 188,
545 "column": 3 558 "column": 3
546 } 559 }
547 }, 560 },
@@ -550,11 +563,11 @@
550 "defaultMessage": "!!!Window", 563 "defaultMessage": "!!!Window",
551 "file": "src/lib/Menu.js", 564 "file": "src/lib/Menu.js",
552 "start": { 565 "start": {
553 "line": 185, 566 "line": 189,
554 "column": 10 567 "column": 10
555 }, 568 },
556 "end": { 569 "end": {
557 "line": 188, 570 "line": 192,
558 "column": 3 571 "column": 3
559 } 572 }
560 }, 573 },
@@ -563,11 +576,11 @@
563 "defaultMessage": "!!!Help", 576 "defaultMessage": "!!!Help",
564 "file": "src/lib/Menu.js", 577 "file": "src/lib/Menu.js",
565 "start": { 578 "start": {
566 "line": 189, 579 "line": 193,
567 "column": 8 580 "column": 8
568 }, 581 },
569 "end": { 582 "end": {
570 "line": 192, 583 "line": 196,
571 "column": 3 584 "column": 3
572 } 585 }
573 }, 586 },
@@ -576,11 +589,11 @@
576 "defaultMessage": "!!!About Ferdi", 589 "defaultMessage": "!!!About Ferdi",
577 "file": "src/lib/Menu.js", 590 "file": "src/lib/Menu.js",
578 "start": { 591 "start": {
579 "line": 193, 592 "line": 197,
580 "column": 9 593 "column": 9
581 }, 594 },
582 "end": { 595 "end": {
583 "line": 196, 596 "line": 200,
584 "column": 3 597 "column": 3
585 } 598 }
586 }, 599 },
@@ -589,11 +602,11 @@
589 "defaultMessage": "!!!What's new?", 602 "defaultMessage": "!!!What's new?",
590 "file": "src/lib/Menu.js", 603 "file": "src/lib/Menu.js",
591 "start": { 604 "start": {
592 "line": 197, 605 "line": 201,
593 "column": 16 606 "column": 16
594 }, 607 },
595 "end": { 608 "end": {
596 "line": 200, 609 "line": 204,
597 "column": 3 610 "column": 3
598 } 611 }
599 }, 612 },
@@ -602,11 +615,11 @@
602 "defaultMessage": "!!!Settings", 615 "defaultMessage": "!!!Settings",
603 "file": "src/lib/Menu.js", 616 "file": "src/lib/Menu.js",
604 "start": { 617 "start": {
605 "line": 201, 618 "line": 205,
606 "column": 12 619 "column": 12
607 }, 620 },
608 "end": { 621 "end": {
609 "line": 204, 622 "line": 208,
610 "column": 3 623 "column": 3
611 } 624 }
612 }, 625 },
@@ -615,11 +628,11 @@
615 "defaultMessage": "!!!Check for updates", 628 "defaultMessage": "!!!Check for updates",
616 "file": "src/lib/Menu.js", 629 "file": "src/lib/Menu.js",
617 "start": { 630 "start": {
618 "line": 205, 631 "line": 209,
619 "column": 19 632 "column": 19
620 }, 633 },
621 "end": { 634 "end": {
622 "line": 208, 635 "line": 212,
623 "column": 3 636 "column": 3
624 } 637 }
625 }, 638 },
@@ -628,11 +641,11 @@
628 "defaultMessage": "!!!Hide", 641 "defaultMessage": "!!!Hide",
629 "file": "src/lib/Menu.js", 642 "file": "src/lib/Menu.js",
630 "start": { 643 "start": {
631 "line": 209, 644 "line": 213,
632 "column": 8 645 "column": 8
633 }, 646 },
634 "end": { 647 "end": {
635 "line": 212, 648 "line": 216,
636 "column": 3 649 "column": 3
637 } 650 }
638 }, 651 },
@@ -641,11 +654,11 @@
641 "defaultMessage": "!!!Hide Others", 654 "defaultMessage": "!!!Hide Others",
642 "file": "src/lib/Menu.js", 655 "file": "src/lib/Menu.js",
643 "start": { 656 "start": {
644 "line": 213, 657 "line": 217,
645 "column": 14 658 "column": 14
646 }, 659 },
647 "end": { 660 "end": {
648 "line": 216, 661 "line": 220,
649 "column": 3 662 "column": 3
650 } 663 }
651 }, 664 },
@@ -654,11 +667,11 @@
654 "defaultMessage": "!!!Unhide", 667 "defaultMessage": "!!!Unhide",
655 "file": "src/lib/Menu.js", 668 "file": "src/lib/Menu.js",
656 "start": { 669 "start": {
657 "line": 217, 670 "line": 221,
658 "column": 10 671 "column": 10
659 }, 672 },
660 "end": { 673 "end": {
661 "line": 220, 674 "line": 224,
662 "column": 3 675 "column": 3
663 } 676 }
664 }, 677 },
@@ -667,11 +680,11 @@
667 "defaultMessage": "!!!Auto-hide menu bar", 680 "defaultMessage": "!!!Auto-hide menu bar",
668 "file": "src/lib/Menu.js", 681 "file": "src/lib/Menu.js",
669 "start": { 682 "start": {
670 "line": 221, 683 "line": 225,
671 "column": 19 684 "column": 19
672 }, 685 },
673 "end": { 686 "end": {
674 "line": 224, 687 "line": 228,
675 "column": 3 688 "column": 3
676 } 689 }
677 }, 690 },
@@ -680,11 +693,11 @@
680 "defaultMessage": "!!!Quit", 693 "defaultMessage": "!!!Quit",
681 "file": "src/lib/Menu.js", 694 "file": "src/lib/Menu.js",
682 "start": { 695 "start": {
683 "line": 225, 696 "line": 229,
684 "column": 8 697 "column": 8
685 }, 698 },
686 "end": { 699 "end": {
687 "line": 228, 700 "line": 232,
688 "column": 3 701 "column": 3
689 } 702 }
690 }, 703 },
@@ -693,11 +706,11 @@
693 "defaultMessage": "!!!Add New Service...", 706 "defaultMessage": "!!!Add New Service...",
694 "file": "src/lib/Menu.js", 707 "file": "src/lib/Menu.js",
695 "start": { 708 "start": {
696 "line": 229, 709 "line": 233,
697 "column": 17 710 "column": 17
698 }, 711 },
699 "end": { 712 "end": {
700 "line": 232, 713 "line": 236,
701 "column": 3 714 "column": 3
702 } 715 }
703 }, 716 },
@@ -706,11 +719,11 @@
706 "defaultMessage": "!!!Add New Workspace...", 719 "defaultMessage": "!!!Add New Workspace...",
707 "file": "src/lib/Menu.js", 720 "file": "src/lib/Menu.js",
708 "start": { 721 "start": {
709 "line": 233, 722 "line": 237,
710 "column": 19 723 "column": 19
711 }, 724 },
712 "end": { 725 "end": {
713 "line": 236, 726 "line": 240,
714 "column": 3 727 "column": 3
715 } 728 }
716 }, 729 },
@@ -719,11 +732,11 @@
719 "defaultMessage": "!!!Open workspace drawer", 732 "defaultMessage": "!!!Open workspace drawer",
720 "file": "src/lib/Menu.js", 733 "file": "src/lib/Menu.js",
721 "start": { 734 "start": {
722 "line": 237, 735 "line": 241,
723 "column": 23 736 "column": 23
724 }, 737 },
725 "end": { 738 "end": {
726 "line": 240, 739 "line": 244,
727 "column": 3 740 "column": 3
728 } 741 }
729 }, 742 },
@@ -732,11 +745,11 @@
732 "defaultMessage": "!!!Close workspace drawer", 745 "defaultMessage": "!!!Close workspace drawer",
733 "file": "src/lib/Menu.js", 746 "file": "src/lib/Menu.js",
734 "start": { 747 "start": {
735 "line": 241, 748 "line": 245,
736 "column": 24 749 "column": 24
737 }, 750 },
738 "end": { 751 "end": {
739 "line": 244, 752 "line": 248,
740 "column": 3 753 "column": 3
741 } 754 }
742 }, 755 },
@@ -745,11 +758,11 @@
745 "defaultMessage": "!!!Activate next service...", 758 "defaultMessage": "!!!Activate next service...",
746 "file": "src/lib/Menu.js", 759 "file": "src/lib/Menu.js",
747 "start": { 760 "start": {
748 "line": 245, 761 "line": 249,
749 "column": 23 762 "column": 23
750 }, 763 },
751 "end": { 764 "end": {
752 "line": 248, 765 "line": 252,
753 "column": 3 766 "column": 3
754 } 767 }
755 }, 768 },
@@ -758,11 +771,11 @@
758 "defaultMessage": "!!!Activate previous service...", 771 "defaultMessage": "!!!Activate previous service...",
759 "file": "src/lib/Menu.js", 772 "file": "src/lib/Menu.js",
760 "start": { 773 "start": {
761 "line": 249, 774 "line": 253,
762 "column": 27 775 "column": 27
763 }, 776 },
764 "end": { 777 "end": {
765 "line": 252, 778 "line": 256,
766 "column": 3 779 "column": 3
767 } 780 }
768 }, 781 },
@@ -771,11 +784,11 @@
771 "defaultMessage": "!!!Disable notifications & audio", 784 "defaultMessage": "!!!Disable notifications & audio",
772 "file": "src/lib/Menu.js", 785 "file": "src/lib/Menu.js",
773 "start": { 786 "start": {
774 "line": 253, 787 "line": 257,
775 "column": 11 788 "column": 11
776 }, 789 },
777 "end": { 790 "end": {
778 "line": 256, 791 "line": 260,
779 "column": 3 792 "column": 3
780 } 793 }
781 }, 794 },
@@ -784,11 +797,11 @@
784 "defaultMessage": "!!!Enable notifications & audio", 797 "defaultMessage": "!!!Enable notifications & audio",
785 "file": "src/lib/Menu.js", 798 "file": "src/lib/Menu.js",
786 "start": { 799 "start": {
787 "line": 257, 800 "line": 261,
788 "column": 13 801 "column": 13
789 }, 802 },
790 "end": { 803 "end": {
791 "line": 260, 804 "line": 264,
792 "column": 3 805 "column": 3
793 } 806 }
794 }, 807 },
@@ -797,11 +810,11 @@
797 "defaultMessage": "!!!Workspaces", 810 "defaultMessage": "!!!Workspaces",
798 "file": "src/lib/Menu.js", 811 "file": "src/lib/Menu.js",
799 "start": { 812 "start": {
800 "line": 261, 813 "line": 265,
801 "column": 14 814 "column": 14
802 }, 815 },
803 "end": { 816 "end": {
804 "line": 264, 817 "line": 268,
805 "column": 3 818 "column": 3
806 } 819 }
807 }, 820 },
@@ -810,11 +823,11 @@
810 "defaultMessage": "!!!Default", 823 "defaultMessage": "!!!Default",
811 "file": "src/lib/Menu.js", 824 "file": "src/lib/Menu.js",
812 "start": { 825 "start": {
813 "line": 265, 826 "line": 269,
814 "column": 20 827 "column": 20
815 }, 828 },
816 "end": { 829 "end": {
817 "line": 268, 830 "line": 272,
818 "column": 3 831 "column": 3
819 } 832 }
820 }, 833 },
@@ -823,11 +836,11 @@
823 "defaultMessage": "!!!Todos", 836 "defaultMessage": "!!!Todos",
824 "file": "src/lib/Menu.js", 837 "file": "src/lib/Menu.js",
825 "start": { 838 "start": {
826 "line": 269, 839 "line": 273,
827 "column": 9 840 "column": 9
828 }, 841 },
829 "end": { 842 "end": {
830 "line": 272, 843 "line": 276,
831 "column": 3 844 "column": 3
832 } 845 }
833 }, 846 },
@@ -836,11 +849,11 @@
836 "defaultMessage": "!!!Open Todos drawer", 849 "defaultMessage": "!!!Open Todos drawer",
837 "file": "src/lib/Menu.js", 850 "file": "src/lib/Menu.js",
838 "start": { 851 "start": {
839 "line": 273, 852 "line": 277,
840 "column": 19 853 "column": 19
841 }, 854 },
842 "end": { 855 "end": {
843 "line": 276, 856 "line": 280,
844 "column": 3 857 "column": 3
845 } 858 }
846 }, 859 },
@@ -849,11 +862,11 @@
849 "defaultMessage": "!!!Close Todos drawer", 862 "defaultMessage": "!!!Close Todos drawer",
850 "file": "src/lib/Menu.js", 863 "file": "src/lib/Menu.js",
851 "start": { 864 "start": {
852 "line": 277, 865 "line": 281,
853 "column": 20 866 "column": 20
854 }, 867 },
855 "end": { 868 "end": {
856 "line": 280, 869 "line": 284,
857 "column": 3 870 "column": 3
858 } 871 }
859 }, 872 },
@@ -862,11 +875,11 @@
862 "defaultMessage": "!!!Enable Todos", 875 "defaultMessage": "!!!Enable Todos",
863 "file": "src/lib/Menu.js", 876 "file": "src/lib/Menu.js",
864 "start": { 877 "start": {
865 "line": 281, 878 "line": 285,
866 "column": 15 879 "column": 15
867 }, 880 },
868 "end": { 881 "end": {
869 "line": 284, 882 "line": 288,
870 "column": 3 883 "column": 3
871 } 884 }
872 }, 885 },
@@ -875,11 +888,11 @@
875 "defaultMessage": "!!!Home", 888 "defaultMessage": "!!!Home",
876 "file": "src/lib/Menu.js", 889 "file": "src/lib/Menu.js",
877 "start": { 890 "start": {
878 "line": 285, 891 "line": 289,
879 "column": 17 892 "column": 17
880 }, 893 },
881 "end": { 894 "end": {
882 "line": 288, 895 "line": 292,
883 "column": 3 896 "column": 3
884 } 897 }
885 } 898 }
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index 826fe843f..a858ec993 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -154,6 +154,10 @@ const menuItems = defineMessages({
154 id: 'menu.help.debugInfo', 154 id: 'menu.help.debugInfo',
155 defaultMessage: '!!!Copy Debug Information', 155 defaultMessage: '!!!Copy Debug Information',
156 }, 156 },
157 publishDebugInfo: {
158 id: 'menu.help.publishDebugInfo',
159 defaultMessage: '!!!Publish Debug Information',
160 },
157 debugInfoCopiedHeadline: { 161 debugInfoCopiedHeadline: {
158 id: 'menu.help.debugInfoCopiedHeadline', 162 id: 'menu.help.debugInfoCopiedHeadline',
159 defaultMessage: '!!!Ferdi Debug Information', 163 defaultMessage: '!!!Ferdi Debug Information',
@@ -959,7 +963,7 @@ export default class FranzMenu {
959 963
960 tpl[tpl.length - 1].submenu.push({ 964 tpl[tpl.length - 1].submenu.push({
961 type: 'separator', 965 type: 'separator',
962 }, this.debugMenu()); 966 }, ...this.debugMenu());
963 967
964 this.currentTemplate = tpl; 968 this.currentTemplate = tpl;
965 const menu = Menu.buildFromTemplate(tpl); 969 const menu = Menu.buildFromTemplate(tpl);
@@ -1116,7 +1120,7 @@ export default class FranzMenu {
1116 debugMenu() { 1120 debugMenu() {
1117 const { intl } = window.ferdi; 1121 const { intl } = window.ferdi;
1118 1122
1119 return { 1123 return [{
1120 label: intl.formatMessage(menuItems.debugInfo), 1124 label: intl.formatMessage(menuItems.debugInfo),
1121 click: () => { 1125 click: () => {
1122 const { debugInfo } = this.stores.app; 1126 const { debugInfo } = this.stores.app;
@@ -1132,7 +1136,12 @@ export default class FranzMenu {
1132 }, 1136 },
1133 }); 1137 });
1134 }, 1138 },
1135 }; 1139 }, {
1140 label: intl.formatMessage(menuItems.publishDebugInfo),
1141 click: () => {
1142 window.ferdi.features.publishDebugInfo.state.isModalVisible = true;
1143 },
1144 }];
1136 } 1145 }
1137 1146
1138 _getServiceName(service) { 1147 _getServiceName(service) {
diff --git a/src/stores/FeaturesStore.js b/src/stores/FeaturesStore.js
index 780cde3a7..aa9fa4062 100644
--- a/src/stores/FeaturesStore.js
+++ b/src/stores/FeaturesStore.js
@@ -14,6 +14,7 @@ import serviceProxy from '../features/serviceProxy';
14import basicAuth from '../features/basicAuth'; 14import basicAuth from '../features/basicAuth';
15import workspaces from '../features/workspaces'; 15import workspaces from '../features/workspaces';
16import quickSwitch from '../features/quickSwitch'; 16import quickSwitch from '../features/quickSwitch';
17import publishDebugInfo from '../features/publishDebugInfo';
17import shareFranz from '../features/shareFranz'; 18import shareFranz from '../features/shareFranz';
18import announcements from '../features/announcements'; 19import announcements from '../features/announcements';
19import settingsWS from '../features/settingsWS'; 20import settingsWS from '../features/settingsWS';
@@ -84,6 +85,7 @@ export default class FeaturesStore extends Store {
84 basicAuth(this.stores, this.actions); 85 basicAuth(this.stores, this.actions);
85 workspaces(this.stores, this.actions); 86 workspaces(this.stores, this.actions);
86 quickSwitch(this.stores, this.actions); 87 quickSwitch(this.stores, this.actions);
88 publishDebugInfo(this.stores, this.actions);
87 shareFranz(this.stores, this.actions); 89 shareFranz(this.stores, this.actions);
88 announcements(this.stores, this.actions); 90 announcements(this.stores, this.actions);
89 settingsWS(this.stores, this.actions); 91 settingsWS(this.stores, this.actions);