diff --git a/src/view/components/AlphaPickerContainer.tsx b/src/view/components/AlphaPickerContainer.tsx index 57b87e0b5..2d5d385f5 100644 --- a/src/view/components/AlphaPickerContainer.tsx +++ b/src/view/components/AlphaPickerContainer.tsx @@ -1,14 +1,13 @@ import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; import AlphaPicker from '../../components/alphaPicker/alphaPicker'; -import { AlphaPickerValueI, QueryI } from './interface'; +import { QueryI } from './interface'; -interface AlphaPickerContainerI { - getQuery: () => QueryI - setAlphaPickerValue: React.Dispatch; - setStartIndex: React.Dispatch>; +interface AlphaPickerContainerProps { + getQuery: () => QueryI; + setQuery: React.Dispatch>; } -const AlphaPickerContainer: FC = ({ getQuery, setAlphaPickerValue, setStartIndex }) => { +const AlphaPickerContainer: FC = ({ getQuery, setQuery }) => { const [ alphaPicker, setAlphaPicker ] = useState(); const element = useRef(null); const query = getQuery(); @@ -23,9 +22,9 @@ const AlphaPickerContainer: FC = ({ getQuery, setAlphaPic } else { updatedValue = {NameStartsWith: newValue}; } - setAlphaPickerValue(updatedValue); - setStartIndex(0); - }, [setStartIndex, setAlphaPickerValue]); + + setQuery({StartIndex: 0, ...updatedValue}); + }, [setQuery]); useEffect(() => { const alphaPickerElement = element.current; diff --git a/src/view/components/Filter.tsx b/src/view/components/Filter.tsx index becaf0e61..366e61f4d 100644 --- a/src/view/components/Filter.tsx +++ b/src/view/components/Filter.tsx @@ -1,24 +1,26 @@ import React, { FC, useCallback, useEffect, useRef } from 'react'; import IconButtonElement from '../../elements/IconButtonElement'; -import { FiltersI } from './interface'; +import { FiltersI, QueryI } from './interface'; -interface FilterI { +interface FilterProps { topParentId?: string | null; getItemTypes: () => string[]; getFilters: () => FiltersI; getSettingsKey: () => string; getFilterMenuOptions: () => Record; getVisibleFilters: () => string[]; + setQuery: React.Dispatch>; reloadItems: () => void; } -const Filter: FC = ({ +const Filter: FC = ({ topParentId, getItemTypes, getSettingsKey, getFilters, getVisibleFilters, getFilterMenuOptions, + setQuery, reloadItems }) => { const element = useRef(null); @@ -35,10 +37,11 @@ const Filter: FC = ({ serverId: window.ApiClient.serverId(), filterMenuOptions: getFilterMenuOptions() }).then(() => { + setQuery({StartIndex: 0}); reloadItems(); }); }); - }, [getSettingsKey, getFilters, getVisibleFilters, topParentId, getItemTypes, getFilterMenuOptions, reloadItems]); + }, [getSettingsKey, getFilters, getVisibleFilters, topParentId, getItemTypes, getFilterMenuOptions, setQuery, reloadItems]); useEffect(() => { const btnFilter = element.current?.querySelector('.btnFilter'); diff --git a/src/view/components/GenresItemsContainer.tsx b/src/view/components/GenresItemsContainer.tsx index 9c8d26839..9f3e073ed 100644 --- a/src/view/components/GenresItemsContainer.tsx +++ b/src/view/components/GenresItemsContainer.tsx @@ -11,13 +11,13 @@ import layoutManager from '../../components/layoutManager'; import lazyLoader from '../../components/lazyLoader/lazyLoaderIntersectionObserver'; import globalize from '../../scripts/globalize'; -interface GenresItemsContainerI { +interface GenresItemsContainerProps { topParentId?: string | null; getCurrentViewStyle: () => string; itemsResult?: BaseItemDtoQueryResult; } -const GenresItemsContainer: FC = ({ topParentId, getCurrentViewStyle, itemsResult = {} }) => { +const GenresItemsContainer: FC = ({ topParentId, getCurrentViewStyle, itemsResult = {} }) => { const element = useRef(null); const enableScrollX = useCallback(() => { diff --git a/src/view/components/ItemsContainer.tsx b/src/view/components/ItemsContainer.tsx index 3deb0829b..c7d81aa27 100644 --- a/src/view/components/ItemsContainer.tsx +++ b/src/view/components/ItemsContainer.tsx @@ -50,7 +50,7 @@ const ItemsContainer: FC = ({ getViewSettings, getContext, item const cardOptions: CardOptionsI = { shape: shape, showTitle: viewsettings.showTitle, - showYear: viewsettings.showTitle, + showYear: viewsettings.showYear, cardLayout: viewsettings.cardLayout, centerText: true, context: getContext(), @@ -66,7 +66,7 @@ const ItemsContainer: FC = ({ getViewSettings, getContext, item cardOptions.items = items; return cardOptions; - }, [getContext, items, viewsettings.cardLayout, viewsettings.imageType, viewsettings.showTitle]); + }, [getContext, items, viewsettings.cardLayout, viewsettings.imageType, viewsettings.showTitle, viewsettings.showYear]); const getItemsHtml = useCallback(() => { const settings = getViewSettings(); @@ -82,8 +82,6 @@ const ItemsContainer: FC = ({ getViewSettings, getContext, item } if (!items?.length) { - html = ''; - html += '
'; html += '

' + globalize.translate('MessageNothingHere') + '

'; html += '

' + globalize.translate(noItemsMessage) + '

'; diff --git a/src/view/components/Pagination.tsx b/src/view/components/Pagination.tsx index 7a6da59a2..c85f74272 100644 --- a/src/view/components/Pagination.tsx +++ b/src/view/components/Pagination.tsx @@ -3,16 +3,18 @@ import React, { FC, useCallback, useEffect, useRef } from 'react'; import IconButtonElement from '../../elements/IconButtonElement'; import globalize from '../../scripts/globalize'; import * as userSettings from '../../scripts/settings/userSettings'; +import { QueryI } from './interface'; -interface PaginationI { - startIndex: number - setStartIndex: React.Dispatch>; +interface PaginationProps { + query: QueryI; + setQuery: React.Dispatch>; itemsResult?: BaseItemDtoQueryResult; } -const Pagination: FC = ({ startIndex, setStartIndex, itemsResult = {} }) => { +const Pagination: FC = ({ query, setQuery, itemsResult = {} }) => { const limit = userSettings.libraryPageSize(undefined); const totalRecordCount = itemsResult.TotalRecordCount || 0; + const startIndex = query.StartIndex || 0; const recordsEnd = Math.min(startIndex + limit, totalRecordCount); const showControls = limit < totalRecordCount; const element = useRef(null); @@ -20,16 +22,16 @@ const Pagination: FC = ({ startIndex, setStartIndex, itemsResult = const onNextPageClick = useCallback(() => { if (limit > 0) { const newIndex = startIndex + limit; - setStartIndex(newIndex); + setQuery({StartIndex: newIndex}); } - }, [limit, setStartIndex, startIndex]); + }, [limit, setQuery, startIndex]); const onPreviousPageClick = useCallback(() => { if (limit > 0) { const newIndex = Math.max(0, startIndex - limit); - setStartIndex(newIndex); + setQuery({StartIndex: newIndex}); } - }, [limit, setStartIndex, startIndex]); + }, [limit, setQuery, startIndex]); useEffect(() => { const btnNextPage = element.current?.querySelector('.btnNextPage') as HTMLButtonElement; diff --git a/src/view/components/RecommendationContainer.tsx b/src/view/components/RecommendationContainer.tsx index a88cf2f40..6c28272c9 100644 --- a/src/view/components/RecommendationContainer.tsx +++ b/src/view/components/RecommendationContainer.tsx @@ -5,13 +5,13 @@ import globalize from '../../scripts/globalize'; import escapeHTML from 'escape-html'; import SectionContainer from './SectionContainer'; -interface RecommendationContainerI { +interface RecommendationContainerProps { getPortraitShape: () => string; enableScrollX: () => boolean; recommendation?: RecommendationDto; } -const RecommendationContainer: FC = ({ getPortraitShape, enableScrollX, recommendation = {} }) => { +const RecommendationContainer: FC = ({ getPortraitShape, enableScrollX, recommendation = {} }) => { let title = ''; switch (recommendation.RecommendationType) { diff --git a/src/view/components/SectionContainer.tsx b/src/view/components/SectionContainer.tsx index b1ecff871..63cfae525 100644 --- a/src/view/components/SectionContainer.tsx +++ b/src/view/components/SectionContainer.tsx @@ -8,14 +8,14 @@ import ItemsContainerElement from '../../elements/ItemsContainerElement'; import ItemsScrollerContainerElement from '../../elements/ItemsScrollerContainerElement'; import { CardOptionsI } from './interface'; -interface SectionContainerI { +interface SectionContainerProps { sectionTitle: string; enableScrollX: () => boolean; items?: BaseItemDto[]; cardOptions?: CardOptionsI; } -const SectionContainer: FC = ({ +const SectionContainer: FC = ({ sectionTitle, enableScrollX, items = [], diff --git a/src/view/components/SelectView.tsx b/src/view/components/SelectView.tsx index 6b48a86b9..164bc2da6 100644 --- a/src/view/components/SelectView.tsx +++ b/src/view/components/SelectView.tsx @@ -1,7 +1,8 @@ import React, { FC, useCallback, useEffect, useRef } from 'react'; import IconButtonElement from '../../elements/IconButtonElement'; +import { QueryI } from './interface'; -interface SelectViewI { +interface SelectViewProps { getSettingsKey: () => string; getVisibleViewSettings: () => string[]; getViewSettings: () => { @@ -11,10 +12,11 @@ interface SelectViewI { imageType: string; viewType: string; }; + setQuery: React.Dispatch>; reloadItems: () => void; } -const SelectView: FC = ({ getSettingsKey, getVisibleViewSettings, getViewSettings, reloadItems }) => { +const SelectView: FC = ({ setQuery, getSettingsKey, getVisibleViewSettings, getViewSettings, reloadItems }) => { const element = useRef(null); const showViewSettingsMenu = useCallback(() => { @@ -25,10 +27,11 @@ const SelectView: FC = ({ getSettingsKey, getVisibleViewSettings, g settings: getViewSettings(), visibleSettings: getVisibleViewSettings() }).then(() => { + setQuery({StartIndex: 0}); reloadItems(); }); }); - }, [getSettingsKey, getViewSettings, getVisibleViewSettings, reloadItems]); + }, [getSettingsKey, getViewSettings, getVisibleViewSettings, reloadItems, setQuery]); useEffect(() => { const btnSelectView = element.current?.querySelector('.btnSelectView') as HTMLButtonElement; diff --git a/src/view/components/Shuffle.tsx b/src/view/components/Shuffle.tsx index e808c7f3d..6d1fb3d65 100644 --- a/src/view/components/Shuffle.tsx +++ b/src/view/components/Shuffle.tsx @@ -4,12 +4,12 @@ import React, { FC, useCallback, useEffect, useRef } from 'react'; import { playbackManager } from '../../components/playback/playbackmanager'; import IconButtonElement from '../../elements/IconButtonElement'; -interface ShuffleI { +interface ShuffleProps { itemsResult?: BaseItemDtoQueryResult; topParentId: string | null; } -const Shuffle: FC = ({ itemsResult = {}, topParentId }) => { +const Shuffle: FC = ({ itemsResult = {}, topParentId }) => { const element = useRef(null); const shuffle = useCallback(() => { diff --git a/src/view/components/Sort.tsx b/src/view/components/Sort.tsx index 43c5125f1..d48d0f056 100644 --- a/src/view/components/Sort.tsx +++ b/src/view/components/Sort.tsx @@ -1,7 +1,8 @@ import React, { FC, useCallback, useEffect, useRef } from 'react'; import IconButtonElement from '../../elements/IconButtonElement'; +import { QueryI } from './interface'; -interface SortI { +interface SortProps { getSortMenuOptions: () => { name: string; value: string; @@ -11,10 +12,11 @@ interface SortI { sortOrder: string; } getSettingsKey: () => string; + setQuery: React.Dispatch>; reloadItems: () => void; } -const Sort: FC = ({ getSortMenuOptions, getSortValues, getSettingsKey, reloadItems }) => { +const Sort: FC = ({ getSortMenuOptions, getSortValues, getSettingsKey, setQuery, reloadItems }) => { const element = useRef(null); const showSortMenu = useCallback(() => { @@ -25,10 +27,11 @@ const Sort: FC = ({ getSortMenuOptions, getSortValues, getSettingsKey, re settings: getSortValues(), sortOptions: getSortMenuOptions() }).then(() => { + setQuery({StartIndex: 0}); reloadItems(); }); }); - }, [getSettingsKey, getSortMenuOptions, getSortValues, reloadItems]); + }, [getSettingsKey, getSortMenuOptions, getSortValues, reloadItems, setQuery]); useEffect(() => { const btnSort = element.current?.querySelector('.btnSort'); diff --git a/src/view/components/ViewItemsContainer.tsx b/src/view/components/ViewItemsContainer.tsx index cb2650a5a..e604c248b 100644 --- a/src/view/components/ViewItemsContainer.tsx +++ b/src/view/components/ViewItemsContainer.tsx @@ -1,5 +1,5 @@ import type { BaseItemDtoQueryResult } from '@jellyfin/sdk/lib/generated-client'; -import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import React, { FC, useCallback, useEffect, useRef, useState } from 'react'; import loading from '../../components/loading/loading'; import * as userSettings from '../../scripts/settings/userSettings'; @@ -12,10 +12,9 @@ import Shuffle from './Shuffle'; import Sort from './Sort'; import NewCollection from './NewCollection'; import globalize from '../../scripts/globalize'; -import layoutManager from '../../components/layoutManager'; -import { AlphaPickerValueI, QueryI } from './interface'; +import { QueryI } from './interface'; -interface ViewItemsContainerI { +interface ViewItemsContainerProps { topParentId: string | null; isBtnShuffleEnabled?: boolean; isBtnFilterEnabled?: boolean; @@ -26,7 +25,7 @@ interface ViewItemsContainerI { getNoItemsMessage: () => string; } -const ViewItemsContainer: FC = ({ +const ViewItemsContainer: FC = ({ topParentId, isBtnShuffleEnabled = false, isBtnFilterEnabled = true, @@ -37,15 +36,12 @@ const ViewItemsContainer: FC = ({ getNoItemsMessage }) => { const [ itemsResult, setItemsResult ] = useState({}); - const [ startIndex, setStartIndex ] = useState(0); - const [ alphaPickerValue, setAlphaPickerValue ] = useState({}); + const [ query, setQuery ] = useState({ + StartIndex: 0 + }); const element = useRef(null); - const queryAlphaPickerValue = useMemo(() => ({ - ...alphaPickerValue - }), [alphaPickerValue]); - const getSettingsKey = useCallback(() => { return `${topParentId} - ${getBasekey()}`; }, [getBasekey, topParentId]); @@ -135,7 +131,7 @@ const ViewItemsContainer: FC = ({ fields += ',ProductionYear'; } - const query: QueryI = { + const options: QueryI = { SortBy: getSortValues().sortBy, SortOrder: getSortValues().sortOrder, IncludeItemTypes: getItemTypes().join(','), @@ -144,18 +140,18 @@ const ViewItemsContainer: FC = ({ ImageTypeLimit: 1, EnableImageTypes: 'Primary,Backdrop,Banner,Thumb,Disc,Logo', Limit: userSettings.libraryPageSize(undefined), - StartIndex: startIndex, + StartIndex: query.StartIndex, + NameLessThan: query.NameLessThan, + NameStartsWith: query.NameStartsWith, ParentId: topParentId }; if (getBasekey() === 'favorites') { - query.IsFavorite = true; + options.IsFavorite = true; } - const queryInfo: QueryI = Object.assign(query, queryAlphaPickerValue || {}); - - return queryInfo; - }, [getViewSettings, getSortValues, getItemTypes, startIndex, topParentId, getBasekey, queryAlphaPickerValue]); + return options; + }, [getViewSettings, getSortValues, getItemTypes, query.StartIndex, query.NameLessThan, query.NameStartsWith, topParentId, getBasekey]); const getQueryWithFilters = useCallback(() => { const query = getQuery(); @@ -320,8 +316,8 @@ const ViewItemsContainer: FC = ({
{isBtnShuffleEnabled && } @@ -330,6 +326,7 @@ const ViewItemsContainer: FC = ({ getSettingsKey={getSettingsKey} getVisibleViewSettings={getVisibleViewSettings} getViewSettings={getViewSettings} + setQuery={setQuery} reloadItems={reloadItems} />} @@ -337,6 +334,7 @@ const ViewItemsContainer: FC = ({ getSortMenuOptions={getSortMenuOptions} getSortValues={getSortValues} getSettingsKey={getSettingsKey} + setQuery={setQuery} reloadItems={reloadItems} /> @@ -347,6 +345,7 @@ const ViewItemsContainer: FC = ({ getItemTypes={getItemTypes} getVisibleFilters={getVisibleFilters} getFilterMenuOptions={getFilterMenuOptions} + setQuery={setQuery} reloadItems={reloadItems} />} @@ -356,8 +355,7 @@ const ViewItemsContainer: FC = ({ {isAlphaPickerEnabled && } = ({
diff --git a/src/view/components/interface.ts b/src/view/components/interface.ts index 224859e3d..dc971d077 100644 --- a/src/view/components/interface.ts +++ b/src/view/components/interface.ts @@ -1,9 +1,5 @@ import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client'; -export interface AlphaPickerValueI { - NameLessThan?: string; - NameStartsWith?: string | null; -} export interface QueryI { SortBy?: string; SortOrder?: string; @@ -17,7 +13,7 @@ export interface QueryI { ParentId?: string | null; IsFavorite?: boolean; IsMissing?: boolean; - Limit:number; + Limit?:number; NameStartsWithOrGreater?: string; NameLessThan?: string; NameStartsWith?: string | null;