@ -7,6 +7,7 @@ import ImmutablePropTypes from 'react-immutable-proptypes';
import { PERMISSION _MANAGE _USERS , PERMISSION _MANAGE _REPORTS } from 'mastodon/permissions' ;
import { CheckboxWithLabel } from './checkbox_with_label' ;
import ClearColumnButton from './clear_column_button' ;
import GrantPermissionButton from './grant_permission_button' ;
import SettingToggle from './setting_toggle' ;
@ -26,18 +27,34 @@ export default class ColumnSettings extends PureComponent {
alertsEnabled : PropTypes . bool ,
browserSupport : PropTypes . bool ,
browserPermission : PropTypes . string ,
notificationPolicy : ImmutablePropTypes . map ,
onChangePolicy : PropTypes . func . isRequired ,
} ;
onPushChange = ( path , checked ) => {
this . props . onChange ( [ 'push' , ... path ] , checked ) ;
} ;
handleFilterNotFollowing = checked => {
this . props . onChangePolicy ( 'filter_not_following' , checked ) ;
} ;
handleFilterNotFollowers = checked => {
this . props . onChangePolicy ( 'filter_not_followers' , checked ) ;
} ;
handleFilterNewAccounts = checked => {
this . props . onChangePolicy ( 'filter_new_accounts' , checked ) ;
} ;
handleFilterPrivateMentions = checked => {
this . props . onChangePolicy ( 'filter_private_mentions' , checked ) ;
} ;
render ( ) {
const { settings , pushSettings , onChange , onClear , alertsEnabled , browserSupport , browserPermission , onRequestNotificationPermission } = this . props ;
const { settings , pushSettings , onChange , onClear , alertsEnabled , browserSupport , browserPermission , onRequestNotificationPermission , notificationPolicy } = this . props ;
const unreadMarkersShowStr = < FormattedMessage id = 'notifications.column_settings.unread_notifications.highlight' defaultMessage = 'Highlight unread notifications' / > ;
const filterBarShowStr = < FormattedMessage id = 'notifications.column_settings.filter_bar.show_bar' defaultMessage = 'Show filter bar' / > ;
const filterAdvancedStr = < FormattedMessage id = 'notifications.column_settings.filter_bar.advanced' defaultMessage = 'Display all categories' / > ;
const alertStr = < FormattedMessage id = 'notifications.column_settings.alert' defaultMessage = 'Desktop notifications' / > ;
const showStr = < FormattedMessage id = 'notifications.column_settings.show' defaultMessage = 'Show in column' / > ;
const soundStr = < FormattedMessage id = 'notifications.column_settings.sound' defaultMessage = 'Play sound' / > ;
@ -46,48 +63,59 @@ export default class ColumnSettings extends PureComponent {
const pushStr = showPushSettings && < FormattedMessage id = 'notifications.column_settings.push' defaultMessage = 'Push notifications' / > ;
return (
< div >
< div className = 'column-settings' >
{ alertsEnabled && browserSupport && browserPermission === 'denied' && (
< div className = 'column-settings__row column-settings__row--with-margin' >
< span className = 'warning-hint' > < FormattedMessage id = 'notifications.permission_denied' defaultMessage = 'Desktop notifications are unavailable due to previously denied browser permissions request' / > < / span >
< / div >
) }
{ alertsEnabled && browserSupport && browserPermission === 'default' && (
< div className = 'column-settings__row column-settings__row--with-margin' >
< span className = 'warning-hint' >
< FormattedMessage id = 'notifications.permission_required' defaultMessage = 'Desktop notifications are unavailable because the required permission has not been granted.' / > < GrantPermissionButton onClick = { onRequestNotificationPermission } / >
< / span >
< / div >
) }
< div clas sNam e= ' column-set tings__row' >
< sectio n>
< ClearColumnButton onClick = { onClear } / >
< / div >
< / section >
< div role = 'group' aria - labelledby = 'notifications-unread-markers' >
< span id = 'notifications-unread-markers' className = 'column-settings__section' >
< FormattedMessage id = 'notifications.column_settings.unread_notifications.category' defaultMessage = 'Unread notifications' / >
< / span >
< section >
< h3 > < FormattedMessage id = 'notifications.policy.title' defaultMessage = 'Filter out notifications from…' / > < / h3 >
< div className = 'column-settings__row' >
< SettingToggle id = 'unread-notification-markers' prefix = 'notifications' settings = { settings } settingPath = { [ 'showUnread' ] } onChange = { onChange } label = { unreadMarkersShowStr } / >
< / div >
< / div >
< div role = 'group' aria - labelledby = 'notifications-filter-bar' >
< span id = 'notifications-filter-bar' className = 'column-settings__section' >
< FormattedMessage id = 'notifications.column_settings.filter_bar.category' defaultMessage = 'Quick filter bar' / >
< / span >
< CheckboxWithLabel checked = { notificationPolicy . get ( 'filter_not_following' ) } onChange = { this . handleFilterNotFollowing } >
< strong > < FormattedMessage id = 'notifications.policy.filter_not_following_title' defaultMessage = "People you don't follow" / > < / strong >
< span className = 'hint' > < FormattedMessage id = 'notifications.policy.filter_not_following_hint' defaultMessage = 'Until you manually approve them' / > < / span >
< / CheckboxWithLabel >
< CheckboxWithLabel checked = { notificationPolicy . get ( 'filter_not_followers' ) } onChange = { this . handleFilterNotFollowers } >
< strong > < FormattedMessage id = 'notifications.policy.filter_not_followers_title' defaultMessage = 'People not following you' / > < / strong >
< span className = 'hint' > < FormattedMessage id = 'notifications.policy.filter_not_followers_hint' defaultMessage = 'Including people who have been following you fewer than {days, plural, one {one day} other {# days}}' values = { { days : 3 } } / > < / span >
< / CheckboxWithLabel >
< CheckboxWithLabel checked = { notificationPolicy . get ( 'filter_new_accounts' ) } onChange = { this . handleFilterNewAccounts } >
< strong > < FormattedMessage id = 'notifications.policy.filter_new_accounts_title' defaultMessage = 'New accounts' / > < / strong >
< span className = 'hint' > < FormattedMessage id = 'notifications.policy.filter_new_accounts.hint' defaultMessage = 'Created within the past {days, plural, one {one day} other {# days}}' values = { { days : 30 } } / > < / span >
< / CheckboxWithLabel >
< CheckboxWithLabel checked = { notificationPolicy . get ( 'filter_private_mentions' ) } onChange = { this . handleFilterPrivateMentions } >
< strong > < FormattedMessage id = 'notifications.policy.filter_private_mentions_title' defaultMessage = 'Unsolicited private mentions' / > < / strong >
< span className = 'hint' > < FormattedMessage id = 'notifications.policy.filter_private_mentions_hint' defaultMessage = "Filtered unless it's in reply to your own mention or if you follow the sender" / > < / span >
< / CheckboxWithLabel >
< / div >
< / section >
< section role = 'group' aria - labelledby = 'notifications-unread-markers' >
< h3 id = 'notifications-unread-markers' >
< FormattedMessage id = 'notifications.column_settings.unread_notifications.category' defaultMessage = 'Unread notifications' / >
< / h3 >
< div className = 'column-settings__row' >
< SettingToggle id = 'show-filter-bar' prefix = 'notifications' settings = { settings } settingPath = { [ 'quickFilter' , 'show' ] } onChange = { onChange } label = { filterBarShowStr } / >
< SettingToggle id = 'show-filter-bar' prefix = 'notifications' settings = { settings } settingPath = { [ 'quickFilter' , 'advanced' ] } onChange = { onChange } label = { filterAdvancedStr } / >
< / div >
< SettingToggle id = 'unread-notification-markers' prefix = 'notifications' settings = { settings } settingPath = { [ 'showUnread' ] } onChange = { onChange } label = { unreadMarkersShowStr } / >
< / div >
< / section >
< div role = 'group' aria - labelledby = 'notifications-follow' >
< span id = 'notifications-follow' className = 'column-settings__section' > < FormattedMessage id = 'notifications.column_settings.follow' defaultMessage = 'New followers:' / > < / span >
< section role = 'group' aria - labelledby = 'notifications-follow' >
< h3 id = 'notifications-follow '> < FormattedMessage id = 'notifications.column_settings.follow' defaultMessage = 'New followers:' / > < / h3 >
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'follow' ] } onChange = { onChange } label = { alertStr } / >
@ -95,10 +123,10 @@ export default class ColumnSettings extends PureComponent {
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'follow' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'follow' ] } onChange = { onChange } label = { soundStr } / >
< / div >
< / div >
< / section >
< div role = 'group' aria - labelledby = 'notifications-follow-request' >
< span id = 'notifications-follow-request ' className = 'column-settings__section '> < FormattedMessage id = 'notifications.column_settings.follow_request' defaultMessage = 'New follow requests:' / > < / span >
< section role = 'group' aria - labelledby = 'notifications-follow-request' >
< h3 id = 'notifications-follow-request '> < FormattedMessage id = 'notifications.column_settings.follow_request' defaultMessage = 'New follow requests:' / > < / h3 >
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'follow_request' ] } onChange = { onChange } label = { alertStr } / >
@ -106,10 +134,10 @@ export default class ColumnSettings extends PureComponent {
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'follow_request' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'follow_request' ] } onChange = { onChange } label = { soundStr } / >
< / div >
< / div >
< / section >
< div role = 'group' aria - labelledby = 'notifications-favourite' >
< span id = 'notifications-favourite ' className = 'column-settings__section '> < FormattedMessage id = 'notifications.column_settings.favourite' defaultMessage = 'Favorites:' / > < / span >
< section role = 'group' aria - labelledby = 'notifications-favourite' >
< h3 id = 'notifications-favourite '> < FormattedMessage id = 'notifications.column_settings.favourite' defaultMessage = 'Favorites:' / > < / h3 >
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'favourite' ] } onChange = { onChange } label = { alertStr } / >
@ -117,10 +145,10 @@ export default class ColumnSettings extends PureComponent {
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'favourite' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'favourite' ] } onChange = { onChange } label = { soundStr } / >
< / div >
< / div >
< / section >
< div role = 'group' aria - labelledby = 'notifications-mention' >
< span id = 'notifications-mention' className = 'column-settings__sec tion'> < FormattedMessage id = 'notifications.column_settings.mention' defaultMessage = 'Mentions:' / > < / span >
< section role = 'group' aria - labelledby = 'notifications-mention' >
< h3 id = 'notifications-men tion'> < FormattedMessage id = 'notifications.column_settings.mention' defaultMessage = 'Mentions:' / > < / h3 >
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'mention' ] } onChange = { onChange } label = { alertStr } / >
@ -128,10 +156,10 @@ export default class ColumnSettings extends PureComponent {
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'mention' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'mention' ] } onChange = { onChange } label = { soundStr } / >
< / div >
< / div >
< / section >
< div role = 'group' aria - labelledby = 'notifications-reblog' >
< span id = 'notifications-reblog ' className = 'column-settings__section '> < FormattedMessage id = 'notifications.column_settings.reblog' defaultMessage = 'Boosts:' / > < / span >
< section role = 'group' aria - labelledby = 'notifications-reblog' >
< h3 id = 'notifications-reblog '> < FormattedMessage id = 'notifications.column_settings.reblog' defaultMessage = 'Boosts:' / > < / h3 >
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'reblog' ] } onChange = { onChange } label = { alertStr } / >
@ -139,10 +167,10 @@ export default class ColumnSettings extends PureComponent {
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'reblog' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'reblog' ] } onChange = { onChange } label = { soundStr } / >
< / div >
< / div >
< / section >
< div role = 'group' aria - labelledby = 'notifications-poll' >
< span id = 'notifications-poll ' className = 'column-settings__section '> < FormattedMessage id = 'notifications.column_settings.poll' defaultMessage = 'Poll results:' / > < / span >
< section role = 'group' aria - labelledby = 'notifications-poll' >
< h3 id = 'notifications-poll '> < FormattedMessage id = 'notifications.column_settings.poll' defaultMessage = 'Poll results:' / > < / h3 >
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'poll' ] } onChange = { onChange } label = { alertStr } / >
@ -150,10 +178,10 @@ export default class ColumnSettings extends PureComponent {
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'poll' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'poll' ] } onChange = { onChange } label = { soundStr } / >
< / div >
< / div >
< / section >
< div role = 'group' aria - labelledby = 'notifications-status' >
< span id = 'notifications-status ' className = 'column-settings__section '> < FormattedMessage id = 'notifications.column_settings.status' defaultMessage = 'New posts:' / > < / span >
< section role = 'group' aria - labelledby = 'notifications-status' >
< h3 id = 'notifications-status '> < FormattedMessage id = 'notifications.column_settings.status' defaultMessage = 'New posts:' / > < / h3 >
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'status' ] } onChange = { onChange } label = { alertStr } / >
@ -161,10 +189,10 @@ export default class ColumnSettings extends PureComponent {
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'status' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'status' ] } onChange = { onChange } label = { soundStr } / >
< / div >
< / div >
< / section >
< div role = 'group' aria - labelledby = 'notifications-update' >
< span id = 'notifications-update ' className = 'column-settings__section '> < FormattedMessage id = 'notifications.column_settings.update' defaultMessage = 'Edits:' / > < / span >
< section role = 'group' aria - labelledby = 'notifications-update' >
< h3 id = 'notifications-update '> < FormattedMessage id = 'notifications.column_settings.update' defaultMessage = 'Edits:' / > < / h3 >
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'update' ] } onChange = { onChange } label = { alertStr } / >
@ -172,11 +200,11 @@ export default class ColumnSettings extends PureComponent {
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'update' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'update' ] } onChange = { onChange } label = { soundStr } / >
< / div >
< / div >
< / section >
{ ( ( this . context . identity . permissions & PERMISSION _MANAGE _USERS ) === PERMISSION _MANAGE _USERS ) && (
< div role = 'group' aria - labelledby = 'notifications-admin-sign-up' >
< span id = 'notifications-status ' className = 'column-settings__section '> < FormattedMessage id = 'notifications.column_settings.admin.sign_up' defaultMessage = 'New sign-ups:' / > < / span >
< section role = 'group' aria - labelledby = 'notifications-admin-sign-up' >
< h3 id = 'notifications-status '> < FormattedMessage id = 'notifications.column_settings.admin.sign_up' defaultMessage = 'New sign-ups:' / > < / h3 >
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'admin.sign_up' ] } onChange = { onChange } label = { alertStr } / >
@ -184,12 +212,12 @@ export default class ColumnSettings extends PureComponent {
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'admin.sign_up' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'admin.sign_up' ] } onChange = { onChange } label = { soundStr } / >
< / div >
< / div >
< / section >
) }
{ ( ( this . context . identity . permissions & PERMISSION _MANAGE _REPORTS ) === PERMISSION _MANAGE _REPORTS ) && (
< div role = 'group' aria - labelledby = 'notifications-admin-report' >
< span id = 'notifications-status ' className = 'column-settings__section '> < FormattedMessage id = 'notifications.column_settings.admin.report' defaultMessage = 'New reports:' / > < / span >
< section role = 'group' aria - labelledby = 'notifications-admin-report' >
< h3 id = 'notifications-status '> < FormattedMessage id = 'notifications.column_settings.admin.report' defaultMessage = 'New reports:' / > < / h3 >
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'admin.report' ] } onChange = { onChange } label = { alertStr } / >
@ -197,7 +225,7 @@ export default class ColumnSettings extends PureComponent {
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'admin.report' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'admin.report' ] } onChange = { onChange } label = { soundStr } / >
< / div >
< / div >
< / section >
) }
< / div >
) ;