aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/Menu.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/Menu.js')
-rw-r--r--src/lib/Menu.js104
1 files changed, 103 insertions, 1 deletions
diff --git a/src/lib/Menu.js b/src/lib/Menu.js
index e0dfd736e..81efaf18f 100644
--- a/src/lib/Menu.js
+++ b/src/lib/Menu.js
@@ -1,4 +1,4 @@
1import { remote, shell } from 'electron'; 1import { remote, shell, clipboard } from 'electron';
2import { observable, autorun } from 'mobx'; 2import { observable, autorun } from 'mobx';
3import { defineMessages } from 'react-intl'; 3import { defineMessages } from 'react-intl';
4 4
@@ -8,6 +8,9 @@ import { workspaceActions } from '../features/workspaces/actions';
8import { gaEvent } from './analytics'; 8import { gaEvent } from './analytics';
9import { announcementActions } from '../features/announcements/actions'; 9import { announcementActions } from '../features/announcements/actions';
10import { announcementsStore } from '../features/announcements'; 10import { announcementsStore } from '../features/announcements';
11import TodoStore from '../features/todos/store';
12import { GA_CATEGORY_TODOS, todosStore } from '../features/todos';
13import { todoActions } from '../features/todos/actions';
11 14
12const { app, Menu, dialog } = remote; 15const { app, Menu, dialog } = remote;
13 16
@@ -96,6 +99,10 @@ const menuItems = defineMessages({
96 id: 'menu.view.toggleDevTools', 99 id: 'menu.view.toggleDevTools',
97 defaultMessage: '!!!Toggle Developer Tools', 100 defaultMessage: '!!!Toggle Developer Tools',
98 }, 101 },
102 toggleTodosDevTools: {
103 id: 'menu.view.toggleTodosDevTools',
104 defaultMessage: '!!!Toggle Todos Developer Tools',
105 },
99 toggleServiceDevTools: { 106 toggleServiceDevTools: {
100 id: 'menu.view.toggleServiceDevTools', 107 id: 'menu.view.toggleServiceDevTools',
101 defaultMessage: '!!!Toggle Service Developer Tools', 108 defaultMessage: '!!!Toggle Service Developer Tools',
@@ -128,6 +135,18 @@ const menuItems = defineMessages({
128 id: 'menu.help.support', 135 id: 'menu.help.support',
129 defaultMessage: '!!!Support', 136 defaultMessage: '!!!Support',
130 }, 137 },
138 debugInfo: {
139 id: 'menu.help.debugInfo',
140 defaultMessage: '!!!Copy Debug Information',
141 },
142 debugInfoCopiedHeadline: {
143 id: 'menu.help.debugInfoCopiedHeadline',
144 defaultMessage: '!!!Franz Debug Information',
145 },
146 debugInfoCopiedBody: {
147 id: 'menu.help.debugInfoCopiedBody',
148 defaultMessage: '!!!Your Debug Information has been copied to your clipboard.',
149 },
131 tos: { 150 tos: {
132 id: 'menu.help.tos', 151 id: 'menu.help.tos',
133 defaultMessage: '!!!Terms of Service', 152 defaultMessage: '!!!Terms of Service',
@@ -228,6 +247,18 @@ const menuItems = defineMessages({
228 id: 'menu.workspaces.defaultWorkspace', 247 id: 'menu.workspaces.defaultWorkspace',
229 defaultMessage: '!!!Default', 248 defaultMessage: '!!!Default',
230 }, 249 },
250 todos: {
251 id: 'menu.todos',
252 defaultMessage: '!!!Todos',
253 },
254 openTodosDrawer: {
255 id: 'menu.Todoss.openTodosDrawer',
256 defaultMessage: '!!!Open Todos drawer',
257 },
258 closeTodosDrawer: {
259 id: 'menu.Todoss.closeTodosDrawer',
260 defaultMessage: '!!!Close Todos drawer',
261 },
231}); 262});
232 263
233function getActiveWebview() { 264function getActiveWebview() {
@@ -336,6 +367,11 @@ const _templateFactory = intl => [
336 visible: workspaceStore.isFeatureEnabled, 367 visible: workspaceStore.isFeatureEnabled,
337 }, 368 },
338 { 369 {
370 label: intl.formatMessage(menuItems.todos),
371 submenu: [],
372 visible: todosStore.isFeatureEnabled,
373 },
374 {
339 label: intl.formatMessage(menuItems.window), 375 label: intl.formatMessage(menuItems.window),
340 role: 'window', 376 role: 'window',
341 submenu: [ 377 submenu: [
@@ -608,6 +644,17 @@ export default class FranzMenu {
608 enabled: this.stores.user.isLoggedIn && this.stores.services.enabled.length > 0, 644 enabled: this.stores.user.isLoggedIn && this.stores.services.enabled.length > 0,
609 }); 645 });
610 646
647 if (this.stores.features.features.isTodosEnabled) {
648 tpl[1].submenu.push({
649 label: intl.formatMessage(menuItems.toggleTodosDevTools),
650 accelerator: `${cmdKey}+Shift+Alt+O`,
651 click: () => {
652 const webview = document.querySelector('webview[partition="persist:todos"]');
653 if (webview) webview.openDevTools();
654 },
655 });
656 }
657
611 tpl[1].submenu.unshift({ 658 tpl[1].submenu.unshift({
612 label: intl.formatMessage(menuItems.reloadService), 659 label: intl.formatMessage(menuItems.reloadService),
613 id: 'reloadService', // TODO: needed? 660 id: 'reloadService', // TODO: needed?
@@ -760,6 +807,14 @@ export default class FranzMenu {
760 tpl[4].submenu = this.workspacesMenu(); 807 tpl[4].submenu = this.workspacesMenu();
761 } 808 }
762 809
810 if (todosStore.isFeatureEnabled) {
811 tpl[5].submenu = this.todosMenu();
812 }
813
814 tpl[tpl.length - 1].submenu.push({
815 type: 'separator',
816 }, this.debugMenu());
817
763 this.currentTemplate = tpl; 818 this.currentTemplate = tpl;
764 const menu = Menu.buildFromTemplate(tpl); 819 const menu = Menu.buildFromTemplate(tpl);
765 Menu.setApplicationMenu(menu); 820 Menu.setApplicationMenu(menu);
@@ -870,6 +925,53 @@ export default class FranzMenu {
870 return menu; 925 return menu;
871 } 926 }
872 927
928 todosMenu() {
929 const { isTodosPanelVisible } = TodoStore;
930 const { intl } = window.franz;
931 const menu = [];
932
933 // Open todos drawer:
934 const drawerLabel = (
935 isTodosPanelVisible ? menuItems.closeTodosDrawer : menuItems.openTodosDrawer
936 );
937 menu.push({
938 label: intl.formatMessage(drawerLabel),
939 accelerator: `${cmdKey}+T`,
940 click: () => {
941 todoActions.toggleTodosPanel();
942 gaEvent(GA_CATEGORY_TODOS, 'toggleDrawer', 'menu');
943 },
944 enabled: this.stores.user.isLoggedIn,
945 }, {
946 type: 'separator',
947 });
948
949 return menu;
950 }
951
952
953 debugMenu() {
954 const { intl } = window.franz;
955
956 return {
957 label: intl.formatMessage(menuItems.debugInfo),
958 click: () => {
959 const { debugInfo } = this.stores.app;
960
961 clipboard.write({
962 text: JSON.stringify(debugInfo),
963 });
964
965 this.actions.app.notify({
966 title: intl.formatMessage(menuItems.debugInfoCopiedHeadline),
967 options: {
968 body: intl.formatMessage(menuItems.debugInfoCopiedBody),
969 },
970 });
971 },
972 };
973 }
974
873 _getServiceName(service) { 975 _getServiceName(service) {
874 if (service.name) { 976 if (service.name) {
875 return service.name; 977 return service.name;