aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Stefan Malzner <stefan@adlk.io>2017-12-01 12:26:41 +0100
committerLibravatar Stefan Malzner <stefan@adlk.io>2017-12-01 12:26:41 +0100
commit893a9f6d9a1bcdbbfe925e718b2c907dcceaa64e (patch)
tree4f6ff5c4f82abe536107a38c9894fad7f41a0c62
parentfix(App): Allow to turn on notifications when system dnd is enabled (diff)
downloadferdium-app-893a9f6d9a1bcdbbfe925e718b2c907dcceaa64e.tar.gz
ferdium-app-893a9f6d9a1bcdbbfe925e718b2c907dcceaa64e.tar.zst
ferdium-app-893a9f6d9a1bcdbbfe925e718b2c907dcceaa64e.zip
feat(App): Add option to show/hide notification badges for muted services (@maximiliancsuk)
-rw-r--r--src/components/services/tabs/TabBarSortableList.js6
-rw-r--r--src/components/services/tabs/TabItem.js37
-rw-r--r--src/components/services/tabs/Tabbar.js6
-rw-r--r--src/components/settings/settings/EditSettingsForm.js1
-rw-r--r--src/config.js1
-rw-r--r--src/containers/layout/AppLayoutContainer.js2
-rw-r--r--src/containers/settings/EditSettingsScreen.js10
-rw-r--r--src/i18n/locales/en-US.json1
-rw-r--r--src/models/Settings.js1
-rw-r--r--src/stores/AppStore.js9
-rw-r--r--src/stores/ServicesStore.js19
-rw-r--r--src/stores/UIStore.js8
-rw-r--r--src/styles/tabs.scss20
13 files changed, 103 insertions, 18 deletions
diff --git a/src/components/services/tabs/TabBarSortableList.js b/src/components/services/tabs/TabBarSortableList.js
index 2daf55676..489027d57 100644
--- a/src/components/services/tabs/TabBarSortableList.js
+++ b/src/components/services/tabs/TabBarSortableList.js
@@ -17,6 +17,8 @@ class TabBarSortableList extends Component {
17 deleteService: PropTypes.func.isRequired, 17 deleteService: PropTypes.func.isRequired,
18 disableService: PropTypes.func.isRequired, 18 disableService: PropTypes.func.isRequired,
19 enableService: PropTypes.func.isRequired, 19 enableService: PropTypes.func.isRequired,
20 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
21 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
20 } 22 }
21 23
22 render() { 24 render() {
@@ -30,6 +32,8 @@ class TabBarSortableList extends Component {
30 disableService, 32 disableService,
31 enableService, 33 enableService,
32 openSettings, 34 openSettings,
35 showMessageBadgeWhenMutedSetting,
36 showMessageBadgesEvenWhenMuted,
33 } = this.props; 37 } = this.props;
34 38
35 return ( 39 return (
@@ -50,6 +54,8 @@ class TabBarSortableList extends Component {
50 disableService={() => disableService({ serviceId: service.id })} 54 disableService={() => disableService({ serviceId: service.id })}
51 enableService={() => enableService({ serviceId: service.id })} 55 enableService={() => enableService({ serviceId: service.id })}
52 openSettings={openSettings} 56 openSettings={openSettings}
57 showMessageBadgeWhenMutedSetting={showMessageBadgeWhenMutedSetting}
58 showMessageBadgesEvenWhenMuted={showMessageBadgesEvenWhenMuted}
53 /> 59 />
54 ))} 60 ))}
55 {/* <li> 61 {/* <li>
diff --git a/src/components/services/tabs/TabItem.js b/src/components/services/tabs/TabItem.js
index a7136c43f..8403d9462 100644
--- a/src/components/services/tabs/TabItem.js
+++ b/src/components/services/tabs/TabItem.js
@@ -63,6 +63,8 @@ class TabItem extends Component {
63 deleteService: PropTypes.func.isRequired, 63 deleteService: PropTypes.func.isRequired,
64 disableService: PropTypes.func.isRequired, 64 disableService: PropTypes.func.isRequired,
65 enableService: PropTypes.func.isRequired, 65 enableService: PropTypes.func.isRequired,
66 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
67 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
66 }; 68 };
67 69
68 static contextTypes = { 70 static contextTypes = {
@@ -81,6 +83,8 @@ class TabItem extends Component {
81 disableService, 83 disableService,
82 enableService, 84 enableService,
83 openSettings, 85 openSettings,
86 showMessageBadgeWhenMutedSetting,
87 showMessageBadgesEvenWhenMuted,
84 } = this.props; 88 } = this.props;
85 const { intl } = this.context; 89 const { intl } = this.context;
86 90
@@ -121,6 +125,26 @@ class TabItem extends Component {
121 }]; 125 }];
122 const menu = Menu.buildFromTemplate(menuTemplate); 126 const menu = Menu.buildFromTemplate(menuTemplate);
123 127
128 let notificationBadge = null;
129 if ((showMessageBadgeWhenMutedSetting || service.isNotificationEnabled) && showMessageBadgesEvenWhenMuted) {
130 notificationBadge = (
131 <span>
132 {service.unreadDirectMessageCount > 0 && (
133 <span className="tab-item__message-count">
134 {service.unreadDirectMessageCount}
135 </span>
136 )}
137 {service.unreadIndirectMessageCount > 0
138 && service.unreadDirectMessageCount === 0
139 && service.isIndirectMessageBadgeEnabled && (
140 <span className="tab-item__message-count is-indirect">
141
142 </span>
143 )}
144 </span>
145 );
146 }
147
124 return ( 148 return (
125 <li 149 <li
126 className={classnames({ 150 className={classnames({
@@ -138,18 +162,7 @@ class TabItem extends Component {
138 className="tab-item__icon" 162 className="tab-item__icon"
139 alt="" 163 alt=""
140 /> 164 />
141 {service.unreadDirectMessageCount > 0 && ( 165 {notificationBadge}
142 <span className="tab-item__message-count">
143 {service.unreadDirectMessageCount}
144 </span>
145 )}
146 {service.unreadIndirectMessageCount > 0
147 && service.unreadDirectMessageCount === 0
148 && service.isIndirectMessageBadgeEnabled && (
149 <span className="tab-item__message-count is-indirect">
150
151 </span>
152 )}
153 </li> 166 </li>
154 ); 167 );
155 } 168 }
diff --git a/src/components/services/tabs/Tabbar.js b/src/components/services/tabs/Tabbar.js
index 9da1090b7..ceb88c51c 100644
--- a/src/components/services/tabs/Tabbar.js
+++ b/src/components/services/tabs/Tabbar.js
@@ -18,6 +18,8 @@ export default class TabBar extends Component {
18 toggleAudio: PropTypes.func.isRequired, 18 toggleAudio: PropTypes.func.isRequired,
19 deleteService: PropTypes.func.isRequired, 19 deleteService: PropTypes.func.isRequired,
20 updateService: PropTypes.func.isRequired, 20 updateService: PropTypes.func.isRequired,
21 showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
22 showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
21 } 23 }
22 24
23 onSortEnd = ({ oldIndex, newIndex }) => { 25 onSortEnd = ({ oldIndex, newIndex }) => {
@@ -64,6 +66,8 @@ export default class TabBar extends Component {
64 toggleNotifications, 66 toggleNotifications,
65 toggleAudio, 67 toggleAudio,
66 deleteService, 68 deleteService,
69 showMessageBadgeWhenMutedSetting,
70 showMessageBadgesEvenWhenMuted,
67 } = this.props; 71 } = this.props;
68 72
69 return ( 73 return (
@@ -85,6 +89,8 @@ export default class TabBar extends Component {
85 axis="y" 89 axis="y"
86 lockAxis="y" 90 lockAxis="y"
87 helperClass="is-reordering" 91 helperClass="is-reordering"
92 showMessageBadgeWhenMutedSetting={showMessageBadgeWhenMutedSetting}
93 showMessageBadgesEvenWhenMuted={showMessageBadgesEvenWhenMuted}
88 /> 94 />
89 </div> 95 </div>
90 ); 96 );
diff --git a/src/components/settings/settings/EditSettingsForm.js b/src/components/settings/settings/EditSettingsForm.js
index 4ce9b7ab2..878e46d6d 100644
--- a/src/components/settings/settings/EditSettingsForm.js
+++ b/src/components/settings/settings/EditSettingsForm.js
@@ -142,6 +142,7 @@ export default class EditSettingsForm extends Component {
142 {/* Appearance */} 142 {/* Appearance */}
143 <h2 id="apperance">{intl.formatMessage(messages.headlineAppearance)}</h2> 143 <h2 id="apperance">{intl.formatMessage(messages.headlineAppearance)}</h2>
144 <Toggle field={form.$('showDisabledServices')} /> 144 <Toggle field={form.$('showDisabledServices')} />
145 <Toggle field={form.$('showMessageBadgeWhenMuted')} />
145 146
146 {/* Language */} 147 {/* Language */}
147 <h2 id="language">{intl.formatMessage(messages.headlineLanguage)}</h2> 148 <h2 id="language">{intl.formatMessage(messages.headlineLanguage)}</h2>
diff --git a/src/config.js b/src/config.js
index b3e00c92c..e6d8958e6 100644
--- a/src/config.js
+++ b/src/config.js
@@ -11,6 +11,7 @@ export const DEFAULT_APP_SETTINGS = {
11 enableSystemTray: true, 11 enableSystemTray: true,
12 minimizeToSystemTray: false, 12 minimizeToSystemTray: false,
13 showDisabledServices: true, 13 showDisabledServices: true,
14 showMessageBadgeWhenMuted: true,
14 enableSpellchecking: true, 15 enableSpellchecking: true,
15 // spellcheckingLanguage: 'auto', 16 // spellcheckingLanguage: 'auto',
16 locale: 'en-US', 17 locale: 'en-US',
diff --git a/src/containers/layout/AppLayoutContainer.js b/src/containers/layout/AppLayoutContainer.js
index da0896844..e4a9d60c3 100644
--- a/src/containers/layout/AppLayoutContainer.js
+++ b/src/containers/layout/AppLayoutContainer.js
@@ -87,6 +87,8 @@ export default class AppLayoutContainer extends Component {
87 deleteService={deleteService} 87 deleteService={deleteService}
88 updateService={updateService} 88 updateService={updateService}
89 toggleMuteApp={toggleMuteApp} 89 toggleMuteApp={toggleMuteApp}
90 showMessageBadgeWhenMutedSetting={settings.all.showMessageBadgeWhenMuted}
91 showMessageBadgesEvenWhenMuted={ui.showMessageBadgesEvenWhenMuted}
90 /> 92 />
91 ); 93 );
92 94
diff --git a/src/containers/settings/EditSettingsScreen.js b/src/containers/settings/EditSettingsScreen.js
index 62e255dab..45ded9e5c 100644
--- a/src/containers/settings/EditSettingsScreen.js
+++ b/src/containers/settings/EditSettingsScreen.js
@@ -43,6 +43,10 @@ const messages = defineMessages({
43 id: 'settings.app.form.showDisabledServices', 43 id: 'settings.app.form.showDisabledServices',
44 defaultMessage: '!!!Display disabled services tabs', 44 defaultMessage: '!!!Display disabled services tabs',
45 }, 45 },
46 showMessageBadgeWhenMuted: {
47 id: 'settings.app.form.showMessagesBadgesWhenMuted',
48 defaultMessage: '!!!Show unread message badge when notifications are disabled',
49 },
46 enableSpellchecking: { 50 enableSpellchecking: {
47 id: 'settings.app.form.enableSpellchecking', 51 id: 'settings.app.form.enableSpellchecking',
48 defaultMessage: '!!!Enable spell checking', 52 defaultMessage: '!!!Enable spell checking',
@@ -85,6 +89,7 @@ export default class EditSettingsScreen extends Component {
85 enableSystemTray: settingsData.enableSystemTray, 89 enableSystemTray: settingsData.enableSystemTray,
86 minimizeToSystemTray: settingsData.minimizeToSystemTray, 90 minimizeToSystemTray: settingsData.minimizeToSystemTray,
87 showDisabledServices: settingsData.showDisabledServices, 91 showDisabledServices: settingsData.showDisabledServices,
92 showMessageBadgeWhenMuted: settingsData.showMessageBadgeWhenMuted,
88 enableSpellchecking: settingsData.enableSpellchecking, 93 enableSpellchecking: settingsData.enableSpellchecking,
89 // spellcheckingLanguage: settingsData.spellcheckingLanguage, 94 // spellcheckingLanguage: settingsData.spellcheckingLanguage,
90 locale: settingsData.locale, 95 locale: settingsData.locale,
@@ -154,6 +159,11 @@ export default class EditSettingsScreen extends Component {
154 value: settings.all.showDisabledServices, 159 value: settings.all.showDisabledServices,
155 default: DEFAULT_APP_SETTINGS.showDisabledServices, 160 default: DEFAULT_APP_SETTINGS.showDisabledServices,
156 }, 161 },
162 showMessageBadgeWhenMuted: {
163 label: intl.formatMessage(messages.showMessageBadgeWhenMuted),
164 value: settings.all.showMessageBadgeWhenMuted,
165 default: DEFAULT_APP_SETTINGS.showMessageBadgeWhenMuted,
166 },
157 enableSpellchecking: { 167 enableSpellchecking: {
158 label: intl.formatMessage(messages.enableSpellchecking), 168 label: intl.formatMessage(messages.enableSpellchecking),
159 value: settings.all.enableSpellchecking, 169 value: settings.all.enableSpellchecking,
diff --git a/src/i18n/locales/en-US.json b/src/i18n/locales/en-US.json
index 37034d4e1..380871668 100644
--- a/src/i18n/locales/en-US.json
+++ b/src/i18n/locales/en-US.json
@@ -148,6 +148,7 @@
148 "settings.app.form.language": "Language", 148 "settings.app.form.language": "Language",
149 "settings.app.form.enableSpellchecking": "Enable spell checking", 149 "settings.app.form.enableSpellchecking": "Enable spell checking",
150 "settings.app.form.showDisabledServices": "Display disabled services tabs", 150 "settings.app.form.showDisabledServices": "Display disabled services tabs",
151 "settings.app.form.showMessagesBadgesWhenMuted": "Show unread message badge when notifications are disabled",
151 "settings.app.form.beta": "Include beta versions", 152 "settings.app.form.beta": "Include beta versions",
152 "settings.app.translationHelp": "Help us to translate Franz into your language.", 153 "settings.app.translationHelp": "Help us to translate Franz into your language.",
153 "settings.app.currentVersion": "Current version:", 154 "settings.app.currentVersion": "Current version:",
diff --git a/src/models/Settings.js b/src/models/Settings.js
index 3b352f9aa..35bfe0d05 100644
--- a/src/models/Settings.js
+++ b/src/models/Settings.js
@@ -8,6 +8,7 @@ export default class Settings {
8 @observable enableSystemTray = DEFAULT_APP_SETTINGS.enableSystemTray; 8 @observable enableSystemTray = DEFAULT_APP_SETTINGS.enableSystemTray;
9 @observable minimizeToSystemTray = DEFAULT_APP_SETTINGS.minimizeToSystemTray; 9 @observable minimizeToSystemTray = DEFAULT_APP_SETTINGS.minimizeToSystemTray;
10 @observable showDisabledServices = DEFAULT_APP_SETTINGS.showDisabledServices; 10 @observable showDisabledServices = DEFAULT_APP_SETTINGS.showDisabledServices;
11 @observable showMessageBadgeWhenMuted = DEFAULT_APP_SETTINGS.showMessageBadgeWhenMuted;
11 @observable enableSpellchecking = DEFAULT_APP_SETTINGS.enableSpellchecking; 12 @observable enableSpellchecking = DEFAULT_APP_SETTINGS.enableSpellchecking;
12 @observable locale = DEFAULT_APP_SETTINGS.locale; 13 @observable locale = DEFAULT_APP_SETTINGS.locale;
13 @observable beta = DEFAULT_APP_SETTINGS.beta; 14 @observable beta = DEFAULT_APP_SETTINGS.beta;
diff --git a/src/stores/AppStore.js b/src/stores/AppStore.js
index 0cfe08a28..6125a7cff 100644
--- a/src/stores/AppStore.js
+++ b/src/stores/AppStore.js
@@ -67,6 +67,7 @@ export default class AppStore extends Store {
67 this._setLocale.bind(this), 67 this._setLocale.bind(this),
68 this._handleMiner.bind(this), 68 this._handleMiner.bind(this),
69 this._handleMinerThrottle.bind(this), 69 this._handleMinerThrottle.bind(this),
70 this._muteAppHandler.bind(this),
70 ]); 71 ]);
71 } 72 }
72 73
@@ -300,6 +301,14 @@ export default class AppStore extends Store {
300 } 301 }
301 } 302 }
302 303
304 _muteAppHandler() {
305 const showMessageBadgesEvenWhenMuted = this.stores.ui.showMessageBadgesEvenWhenMuted;
306
307 if (!showMessageBadgesEvenWhenMuted) {
308 this.actions.app.setBadge({ unreadDirectMessageCount: 0, unreadIndirectMessageCount: 0 });
309 }
310 }
311
303 // Helpers 312 // Helpers
304 async _appStartsCounter() { 313 async _appStartsCounter() {
305 // we need to wait until the settings request is resolved 314 // we need to wait until the settings request is resolved
diff --git a/src/stores/ServicesStore.js b/src/stores/ServicesStore.js
index 22c376c06..e79677400 100644
--- a/src/stores/ServicesStore.js
+++ b/src/stores/ServicesStore.js
@@ -488,19 +488,28 @@ export default class ServicesStore extends Store {
488 } 488 }
489 489
490 _getUnreadMessageCountReaction() { 490 _getUnreadMessageCountReaction() {
491 const showMessageBadgeWhenMuted = this.stores.settings.all.showMessageBadgeWhenMuted;
492 const showMessageBadgesEvenWhenMuted = this.stores.ui.showMessageBadgesEvenWhenMuted;
493
494 // TODO: unfinished monkey business
495
491 const unreadDirectMessageCount = this.enabled 496 const unreadDirectMessageCount = this.enabled
497 .filter(s => (showMessageBadgeWhenMuted || s.isNotificationEnabled) && showMessageBadgesEvenWhenMuted)
492 .map(s => s.unreadDirectMessageCount) 498 .map(s => s.unreadDirectMessageCount)
493 .reduce((a, b) => a + b, 0); 499 .reduce((a, b) => a + b, 0);
494 500
495 const unreadIndirectMessageCount = this.enabled 501 const unreadIndirectMessageCount = this.enabled
496 .filter(s => s.isIndirectMessageBadgeEnabled) 502 // .filter(s => s.isIndirectMessageBadgeEnabled && (s.isNotificationEnabled && showMessageBadgeWhenMuted))
497 .map(s => s.unreadIndirectMessageCount) 503 .map(s => s.unreadIndirectMessageCount)
498 .reduce((a, b) => a + b, 0); 504 .reduce((a, b) => a + b, 0);
499 505
500 this.actions.app.setBadge({ 506 // We can't just block this earlier, otherwise the mobx reaction won't be aware of the vars to watch in some cases
501 unreadDirectMessageCount, 507 if (showMessageBadgesEvenWhenMuted) {
502 unreadIndirectMessageCount, 508 this.actions.app.setBadge({
503 }); 509 unreadDirectMessageCount,
510 unreadIndirectMessageCount,
511 });
512 }
504 } 513 }
505 514
506 _logoutReaction() { 515 _logoutReaction() {
diff --git a/src/stores/UIStore.js b/src/stores/UIStore.js
index cb45b88b5..5e9cc9ba7 100644
--- a/src/stores/UIStore.js
+++ b/src/stores/UIStore.js
@@ -1,4 +1,4 @@
1import { action, observable } from 'mobx'; 1import { action, observable, computed } from 'mobx';
2 2
3import Store from './lib/Store'; 3import Store from './lib/Store';
4 4
@@ -14,6 +14,12 @@ export default class UIStore extends Store {
14 this.actions.ui.toggleServiceUpdatedInfoBar.listen(this._toggleServiceUpdatedInfoBar.bind(this)); 14 this.actions.ui.toggleServiceUpdatedInfoBar.listen(this._toggleServiceUpdatedInfoBar.bind(this));
15 } 15 }
16 16
17 @computed get showMessageBadgesEvenWhenMuted() {
18 const settings = this.stores.settings.all;
19
20 return (settings.isAppMuted && settings.showMessageBadgeWhenMuted) || !settings.isAppMuted;
21 }
22
17 // Actions 23 // Actions
18 @action _openSettings({ path = '/settings' }) { 24 @action _openSettings({ path = '/settings' }) {
19 const settingsPath = path !== '/settings' ? `/settings/${path}` : path; 25 const settingsPath = path !== '/settings' ? `/settings/${path}` : path;
diff --git a/src/styles/tabs.scss b/src/styles/tabs.scss
index 3ffc53558..ac48aabd6 100644
--- a/src/styles/tabs.scss
+++ b/src/styles/tabs.scss
@@ -78,6 +78,26 @@
78 } 78 }
79 } 79 }
80 80
81 .tab-item__info-badge {
82 width: 17px;
83 height: 17px;
84 background: $theme-gray-light;
85 color: $theme-gray-lighter;
86 border-radius: 20px;
87 padding: 0px 5px;
88 font-size: 11px;
89 position: absolute;
90 right: 8px;
91 bottom: 8px;
92 display: flex;
93 justify-content: center;
94 align-items: center;
95
96 &.is-indirect {
97 padding-top: 0px;
98 }
99 }
100
81 &.is-reordering { 101 &.is-reordering {
82 z-index: 99999; 102 z-index: 99999;
83 } 103 }