diff --git a/src/renderer/components/virtual-grid/virtual-infinite-grid.tsx b/src/renderer/components/virtual-grid/virtual-infinite-grid.tsx index b73065d3..611e7907 100644 --- a/src/renderer/components/virtual-grid/virtual-infinite-grid.tsx +++ b/src/renderer/components/virtual-grid/virtual-infinite-grid.tsx @@ -71,6 +71,7 @@ export const VirtualInfiniteGrid = forwardRef( ) => { const listRef = useRef(null); const loader = useRef(null); + const minItemCount = useRef(0); // itemData can be a sparse array. Treat the intermediate elements as being undefined const [itemData, setItemData] = useState>( @@ -100,8 +101,17 @@ export const VirtualInfiniteGrid = forwardRef( const loadMoreItems = useCallback( async (startIndex: number, stopIndex: number) => { - // Fixes a caching bug(?) when switching between filters and the itemCount increases - if (startIndex === 1) return; + if ( + // Fixes a caching bug(?) when switching between filters and the itemCount increases + startIndex === 1 || + // Fixes a caching bug when refreshing items. Prevents a second + // refetch from happening if: + // 1: we are already in a refresh (-1) + // 2: we just had a refresh, and we are index 0 + minItemCount.current === -1 || + (minItemCount.current > 0 && startIndex === 0) + ) + return; // Need to multiply by columnCount due to the grid layout const start = startIndex * columnCount; @@ -134,6 +144,7 @@ export const VirtualInfiniteGrid = forwardRef( resetLoadMoreItemsCache: () => { if (loader.current) { loader.current.resetloadMoreItemsCache(false); + minItemCount.current = -1; setItemData([]); } }, @@ -142,6 +153,7 @@ export const VirtualInfiniteGrid = forwardRef( }, setItemData: (data: LibraryItemOrGenre[]) => { setItemData(data); + minItemCount.current = data.length; }, updateItemData: (rule) => { setItemData((data) => data.map((item) => item && rule(item))); diff --git a/src/renderer/features/albums/components/album-list-header-filters.tsx b/src/renderer/features/albums/components/album-list-header-filters.tsx index 6df851e4..85d4168d 100644 --- a/src/renderer/features/albums/components/album-list-header-filters.tsx +++ b/src/renderer/features/albums/components/album-list-header-filters.tsx @@ -176,12 +176,18 @@ export const AlbumListHeaderFilters = ({ gridRef, tableRef }: AlbumListHeaderFil const onFilterChange = useCallback( (filter: AlbumListFilter) => { if (isGrid) { - handleRefreshGrid(gridRef, filter); + handleRefreshGrid(gridRef, { + ...filter, + ...customFilters, + }); + } else { + handleRefreshTable(tableRef, { + ...filter, + ...customFilters, + }); } - - handleRefreshTable(tableRef, filter); }, - [gridRef, handleRefreshGrid, handleRefreshTable, isGrid, tableRef], + [customFilters, gridRef, handleRefreshGrid, handleRefreshTable, isGrid, tableRef], ); const handleOpenFiltersModal = () => { diff --git a/src/renderer/hooks/use-list-filter-refresh.ts b/src/renderer/hooks/use-list-filter-refresh.ts index 0ed81f40..0aa8cf46 100644 --- a/src/renderer/hooks/use-list-filter-refresh.ts +++ b/src/renderer/hooks/use-list-filter-refresh.ts @@ -123,7 +123,6 @@ export const useListFilterRefresh = ({ gridRef.current?.scrollTo(0); gridRef.current?.resetLoadMoreItemsCache(); - gridRef.current?.setItemData([]); const query = { ...filter, limit: 200, startIndex: 0 };