2017-04-22 04:05:35 +10:00
import PropTypes from 'prop-types' ;
2023-05-24 01:15:17 +10:00
import { PureComponent } from 'react' ;
2017-06-12 20:26:23 +10:00
import { FormattedMessage } from 'react-intl' ;
2023-05-24 01:15:17 +10:00
import ImmutablePropTypes from 'react-immutable-proptypes' ;
2024-05-20 03:07:32 +10:00
import { identityContextPropShape , withIdentity } from 'mastodon/identity_context' ;
2023-05-24 01:15:17 +10:00
import { PERMISSION _MANAGE _USERS , PERMISSION _MANAGE _REPORTS } from 'mastodon/permissions' ;
2017-06-12 20:26:23 +10:00
import ClearColumnButton from './clear_column_button' ;
2020-12-16 04:43:54 +11:00
import GrantPermissionButton from './grant_permission_button' ;
2024-08-03 00:59:37 +10:00
import { PolicyControls } from './policy_controls' ;
2017-01-11 03:25:10 +11:00
import SettingToggle from './setting_toggle' ;
2017-01-03 00:09:57 +11:00
2024-05-20 03:07:32 +10:00
class ColumnSettings extends PureComponent {
2017-05-12 22:44:10 +10:00
static propTypes = {
2024-05-20 03:07:32 +10:00
identity : identityContextPropShape ,
2017-05-12 22:44:10 +10:00
settings : ImmutablePropTypes . map . isRequired ,
2017-07-14 06:15:32 +10:00
pushSettings : ImmutablePropTypes . map . isRequired ,
2017-05-12 22:44:10 +10:00
onChange : PropTypes . func . isRequired ,
2017-06-12 20:26:23 +10:00
onClear : PropTypes . func . isRequired ,
2020-10-16 01:24:47 +11:00
onRequestNotificationPermission : PropTypes . func ,
2020-10-13 09:37:21 +11:00
alertsEnabled : PropTypes . bool ,
browserSupport : PropTypes . bool ,
2022-11-07 13:39:48 +11:00
browserPermission : PropTypes . string ,
2017-05-12 22:44:10 +10:00
} ;
2018-01-02 23:50:54 +11:00
onPushChange = ( path , checked ) => {
this . props . onChange ( [ 'push' , ... path ] , checked ) ;
2023-01-30 11:45:35 +11:00
} ;
2017-07-14 06:15:32 +10:00
2017-01-03 00:09:57 +11:00
render ( ) {
2024-08-03 00:59:37 +10:00
const { settings , pushSettings , onChange , onClear , alertsEnabled , browserSupport , browserPermission , onRequestNotificationPermission } = this . props ;
2017-01-03 00:09:57 +11:00
2024-03-25 01:17:06 +11:00
const filterAdvancedStr = < FormattedMessage id = 'notifications.column_settings.filter_bar.advanced' defaultMessage = 'Display all categories' / > ;
2021-10-26 01:32:28 +11:00
const unreadMarkersShowStr = < FormattedMessage id = 'notifications.column_settings.unread_notifications.highlight' defaultMessage = 'Highlight unread notifications' / > ;
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' / > ;
2017-01-03 00:09:57 +11:00
2017-07-14 06:15:32 +10:00
const showPushSettings = pushSettings . get ( 'browserSupport' ) && pushSettings . get ( 'isSubscribed' ) ;
const pushStr = showPushSettings && < FormattedMessage id = 'notifications.column_settings.push' defaultMessage = 'Push notifications' / > ;
2017-01-03 00:09:57 +11:00
return (
2024-03-12 02:02:21 +11:00
< div className = 'column-settings' >
< section >
2017-06-12 20:26:23 +10:00
< ClearColumnButton onClick = { onClear } / >
2024-03-12 02:02:21 +11:00
< / section >
2017-06-12 20:26:23 +10:00
2024-08-14 05:32:27 +10:00
{ alertsEnabled && browserSupport && browserPermission === 'denied' && (
< section >
< span className = 'warning-hint' >
< FormattedMessage id = 'notifications.permission_denied' defaultMessage = 'Desktop notifications are unavailable due to previously denied browser permissions request' / >
< / span >
< / section >
) }
2024-03-20 22:06:44 +11:00
{ alertsEnabled && browserSupport && browserPermission === 'default' && (
< section >
< 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 >
< / section >
) }
2024-08-03 00:59:37 +10:00
< PolicyControls / >
2021-03-19 12:44:57 +11:00
2024-03-12 02:02:21 +11:00
< 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 >
2020-10-16 01:24:47 +11:00
2018-12-16 15:56:41 +11:00
< div className = 'column-settings__row' >
2024-03-12 02:02:21 +11:00
< SettingToggle id = 'unread-notification-markers' prefix = 'notifications' settings = { settings } settingPath = { [ 'showUnread' ] } onChange = { onChange } label = { unreadMarkersShowStr } / >
2018-12-16 15:56:41 +11:00
< / div >
2024-03-12 02:02:21 +11:00
< / section >
2018-12-16 15:56:41 +11:00
2024-03-25 01:17:06 +11:00
< section role = 'group' aria - labelledby = 'notifications-filter-bar' >
< h3 id = 'notifications-filter-bar' >
< FormattedMessage id = 'notifications.column_settings.filter_bar.category' defaultMessage = 'Quick filter bar' / >
< / h3 >
< div className = 'column-settings__row' >
< SettingToggle id = 'advanced-filter-bar' prefix = 'notifications' settings = { settings } settingPath = { [ 'quickFilter' , 'advanced' ] } onChange = { onChange } label = { filterAdvancedStr } / >
< / div >
< / section >
2024-03-12 02:02:21 +11:00
< section role = 'group' aria - labelledby = 'notifications-follow' >
< h3 id = 'notifications-follow' > < FormattedMessage id = 'notifications.column_settings.follow' defaultMessage = 'New followers:' / > < / h3 >
2017-07-26 21:46:53 +10:00
< div className = 'column-settings__row' >
2020-12-16 04:43:54 +11:00
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'follow' ] } onChange = { onChange } label = { alertStr } / >
2018-09-25 23:59:19 +10:00
{ showPushSettings && < SettingToggle prefix = 'notifications_push' settings = { pushSettings } settingPath = { [ 'alerts' , 'follow' ] } onChange = { this . onPushChange } label = { pushStr } / > }
2017-12-20 18:19:59 +11:00
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'follow' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'follow' ] } onChange = { onChange } label = { soundStr } / >
2017-07-26 21:46:53 +10:00
< / div >
2024-03-12 02:02:21 +11:00
< / section >
2017-01-11 03:25:10 +11:00
2024-03-12 02:02:21 +11:00
< 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 >
2019-12-02 03:25:29 +11:00
< div className = 'column-settings__row' >
2020-12-16 04:43:54 +11:00
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'follow_request' ] } onChange = { onChange } label = { alertStr } / >
2019-12-02 03:25:29 +11:00
{ showPushSettings && < SettingToggle prefix = 'notifications_push' settings = { pushSettings } settingPath = { [ 'alerts' , 'follow_request' ] } onChange = { this . onPushChange } label = { pushStr } / > }
< 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 >
2024-03-12 02:02:21 +11:00
< / section >
2019-12-02 03:25:29 +11:00
2024-03-12 02:02:21 +11:00
< section role = 'group' aria - labelledby = 'notifications-favourite' >
< h3 id = 'notifications-favourite' > < FormattedMessage id = 'notifications.column_settings.favourite' defaultMessage = 'Favorites:' / > < / h3 >
2017-01-11 03:25:10 +11:00
2017-07-26 21:46:53 +10:00
< div className = 'column-settings__row' >
2020-12-16 04:43:54 +11:00
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'favourite' ] } onChange = { onChange } label = { alertStr } / >
2018-09-25 23:59:19 +10:00
{ showPushSettings && < SettingToggle prefix = 'notifications_push' settings = { pushSettings } settingPath = { [ 'alerts' , 'favourite' ] } onChange = { this . onPushChange } label = { pushStr } / > }
2017-12-20 18:19:59 +11:00
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'favourite' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'favourite' ] } onChange = { onChange } label = { soundStr } / >
2017-07-26 21:46:53 +10:00
< / div >
2024-03-12 02:02:21 +11:00
< / section >
2017-01-11 03:25:10 +11:00
2024-03-12 02:02:21 +11:00
< section role = 'group' aria - labelledby = 'notifications-mention' >
< h3 id = 'notifications-mention' > < FormattedMessage id = 'notifications.column_settings.mention' defaultMessage = 'Mentions:' / > < / h3 >
2017-01-11 03:25:10 +11:00
2017-07-26 21:46:53 +10:00
< div className = 'column-settings__row' >
2020-12-16 04:43:54 +11:00
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'mention' ] } onChange = { onChange } label = { alertStr } / >
2018-09-25 23:59:19 +10:00
{ showPushSettings && < SettingToggle prefix = 'notifications_push' settings = { pushSettings } settingPath = { [ 'alerts' , 'mention' ] } onChange = { this . onPushChange } label = { pushStr } / > }
2017-12-20 18:19:59 +11:00
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'mention' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'mention' ] } onChange = { onChange } label = { soundStr } / >
2017-07-26 21:46:53 +10:00
< / div >
2024-03-12 02:02:21 +11:00
< / section >
2017-01-11 03:25:10 +11:00
2024-03-12 02:02:21 +11:00
< section role = 'group' aria - labelledby = 'notifications-reblog' >
< h3 id = 'notifications-reblog' > < FormattedMessage id = 'notifications.column_settings.reblog' defaultMessage = 'Boosts:' / > < / h3 >
2017-01-11 03:25:10 +11:00
2017-07-26 21:46:53 +10:00
< div className = 'column-settings__row' >
2020-12-16 04:43:54 +11:00
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'reblog' ] } onChange = { onChange } label = { alertStr } / >
2018-09-25 23:59:19 +10:00
{ showPushSettings && < SettingToggle prefix = 'notifications_push' settings = { pushSettings } settingPath = { [ 'alerts' , 'reblog' ] } onChange = { this . onPushChange } label = { pushStr } / > }
2017-12-20 18:19:59 +11:00
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'shows' , 'reblog' ] } onChange = { onChange } label = { showStr } / >
< SettingToggle prefix = 'notifications' settings = { settings } settingPath = { [ 'sounds' , 'reblog' ] } onChange = { onChange } label = { soundStr } / >
2017-07-26 21:46:53 +10:00
< / div >
2024-03-12 02:02:21 +11:00
< / section >
2019-03-14 05:29:54 +11:00
2024-03-12 02:02:21 +11:00
< section role = 'group' aria - labelledby = 'notifications-poll' >
< h3 id = 'notifications-poll' > < FormattedMessage id = 'notifications.column_settings.poll' defaultMessage = 'Poll results:' / > < / h3 >
2019-03-14 05:29:54 +11:00
< div className = 'column-settings__row' >
2020-12-16 04:43:54 +11:00
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'poll' ] } onChange = { onChange } label = { alertStr } / >
2019-03-14 05:29:54 +11:00
{ showPushSettings && < SettingToggle prefix = 'notifications_push' settings = { pushSettings } settingPath = { [ 'alerts' , 'poll' ] } onChange = { this . onPushChange } label = { pushStr } / > }
< 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 >
2024-03-12 02:02:21 +11:00
< / section >
2020-10-16 01:24:47 +11:00
2024-03-12 02:02:21 +11:00
< section role = 'group' aria - labelledby = 'notifications-status' >
< h3 id = 'notifications-status' > < FormattedMessage id = 'notifications.column_settings.status' defaultMessage = 'New posts:' / > < / h3 >
2020-10-16 01:24:47 +11:00
< div className = 'column-settings__row' >
2020-12-16 04:43:54 +11:00
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'status' ] } onChange = { onChange } label = { alertStr } / >
2020-10-16 01:24:47 +11:00
{ showPushSettings && < SettingToggle prefix = 'notifications_push' settings = { pushSettings } settingPath = { [ 'alerts' , 'status' ] } onChange = { this . onPushChange } label = { pushStr } / > }
< 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 >
2024-03-12 02:02:21 +11:00
< / section >
2022-02-12 08:20:19 +11:00
2024-03-12 02:02:21 +11:00
< section role = 'group' aria - labelledby = 'notifications-update' >
< h3 id = 'notifications-update' > < FormattedMessage id = 'notifications.column_settings.update' defaultMessage = 'Edits:' / > < / h3 >
2022-02-12 08:20:19 +11:00
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'update' ] } onChange = { onChange } label = { alertStr } / >
{ showPushSettings && < SettingToggle prefix = 'notifications_push' settings = { pushSettings } settingPath = { [ 'alerts' , 'update' ] } onChange = { this . onPushChange } label = { pushStr } / > }
< 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 >
2024-03-12 02:02:21 +11:00
< / section >
2022-02-24 02:45:22 +11:00
2024-05-20 03:07:32 +10:00
{ ( ( this . props . identity . permissions & PERMISSION _MANAGE _USERS ) === PERMISSION _MANAGE _USERS ) && (
2024-03-12 02:02:21 +11:00
< 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 >
2022-02-24 02:45:22 +11:00
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'admin.sign_up' ] } onChange = { onChange } label = { alertStr } / >
{ showPushSettings && < SettingToggle prefix = 'notifications_push' settings = { pushSettings } settingPath = { [ 'alerts' , 'admin.sign_up' ] } onChange = { this . onPushChange } label = { pushStr } / > }
< 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 >
2024-03-12 02:02:21 +11:00
< / section >
2022-02-24 02:45:22 +11:00
) }
2022-06-27 17:30:15 +10:00
2024-05-20 03:07:32 +10:00
{ ( ( this . props . identity . permissions & PERMISSION _MANAGE _REPORTS ) === PERMISSION _MANAGE _REPORTS ) && (
2024-03-12 02:02:21 +11:00
< section role = 'group' aria - labelledby = 'notifications-admin-report' >
< h3 id = 'notifications-status' > < FormattedMessage id = 'notifications.column_settings.admin.report' defaultMessage = 'New reports:' / > < / h3 >
2022-06-27 17:30:15 +10:00
< div className = 'column-settings__row' >
< SettingToggle disabled = { browserPermission === 'denied' } prefix = 'notifications_desktop' settings = { settings } settingPath = { [ 'alerts' , 'admin.report' ] } onChange = { onChange } label = { alertStr } / >
{ showPushSettings && < SettingToggle prefix = 'notifications_push' settings = { pushSettings } settingPath = { [ 'alerts' , 'admin.report' ] } onChange = { this . onPushChange } label = { pushStr } / > }
< 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 >
2024-03-12 02:02:21 +11:00
< / section >
2022-06-27 17:30:15 +10:00
) }
2017-06-04 09:39:38 +10:00
< / div >
2017-01-03 00:09:57 +11:00
) ;
}
2017-04-22 04:05:35 +10:00
}
2024-05-20 03:07:32 +10:00
export default withIdentity ( ColumnSettings ) ;