Performance: memoize getSoapboxConfig(), getSettings(), and getFeatures()

actually-fix-tabs-bar
Alex Gleason 2021-07-06 13:06:21 -05:00
rodzic d7247c902b
commit 817843c77a
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 7211D1F99744FBB7
3 zmienionych plików z 20 dodań i 15 usunięć

Wyświetl plik

@ -4,6 +4,7 @@ import { patchMe } from 'soapbox/actions/me';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import { isLoggedIn } from 'soapbox/utils/auth';
import uuid from '../uuid';
import { createSelector } from 'reselect';
export const SETTING_CHANGE = 'SETTING_CHANGE';
export const SETTING_SAVE = 'SETTING_SAVE';
@ -136,12 +137,14 @@ export const defaultSettings = ImmutableMap({
]),
});
export function getSettings(state) {
const soapboxSettings = state.getIn(['soapbox', 'defaultSettings']);
export const getSettings = createSelector([
state => state.getIn(['soapbox', 'defaultSettings']),
state => state.get('settings'),
], (soapboxSettings, settings) => {
return defaultSettings
.mergeDeep(soapboxSettings)
.mergeDeep(state.get('settings'));
}
.mergeDeep(settings);
});
export function changeSetting(path, value) {
return dispatch => {

Wyświetl plik

@ -1,6 +1,7 @@
import api from '../api';
import { Map as ImmutableMap, List as ImmutableList } from 'immutable';
import { getFeatures } from 'soapbox/utils/features';
import { createSelector } from 'reselect';
export const SOAPBOX_CONFIG_REQUEST_SUCCESS = 'SOAPBOX_CONFIG_REQUEST_SUCCESS';
export const SOAPBOX_CONFIG_REQUEST_FAIL = 'SOAPBOX_CONFIG_REQUEST_FAIL';
@ -50,20 +51,19 @@ export const defaultConfig = ImmutableMap({
aboutPages: ImmutableMap(),
});
export function getSoapboxConfig(state) {
const instance = state.get('instance');
const soapbox = state.get('soapbox');
const features = getFeatures(instance);
export const getSoapboxConfig = createSelector([
state => state.get('soapbox'),
state => getFeatures(state.get('instance')).emojiReactsRGI,
], (soapbox, emojiReactsRGI) => {
// https://git.pleroma.social/pleroma/pleroma/-/issues/2355
if (features.emojiReactsRGI) {
if (emojiReactsRGI) {
return defaultConfig
.set('allowedEmoji', allowedEmojiRGI)
.merge(soapbox);
} else {
return defaultConfig.merge(soapbox);
}
}
});
export function fetchSoapboxConfig() {
return (dispatch, getState) => {

Wyświetl plik

@ -1,10 +1,12 @@
// Detect backend features to conditionally render elements
import gte from 'semver/functions/gte';
import { List as ImmutableList } from 'immutable';
import { createSelector } from 'reselect';
export const getFeatures = instance => {
const v = parseVersion(instance.get('version'));
const f = instance.getIn(['pleroma', 'metadata', 'features'], ImmutableList());
export const getFeatures = createSelector([
instance => parseVersion(instance.get('version')),
instance => instance.getIn(['pleroma', 'metadata', 'features'], ImmutableList()),
], (v, f) => {
return {
suggestions: v.software === 'Mastodon' && gte(v.compatVersion, '2.4.3'),
trends: v.software === 'Mastodon' && gte(v.compatVersion, '3.0.0'),
@ -15,7 +17,7 @@ export const getFeatures = instance => {
importMutes: v.software === 'Pleroma' && gte(v.version, '2.2.0'),
emailList: f.includes('email_list'),
};
};
});
export const parseVersion = version => {
let regex = /^([\w\.]*)(?: \(compatible; ([\w]*) (.*)\))?$/;