Skip to content

Commit 893a9f6

Browse files
committed
feat(App): Add option to show/hide notification badges for muted services (@maximiliancsuk)
1 parent 3045b47 commit 893a9f6

File tree

13 files changed

+103
-18
lines changed

13 files changed

+103
-18
lines changed

Diff for: src/components/services/tabs/TabBarSortableList.js

+6
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ class TabBarSortableList extends Component {
1717
deleteService: PropTypes.func.isRequired,
1818
disableService: PropTypes.func.isRequired,
1919
enableService: PropTypes.func.isRequired,
20+
showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
21+
showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
2022
}
2123

2224
render() {
@@ -30,6 +32,8 @@ class TabBarSortableList extends Component {
3032
disableService,
3133
enableService,
3234
openSettings,
35+
showMessageBadgeWhenMutedSetting,
36+
showMessageBadgesEvenWhenMuted,
3337
} = this.props;
3438

3539
return (
@@ -50,6 +54,8 @@ class TabBarSortableList extends Component {
5054
disableService={() => disableService({ serviceId: service.id })}
5155
enableService={() => enableService({ serviceId: service.id })}
5256
openSettings={openSettings}
57+
showMessageBadgeWhenMutedSetting={showMessageBadgeWhenMutedSetting}
58+
showMessageBadgesEvenWhenMuted={showMessageBadgesEvenWhenMuted}
5359
/>
5460
))}
5561
{/* <li>

Diff for: src/components/services/tabs/TabItem.js

+25-12
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ class TabItem extends Component {
6363
deleteService: PropTypes.func.isRequired,
6464
disableService: PropTypes.func.isRequired,
6565
enableService: PropTypes.func.isRequired,
66+
showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
67+
showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
6668
};
6769

6870
static contextTypes = {
@@ -81,6 +83,8 @@ class TabItem extends Component {
8183
disableService,
8284
enableService,
8385
openSettings,
86+
showMessageBadgeWhenMutedSetting,
87+
showMessageBadgesEvenWhenMuted,
8488
} = this.props;
8589
const { intl } = this.context;
8690

@@ -121,6 +125,26 @@ class TabItem extends Component {
121125
}];
122126
const menu = Menu.buildFromTemplate(menuTemplate);
123127

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+
124148
return (
125149
<li
126150
className={classnames({
@@ -138,18 +162,7 @@ class TabItem extends Component {
138162
className="tab-item__icon"
139163
alt=""
140164
/>
141-
{service.unreadDirectMessageCount > 0 && (
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-
)}
165+
{notificationBadge}
153166
</li>
154167
);
155168
}

Diff for: src/components/services/tabs/Tabbar.js

+6
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ export default class TabBar extends Component {
1818
toggleAudio: PropTypes.func.isRequired,
1919
deleteService: PropTypes.func.isRequired,
2020
updateService: PropTypes.func.isRequired,
21+
showMessageBadgeWhenMutedSetting: PropTypes.bool.isRequired,
22+
showMessageBadgesEvenWhenMuted: PropTypes.bool.isRequired,
2123
}
2224

2325
onSortEnd = ({ oldIndex, newIndex }) => {
@@ -64,6 +66,8 @@ export default class TabBar extends Component {
6466
toggleNotifications,
6567
toggleAudio,
6668
deleteService,
69+
showMessageBadgeWhenMutedSetting,
70+
showMessageBadgesEvenWhenMuted,
6771
} = this.props;
6872

6973
return (
@@ -85,6 +89,8 @@ export default class TabBar extends Component {
8589
axis="y"
8690
lockAxis="y"
8791
helperClass="is-reordering"
92+
showMessageBadgeWhenMutedSetting={showMessageBadgeWhenMutedSetting}
93+
showMessageBadgesEvenWhenMuted={showMessageBadgesEvenWhenMuted}
8894
/>
8995
</div>
9096
);

Diff for: src/components/settings/settings/EditSettingsForm.js

+1
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ export default class EditSettingsForm extends Component {
142142
{/* Appearance */}
143143
<h2 id="apperance">{intl.formatMessage(messages.headlineAppearance)}</h2>
144144
<Toggle field={form.$('showDisabledServices')} />
145+
<Toggle field={form.$('showMessageBadgeWhenMuted')} />
145146

146147
{/* Language */}
147148
<h2 id="language">{intl.formatMessage(messages.headlineLanguage)}</h2>

Diff for: src/config.js

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export const DEFAULT_APP_SETTINGS = {
1111
enableSystemTray: true,
1212
minimizeToSystemTray: false,
1313
showDisabledServices: true,
14+
showMessageBadgeWhenMuted: true,
1415
enableSpellchecking: true,
1516
// spellcheckingLanguage: 'auto',
1617
locale: 'en-US',

Diff for: src/containers/layout/AppLayoutContainer.js

+2
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ export default class AppLayoutContainer extends Component {
8787
deleteService={deleteService}
8888
updateService={updateService}
8989
toggleMuteApp={toggleMuteApp}
90+
showMessageBadgeWhenMutedSetting={settings.all.showMessageBadgeWhenMuted}
91+
showMessageBadgesEvenWhenMuted={ui.showMessageBadgesEvenWhenMuted}
9092
/>
9193
);
9294

Diff for: src/containers/settings/EditSettingsScreen.js

+10
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@ const messages = defineMessages({
4343
id: 'settings.app.form.showDisabledServices',
4444
defaultMessage: '!!!Display disabled services tabs',
4545
},
46+
showMessageBadgeWhenMuted: {
47+
id: 'settings.app.form.showMessagesBadgesWhenMuted',
48+
defaultMessage: '!!!Show unread message badge when notifications are disabled',
49+
},
4650
enableSpellchecking: {
4751
id: 'settings.app.form.enableSpellchecking',
4852
defaultMessage: '!!!Enable spell checking',
@@ -85,6 +89,7 @@ export default class EditSettingsScreen extends Component {
8589
enableSystemTray: settingsData.enableSystemTray,
8690
minimizeToSystemTray: settingsData.minimizeToSystemTray,
8791
showDisabledServices: settingsData.showDisabledServices,
92+
showMessageBadgeWhenMuted: settingsData.showMessageBadgeWhenMuted,
8893
enableSpellchecking: settingsData.enableSpellchecking,
8994
// spellcheckingLanguage: settingsData.spellcheckingLanguage,
9095
locale: settingsData.locale,
@@ -154,6 +159,11 @@ export default class EditSettingsScreen extends Component {
154159
value: settings.all.showDisabledServices,
155160
default: DEFAULT_APP_SETTINGS.showDisabledServices,
156161
},
162+
showMessageBadgeWhenMuted: {
163+
label: intl.formatMessage(messages.showMessageBadgeWhenMuted),
164+
value: settings.all.showMessageBadgeWhenMuted,
165+
default: DEFAULT_APP_SETTINGS.showMessageBadgeWhenMuted,
166+
},
157167
enableSpellchecking: {
158168
label: intl.formatMessage(messages.enableSpellchecking),
159169
value: settings.all.enableSpellchecking,

Diff for: src/i18n/locales/en-US.json

+1
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@
148148
"settings.app.form.language": "Language",
149149
"settings.app.form.enableSpellchecking": "Enable spell checking",
150150
"settings.app.form.showDisabledServices": "Display disabled services tabs",
151+
"settings.app.form.showMessagesBadgesWhenMuted": "Show unread message badge when notifications are disabled",
151152
"settings.app.form.beta": "Include beta versions",
152153
"settings.app.translationHelp": "Help us to translate Franz into your language.",
153154
"settings.app.currentVersion": "Current version:",

Diff for: src/models/Settings.js

+1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export default class Settings {
88
@observable enableSystemTray = DEFAULT_APP_SETTINGS.enableSystemTray;
99
@observable minimizeToSystemTray = DEFAULT_APP_SETTINGS.minimizeToSystemTray;
1010
@observable showDisabledServices = DEFAULT_APP_SETTINGS.showDisabledServices;
11+
@observable showMessageBadgeWhenMuted = DEFAULT_APP_SETTINGS.showMessageBadgeWhenMuted;
1112
@observable enableSpellchecking = DEFAULT_APP_SETTINGS.enableSpellchecking;
1213
@observable locale = DEFAULT_APP_SETTINGS.locale;
1314
@observable beta = DEFAULT_APP_SETTINGS.beta;

Diff for: src/stores/AppStore.js

+9
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ export default class AppStore extends Store {
6767
this._setLocale.bind(this),
6868
this._handleMiner.bind(this),
6969
this._handleMinerThrottle.bind(this),
70+
this._muteAppHandler.bind(this),
7071
]);
7172
}
7273

@@ -300,6 +301,14 @@ export default class AppStore extends Store {
300301
}
301302
}
302303

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+
303312
// Helpers
304313
async _appStartsCounter() {
305314
// we need to wait until the settings request is resolved

Diff for: src/stores/ServicesStore.js

+14-5
Original file line numberDiff line numberDiff line change
@@ -488,19 +488,28 @@ export default class ServicesStore extends Store {
488488
}
489489

490490
_getUnreadMessageCountReaction() {
491+
const showMessageBadgeWhenMuted = this.stores.settings.all.showMessageBadgeWhenMuted;
492+
const showMessageBadgesEvenWhenMuted = this.stores.ui.showMessageBadgesEvenWhenMuted;
493+
494+
// TODO: unfinished monkey business
495+
491496
const unreadDirectMessageCount = this.enabled
497+
.filter(s => (showMessageBadgeWhenMuted || s.isNotificationEnabled) && showMessageBadgesEvenWhenMuted)
492498
.map(s => s.unreadDirectMessageCount)
493499
.reduce((a, b) => a + b, 0);
494500

495501
const unreadIndirectMessageCount = this.enabled
496-
.filter(s => s.isIndirectMessageBadgeEnabled)
502+
// .filter(s => s.isIndirectMessageBadgeEnabled && (s.isNotificationEnabled && showMessageBadgeWhenMuted))
497503
.map(s => s.unreadIndirectMessageCount)
498504
.reduce((a, b) => a + b, 0);
499505

500-
this.actions.app.setBadge({
501-
unreadDirectMessageCount,
502-
unreadIndirectMessageCount,
503-
});
506+
// We can't just block this earlier, otherwise the mobx reaction won't be aware of the vars to watch in some cases
507+
if (showMessageBadgesEvenWhenMuted) {
508+
this.actions.app.setBadge({
509+
unreadDirectMessageCount,
510+
unreadIndirectMessageCount,
511+
});
512+
}
504513
}
505514

506515
_logoutReaction() {

Diff for: src/stores/UIStore.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { action, observable } from 'mobx';
1+
import { action, observable, computed } from 'mobx';
22

33
import Store from './lib/Store';
44

@@ -14,6 +14,12 @@ export default class UIStore extends Store {
1414
this.actions.ui.toggleServiceUpdatedInfoBar.listen(this._toggleServiceUpdatedInfoBar.bind(this));
1515
}
1616

17+
@computed get showMessageBadgesEvenWhenMuted() {
18+
const settings = this.stores.settings.all;
19+
20+
return (settings.isAppMuted && settings.showMessageBadgeWhenMuted) || !settings.isAppMuted;
21+
}
22+
1723
// Actions
1824
@action _openSettings({ path = '/settings' }) {
1925
const settingsPath = path !== '/settings' ? `/settings/${path}` : path;

Diff for: src/styles/tabs.scss

+20
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,26 @@
7878
}
7979
}
8080

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+
81101
&.is-reordering {
82102
z-index: 99999;
83103
}

0 commit comments

Comments
 (0)