Fixed: Speed up UI during refresh

Don't update state if we know items are equal to avoid reselections.
Don't pass LastInfoUpdate to frontend to prevent useless updates (the
field isn't used)
pull/4030/head
ta264 5 years ago committed by Qstick
parent 5b07046396
commit 959b8ed83e

@ -65,18 +65,31 @@ export default function createHandleActions(handlers, defaultState, section) {
if (section === baseSection) {
const newState = getSectionState(state, payloadSection);
const items = newState.items;
const index = _.findIndex(items, { id: payload.id });
if (!newState.itemMap) {
newState.itemMap = _.zipObject(_.map(items, 'id'), _.range(items.length));
}
const index = payload.id in newState.itemMap ? newState.itemMap[payload.id] : -1;
newState.items = [...items];
// TODO: Move adding to it's own reducer
if (index >= 0) {
const item = items[index];
const newItem = { ...item, ...otherProps };
newState.items.splice(index, 1, { ...item, ...otherProps });
// if the item to update is equal to existing, then don't actually update
// to prevent costly reselections
if (_.isEqual(item, newItem)) {
return state;
}
newState.items.splice(index, 1, newItem);
} else if (!updateOnly) {
newState.items.push({ ...otherProps });
newState.itemMap = _.zipObject(_.map(newState.items, 'id'), _.range(newState.items.length));
const newIndex = newState.items.push({ ...otherProps }) - 1;
newState.itemMap[payload.id] = newIndex;
}
return updateSectionState(state, payloadSection, newState);

@ -1,6 +1,6 @@
import { createSelector } from 'reselect';
import createDeepEqualSelector from './createDeepEqualSelector';
import { createSelector, createSelectorCreator, defaultMemoize } from 'reselect';
import createClientSideCollectionSelector from './createClientSideCollectionSelector';
import hasDifferentItemsOrOrder from 'Utilities/Object/hasDifferentItemsOrOrder';
function createUnoptimizedSelector(uiSection) {
return createSelector(
@ -26,8 +26,17 @@ function createUnoptimizedSelector(uiSection) {
);
}
function movieListEqual(a, b) {
return hasDifferentItemsOrOrder(a, b);
}
const createMovieEqualSelector = createSelectorCreator(
defaultMemoize,
movieListEqual
);
function createMovieClientSideCollectionItemsSelector(uiSection) {
return createDeepEqualSelector(
return createMovieEqualSelector(
createUnoptimizedSelector(uiSection),
(movies) => movies
);

@ -88,7 +88,7 @@ namespace NzbDrone.Core.MediaCover
return Path.Combine(_coverRootFolder, movieId.ToString());
}
private void EnsureCovers(Movie movie)
private bool EnsureCovers(Movie movie)
{
bool updated = false;
var toResize = new List<Tuple<MediaCover, bool>>();

@ -54,7 +54,6 @@ namespace Radarr.Api.V3.Movies
public string FolderName { get; set; }
public int Runtime { get; set; }
public DateTime? LastInfoSync { get; set; }
public string CleanTitle { get; set; }
public string ImdbId { get; set; }
public int TmdbId { get; set; }
@ -114,7 +113,6 @@ namespace Radarr.Api.V3.Movies
FolderName = model.FolderName(),
Runtime = model.Runtime,
LastInfoSync = model.LastInfoSync,
CleanTitle = model.CleanTitle,
ImdbId = model.ImdbId,
TitleSlug = model.TitleSlug,
@ -175,7 +173,6 @@ namespace Radarr.Api.V3.Movies
FolderName = model.FolderName(),
Runtime = model.Runtime,
LastInfoSync = model.LastInfoSync,
CleanTitle = model.CleanTitle,
ImdbId = model.ImdbId,
TitleSlug = model.TitleSlug,
@ -228,7 +225,6 @@ namespace Radarr.Api.V3.Movies
MinimumAvailability = resource.MinimumAvailability,
Runtime = resource.Runtime,
LastInfoSync = resource.LastInfoSync,
CleanTitle = resource.CleanTitle,
ImdbId = resource.ImdbId,
TitleSlug = resource.TitleSlug,

Loading…
Cancel
Save