From 959b8ed83e6a19697d65161f0471d263ca3cccea Mon Sep 17 00:00:00 2001 From: ta264 Date: Thu, 19 Dec 2019 21:29:15 +0000 Subject: [PATCH] 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) --- .../Actions/Creators/createHandleActions.js | 21 +++++++++++++++---- ...eMovieClientSideCollectionItemsSelector.js | 15 ++++++++++--- .../MediaCover/MediaCoverService.cs | 2 +- src/Radarr.Api.V3/Movies/MovieResource.cs | 4 ---- 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/frontend/src/Store/Actions/Creators/createHandleActions.js b/frontend/src/Store/Actions/Creators/createHandleActions.js index 0883f8e08..744186483 100644 --- a/frontend/src/Store/Actions/Creators/createHandleActions.js +++ b/frontend/src/Store/Actions/Creators/createHandleActions.js @@ -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); diff --git a/frontend/src/Store/Selectors/createMovieClientSideCollectionItemsSelector.js b/frontend/src/Store/Selectors/createMovieClientSideCollectionItemsSelector.js index 1c3437e5e..aab2a7ca5 100644 --- a/frontend/src/Store/Selectors/createMovieClientSideCollectionItemsSelector.js +++ b/frontend/src/Store/Selectors/createMovieClientSideCollectionItemsSelector.js @@ -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 ); diff --git a/src/NzbDrone.Core/MediaCover/MediaCoverService.cs b/src/NzbDrone.Core/MediaCover/MediaCoverService.cs index 7a322eb1d..f31ab78a7 100644 --- a/src/NzbDrone.Core/MediaCover/MediaCoverService.cs +++ b/src/NzbDrone.Core/MediaCover/MediaCoverService.cs @@ -88,7 +88,7 @@ private string GetMovieCoverPath(int movieId) return Path.Combine(_coverRootFolder, movieId.ToString()); } - private void EnsureCovers(Movie movie) + private bool EnsureCovers(Movie movie) { bool updated = false; var toResize = new List>(); diff --git a/src/Radarr.Api.V3/Movies/MovieResource.cs b/src/Radarr.Api.V3/Movies/MovieResource.cs index 42bbbb9c8..591a585ef 100644 --- a/src/Radarr.Api.V3/Movies/MovieResource.cs +++ b/src/Radarr.Api.V3/Movies/MovieResource.cs @@ -54,7 +54,6 @@ public MovieResource() 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 @@ public static MovieResource ToResource(this Movie model) FolderName = model.FolderName(), Runtime = model.Runtime, - LastInfoSync = model.LastInfoSync, CleanTitle = model.CleanTitle, ImdbId = model.ImdbId, TitleSlug = model.TitleSlug, @@ -175,7 +173,6 @@ public static MovieResource ToResource(this Movie model, IUpgradableSpecificatio FolderName = model.FolderName(), Runtime = model.Runtime, - LastInfoSync = model.LastInfoSync, CleanTitle = model.CleanTitle, ImdbId = model.ImdbId, TitleSlug = model.TitleSlug, @@ -228,7 +225,6 @@ public static Movie ToModel(this MovieResource resource) MinimumAvailability = resource.MinimumAvailability, Runtime = resource.Runtime, - LastInfoSync = resource.LastInfoSync, CleanTitle = resource.CleanTitle, ImdbId = resource.ImdbId, TitleSlug = resource.TitleSlug,