Optimize makeGetStatus (#11211)
* Optimize makeGetStatus Because `ImmutableList.filter` always returns a new object and `createSelector` memoizes based on object identity, the selector returned by `makeGetStatus` would *always* execute. To avoid that, we wrap `getFilters` into a new memoizer that memoizes based on deep equality, thus returning the same object as long as the filters haven't changed, allowing the memoization of `makeGetStatus` to work. Furthermore, we memoize the compiled regexs instead of recomputing them each time the selector is called. * Fix memoized result being cleared too often * Make notifications use memoized getFiltersRegex
This commit is contained in:
		@@ -11,7 +11,7 @@ import { saveSettings } from './settings';
 | 
			
		||||
import { defineMessages } from 'react-intl';
 | 
			
		||||
import { List as ImmutableList } from 'immutable';
 | 
			
		||||
import { unescapeHTML } from '../utils/html';
 | 
			
		||||
import { getFilters, regexFromFilters } from '../selectors';
 | 
			
		||||
import { getFiltersRegex } from '../selectors';
 | 
			
		||||
 | 
			
		||||
export const NOTIFICATIONS_UPDATE      = 'NOTIFICATIONS_UPDATE';
 | 
			
		||||
export const NOTIFICATIONS_UPDATE_NOOP = 'NOTIFICATIONS_UPDATE_NOOP';
 | 
			
		||||
@@ -43,13 +43,13 @@ export function updateNotifications(notification, intlMessages, intlLocale) {
 | 
			
		||||
    const showInColumn = getState().getIn(['settings', 'notifications', 'shows', notification.type], true);
 | 
			
		||||
    const showAlert    = getState().getIn(['settings', 'notifications', 'alerts', notification.type], true);
 | 
			
		||||
    const playSound    = getState().getIn(['settings', 'notifications', 'sounds', notification.type], true);
 | 
			
		||||
    const filters      = getFilters(getState(), { contextType: 'notifications' });
 | 
			
		||||
    const filters      = getFiltersRegex(getState(), { contextType: 'notifications' });
 | 
			
		||||
 | 
			
		||||
    let filtered = false;
 | 
			
		||||
 | 
			
		||||
    if (notification.type === 'mention') {
 | 
			
		||||
      const dropRegex   = regexFromFilters(filters.filter(filter => filter.get('irreversible')));
 | 
			
		||||
      const regex       = regexFromFilters(filters);
 | 
			
		||||
      const dropRegex   = filters[0];
 | 
			
		||||
      const regex       = filters[1];
 | 
			
		||||
      const searchIndex = notification.status.spoiler_text + '\n' + unescapeHTML(notification.status.content);
 | 
			
		||||
 | 
			
		||||
      if (dropRegex && dropRegex.test(searchIndex)) {
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user