Skip to content

Commit

Permalink
Fix “Mention” appearing for otherwise filtered posts (mastodon#32356)
Browse files Browse the repository at this point in the history
  • Loading branch information
ClearlyClaire committed Oct 14, 2024
1 parent de4f785 commit f75eb1a
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
import type { IconProp } from 'mastodon/components/icon';
import { Icon } from 'mastodon/components/icon';
import Status from 'mastodon/containers/status_container';
import { getStatusHidden } from 'mastodon/selectors/filters';
import { useAppSelector, useAppDispatch } from 'mastodon/store';

import { DisplayedName } from './displayed_name';
Expand Down Expand Up @@ -48,6 +49,12 @@ export const NotificationWithStatus: React.FC<{
(state) => state.statuses.getIn([statusId, 'visibility']) === 'direct',
);

const isFiltered = useAppSelector(
(state) =>
statusId &&
getStatusHidden(state, { id: statusId, contextType: 'notifications' }),
);

const handlers = useMemo(
() => ({
open: () => {
Expand All @@ -73,7 +80,7 @@ export const NotificationWithStatus: React.FC<{
[dispatch, statusId],
);

if (!statusId) return null;
if (!statusId || isFiltered) return null;

return (
<HotKeys handlers={handlers}>
Expand Down
50 changes: 50 additions & 0 deletions app/javascript/mastodon/selectors/filters.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import { createSelector } from '@reduxjs/toolkit';

import type { RootState } from 'mastodon/store';
import { toServerSideType } from 'mastodon/utils/filters';

// TODO: move to `app/javascript/mastodon/models` and use more globally
type Filter = Immutable.Map<string, unknown>;

// TODO: move to `app/javascript/mastodon/models` and use more globally
type FilterResult = Immutable.Map<string, unknown>;

export const getFilters = createSelector(
[
(state: RootState) => state.filters as Immutable.Map<string, Filter>,
(_, { contextType }: { contextType: string }) => contextType,
],
(filters, contextType) => {
if (!contextType) {
return null;
}

const now = new Date();
const serverSideType = toServerSideType(contextType);

return filters.filter((filter) => {
const context = filter.get('context') as Immutable.List<string>;
const expiration = filter.get('expires_at') as Date | null;
return (
context.includes(serverSideType) &&
(expiration === null || expiration > now)
);
});
},
);

export const getStatusHidden = (
state: RootState,
{ id, contextType }: { id: string; contextType: string },
) => {
const filters = getFilters(state, { contextType });
if (filters === null) return false;

const filtered = state.statuses.getIn([id, 'filtered']) as
| Immutable.List<FilterResult>
| undefined;
return filtered?.some(
(result) =>
filters.getIn([result.get('filter'), 'filter_action']) === 'hide',
);
};
15 changes: 2 additions & 13 deletions app/javascript/mastodon/selectors/index.js
Original file line number Diff line number Diff line change
@@ -1,22 +1,11 @@
import { createSelector } from '@reduxjs/toolkit';
import { List as ImmutableList, Map as ImmutableMap } from 'immutable';

import { toServerSideType } from 'mastodon/utils/filters';

import { me } from '../initial_state';

export { makeGetAccount } from "./accounts";

const getFilters = createSelector([state => state.get('filters'), (_, { contextType }) => contextType], (filters, contextType) => {
if (!contextType) {
return null;
}
import { getFilters } from './filters';

const now = new Date();
const serverSideType = toServerSideType(contextType);

return filters.filter(filter => filter.get('context').includes(serverSideType) && (filter.get('expires_at') === null || filter.get('expires_at') > now));
});
export { makeGetAccount } from "./accounts";

export const makeGetStatus = () => {
return createSelector(
Expand Down

0 comments on commit f75eb1a

Please sign in to comment.