[Glitch] Add ability for admins to force grouped notifications in web UI
Port c73868cd78
to glitch-soc
Signed-off-by: Claire <claire.github-309c@sitedethib.com>
pull/2828/head
parent
e15fad27bc
commit
435ff8e550
|
@ -2,6 +2,7 @@ import { debounce } from 'lodash';
|
|||
|
||||
import type { MarkerJSON } from 'flavours/glitch/api_types/markers';
|
||||
import { getAccessToken } from 'flavours/glitch/initial_state';
|
||||
import { selectUseGroupedNotifications } from 'flavours/glitch/selectors/settings';
|
||||
import type { AppDispatch, RootState } from 'flavours/glitch/store';
|
||||
import { createAppAsyncThunk } from 'flavours/glitch/store/typed_functions';
|
||||
|
||||
|
@ -75,13 +76,8 @@ interface MarkerParam {
|
|||
}
|
||||
|
||||
function getLastNotificationId(state: RootState): string | undefined {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
|
||||
const enableBeta = state.settings.getIn(
|
||||
['notifications', 'groupingBeta'],
|
||||
false,
|
||||
) as boolean;
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-return
|
||||
return enableBeta
|
||||
return selectUseGroupedNotifications(state)
|
||||
? state.notificationGroups.lastReadId
|
||||
: // @ts-expect-error state.notifications is not yet typed
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import { selectUseGroupedNotifications } from 'flavours/glitch/selectors/settings';
|
||||
import { createAppAsyncThunk } from 'flavours/glitch/store';
|
||||
|
||||
import { fetchNotifications } from './notification_groups';
|
||||
|
@ -6,13 +7,8 @@ import { expandNotifications } from './notifications';
|
|||
export const initializeNotifications = createAppAsyncThunk(
|
||||
'notifications/initialize',
|
||||
(_, { dispatch, getState }) => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
|
||||
const enableBeta = getState().settings.getIn(
|
||||
['notifications', 'groupingBeta'],
|
||||
false,
|
||||
) as boolean;
|
||||
|
||||
if (enableBeta) void dispatch(fetchNotifications());
|
||||
if (selectUseGroupedNotifications(getState()))
|
||||
void dispatch(fetchNotifications());
|
||||
else void dispatch(expandNotifications({}));
|
||||
},
|
||||
);
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
// @ts-check
|
||||
|
||||
import { selectUseGroupedNotifications } from 'flavours/glitch/selectors/settings';
|
||||
|
||||
import { getLocale } from '../locales';
|
||||
import { connectStream } from '../stream';
|
||||
|
||||
|
@ -103,7 +105,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
|
|||
const notificationJSON = JSON.parse(data.payload);
|
||||
dispatch(updateNotifications(notificationJSON, messages, locale));
|
||||
// TODO: remove this once the groups feature replaces the previous one
|
||||
if(getState().settings.getIn(['notifications', 'groupingBeta'], false)) {
|
||||
if(selectUseGroupedNotifications(getState())) {
|
||||
dispatch(processNewNotificationForGroups(notificationJSON));
|
||||
}
|
||||
break;
|
||||
|
@ -112,7 +114,7 @@ export const connectTimelineStream = (timelineId, channelName, params = {}, opti
|
|||
const state = getState();
|
||||
if (state.notifications.top || !state.notifications.mounted)
|
||||
dispatch(expandNotifications({ forceLoad: true, maxId: undefined }));
|
||||
if(state.settings.getIn(['notifications', 'groupingBeta'], false)) {
|
||||
if (selectUseGroupedNotifications(state)) {
|
||||
dispatch(refreshStaleNotificationGroups());
|
||||
}
|
||||
break;
|
||||
|
@ -145,7 +147,7 @@ async function refreshHomeTimelineAndNotification(dispatch, getState) {
|
|||
await dispatch(expandHomeTimeline({ maxId: undefined }));
|
||||
|
||||
// TODO: remove this once the groups feature replaces the previous one
|
||||
if(getState().settings.getIn(['notifications', 'groupingBeta'], false)) {
|
||||
if(selectUseGroupedNotifications(getState())) {
|
||||
// TODO: polling for merged notifications
|
||||
try {
|
||||
await dispatch(pollRecentGroupNotifications());
|
||||
|
|
|
@ -6,6 +6,7 @@ import { FormattedMessage } from 'react-intl';
|
|||
import ImmutablePropTypes from 'react-immutable-proptypes';
|
||||
|
||||
import { identityContextPropShape, withIdentity } from 'flavours/glitch/identity_context';
|
||||
import { forceGroupedNotifications } from 'flavours/glitch/initial_state';
|
||||
import { PERMISSION_MANAGE_USERS, PERMISSION_MANAGE_REPORTS } from 'flavours/glitch/permissions';
|
||||
|
||||
import ClearColumnButton from './clear_column_button';
|
||||
|
@ -78,15 +79,17 @@ class ColumnSettings extends PureComponent {
|
|||
</div>
|
||||
</section>
|
||||
|
||||
<section role='group' aria-labelledby='notifications-beta'>
|
||||
<h3 id='notifications-beta'>
|
||||
<FormattedMessage id='notifications.column_settings.beta.category' defaultMessage='Experimental features' />
|
||||
</h3>
|
||||
{!forceGroupedNotifications && (
|
||||
<section role='group' aria-labelledby='notifications-beta'>
|
||||
<h3 id='notifications-beta'>
|
||||
<FormattedMessage id='notifications.column_settings.beta.category' defaultMessage='Experimental features' />
|
||||
</h3>
|
||||
|
||||
<div className='column-settings__row'>
|
||||
<SettingToggle id='unread-notification-markers' prefix='notifications' settings={settings} settingPath={['groupingBeta']} onChange={onChange} label={groupingShowStr} />
|
||||
</div>
|
||||
</section>
|
||||
<div className='column-settings__row'>
|
||||
<SettingToggle id='unread-notification-markers' prefix='notifications' settings={settings} settingPath={['groupingBeta']} onChange={onChange} label={groupingShowStr} />
|
||||
</div>
|
||||
</section>
|
||||
)}
|
||||
|
||||
<section role='group' aria-labelledby='notifications-unread-markers'>
|
||||
<h3 id='notifications-unread-markers'>
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
import Notifications from 'flavours/glitch/features/notifications';
|
||||
import Notifications_v2 from 'flavours/glitch/features/notifications_v2';
|
||||
import { selectUseGroupedNotifications } from 'flavours/glitch/selectors/settings';
|
||||
import { useAppSelector } from 'flavours/glitch/store';
|
||||
|
||||
export const NotificationsWrapper = (props) => {
|
||||
const optedInGroupedNotifications = useAppSelector((state) => state.getIn(['settings', 'notifications', 'groupingBeta'], false));
|
||||
const optedInGroupedNotifications = useAppSelector(selectUseGroupedNotifications);
|
||||
|
||||
return (
|
||||
optedInGroupedNotifications ? <Notifications_v2 {...props} /> : <Notifications {...props} />
|
||||
|
|
|
@ -24,7 +24,8 @@ export const BoostModal: React.FC<{
|
|||
status: Status;
|
||||
onClose: () => void;
|
||||
onReblog: (status: Status, privacy: StatusVisibility) => void;
|
||||
}> = ({ status, onReblog, onClose }) => {
|
||||
missingMediaDescription?: boolean;
|
||||
}> = ({ status, onReblog, onClose, missingMediaDescription }) => {
|
||||
const intl = useIntl();
|
||||
|
||||
const defaultPrivacy = useAppSelector(
|
||||
|
@ -80,17 +81,24 @@ export const BoostModal: React.FC<{
|
|||
)}
|
||||
</h1>
|
||||
<div>
|
||||
<FormattedMessage
|
||||
id='boost_modal.combo'
|
||||
defaultMessage='You can press {combo} to skip this next time'
|
||||
values={{
|
||||
combo: (
|
||||
<span className='hotkey-combination'>
|
||||
<kbd>Shift</kbd>+<Icon id='retweet' icon={RepeatIcon} />
|
||||
</span>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
{missingMediaDescription ? (
|
||||
<FormattedMessage
|
||||
id='boost_modal.missing_description'
|
||||
defaultMessage='This toot contains some media without description'
|
||||
/>
|
||||
) : (
|
||||
<FormattedMessage
|
||||
id='boost_modal.combo'
|
||||
defaultMessage='You can press {combo} to skip this next time'
|
||||
values={{
|
||||
combo: (
|
||||
<span className='hotkey-combination'>
|
||||
<kbd>Shift</kbd>+<Icon id='retweet' icon={RepeatIcon} />
|
||||
</span>
|
||||
),
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -36,6 +36,7 @@ import { timelinePreview, trendsEnabled } from 'flavours/glitch/initial_state';
|
|||
import { transientSingleColumn } from 'flavours/glitch/is_mobile';
|
||||
import { canManageReports, canViewAdminDashboard } from 'flavours/glitch/permissions';
|
||||
import { selectUnreadNotificationGroupsCount } from 'flavours/glitch/selectors/notifications';
|
||||
import { selectUseGroupedNotifications } from 'flavours/glitch/selectors/settings';
|
||||
import { preferencesLink } from 'flavours/glitch/utils/backend_links';
|
||||
|
||||
import ColumnLink from './column_link';
|
||||
|
@ -65,7 +66,7 @@ const messages = defineMessages({
|
|||
});
|
||||
|
||||
const NotificationsLink = () => {
|
||||
const optedInGroupedNotifications = useSelector((state) => state.getIn(['settings', 'notifications', 'groupingBeta'], false));
|
||||
const optedInGroupedNotifications = useSelector(selectUseGroupedNotifications);
|
||||
const count = useSelector(state => state.getIn(['local_settings', 'notifications', 'tab_badge']) ? state.getIn(['notifications', 'unread']) : 0);
|
||||
const intl = useIntl();
|
||||
|
||||
|
|
|
@ -46,6 +46,7 @@
|
|||
* @property {boolean=} use_pending_items
|
||||
* @property {string} version
|
||||
* @property {string} sso_redirect
|
||||
* @property {boolean} force_grouped_notifications
|
||||
* @property {string} status_page_url
|
||||
* @property {boolean} system_emoji_font
|
||||
* @property {string} default_content_type
|
||||
|
@ -137,6 +138,7 @@ export const languages = initialState?.languages;
|
|||
export const criticalUpdatesPending = initialState?.critical_updates_pending;
|
||||
export const statusPageUrl = getMeta('status_page_url');
|
||||
export const sso_redirect = getMeta('sso_redirect');
|
||||
export const forceGroupedNotifications = getMeta('force_grouped_notifications');
|
||||
|
||||
// Glitch-soc-specific settings
|
||||
export const maxFeedHashtags = (initialState && initialState.max_feed_hashtags) || 4;
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
import { forceGroupedNotifications } from 'flavours/glitch/initial_state';
|
||||
import type { RootState } from 'flavours/glitch/store';
|
||||
|
||||
/* eslint-disable @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */
|
||||
|
@ -25,6 +26,10 @@ export const selectSettingsNotificationsQuickFilterAdvanced = (
|
|||
) =>
|
||||
state.settings.getIn(['notifications', 'quickFilter', 'advanced']) as boolean;
|
||||
|
||||
export const selectUseGroupedNotifications = (state: RootState) =>
|
||||
forceGroupedNotifications ||
|
||||
(state.settings.getIn(['notifications', 'groupingBeta']) as boolean);
|
||||
|
||||
export const selectSettingsNotificationsShowUnread = (state: RootState) =>
|
||||
state.settings.getIn(['notifications', 'showUnread']) as boolean;
|
||||
|
||||
|
|
Loading…
Reference in New Issue