diff --git a/src/components/common/GenresItemsContainer.tsx b/src/components/common/GenresItemsContainer.tsx index 4c5d15ce90..e4098d3e77 100644 --- a/src/components/common/GenresItemsContainer.tsx +++ b/src/components/common/GenresItemsContainer.tsx @@ -10,14 +10,31 @@ import cardBuilder from '../cardbuilder/cardBuilder'; import layoutManager from '../layoutManager'; import lazyLoader from '../lazyLoader/lazyLoaderIntersectionObserver'; import globalize from '../../scripts/globalize'; +import ItemsScrollerContainerElement from '../../elements/ItemsScrollerContainerElement'; +import ItemsContainerElement from '../../elements/ItemsContainerElement'; + +const createLinkElement = ({ className, title, href }: { className?: string, title?: string | null, href?: string }) => ({ + __html: ` +

+ ${title} +

+ +
` +}); interface GenresItemsContainerProps { topParentId?: string | null; - getCurrentViewStyle: () => string; - itemsResult?: BaseItemDtoQueryResult; + itemsResult: BaseItemDtoQueryResult; } -const GenresItemsContainer: FC = ({ topParentId, getCurrentViewStyle, itemsResult = {} }) => { +const GenresItemsContainer: FC = ({ + topParentId, + itemsResult = {} +}) => { const element = useRef(null); const enableScrollX = useCallback(() => { @@ -28,21 +45,10 @@ const GenresItemsContainer: FC = ({ topParentId, getC return enableScrollX() ? 'overflowPortrait' : 'portrait'; }, [enableScrollX]); - const getThumbShape = useCallback(() => { - return enableScrollX() ? 'overflowBackdrop' : 'backdrop'; - }, [enableScrollX]); - const fillItemsContainer = useCallback((entry) => { const elem = entry.target; const id = elem.getAttribute('data-id'); - const viewStyle = getCurrentViewStyle(); - let limit = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 5 : 9; - if (enableScrollX()) { - limit = 10; - } - - const enableImageTypes = viewStyle == 'Thumb' || viewStyle == 'ThumbCard' ? 'Primary,Backdrop,Thumb' : 'Primary'; const query = { SortBy: 'Random', SortOrder: 'Ascending', @@ -50,108 +56,69 @@ const GenresItemsContainer: FC = ({ topParentId, getC Recursive: true, Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', ImageTypeLimit: 1, - EnableImageTypes: enableImageTypes, - Limit: limit, + EnableImageTypes: 'Primary', + Limit: 12, GenreIds: id, EnableTotalRecordCount: false, ParentId: topParentId }; window.ApiClient.getItems(window.ApiClient.getCurrentUserId(), query).then((result) => { - const items = result.Items || []; - if (viewStyle == 'Thumb') { - cardBuilder.buildCards(items, { - itemsContainer: elem, - shape: getThumbShape(), - preferThumb: true, - showTitle: true, - scalable: true, - centerText: true, - overlayMoreButton: true, - allowBottomPadding: false - }); - } else if (viewStyle == 'ThumbCard') { - cardBuilder.buildCards(items, { - itemsContainer: elem, - shape: getThumbShape(), - preferThumb: true, - showTitle: true, - scalable: true, - centerText: false, - cardLayout: true, - showYear: true - }); - } else if (viewStyle == 'PosterCard') { - cardBuilder.buildCards(items, { - itemsContainer: elem, - shape: getPortraitShape(), - showTitle: true, - scalable: true, - centerText: false, - cardLayout: true, - showYear: true - }); - } else if (viewStyle == 'Poster') { - cardBuilder.buildCards(items, { - itemsContainer: elem, - shape: getPortraitShape(), - scalable: true, - overlayMoreButton: true, - allowBottomPadding: true, - showTitle: true, - centerText: true, - showYear: true - }); - } + cardBuilder.buildCards(result.Items || [], { + itemsContainer: elem, + shape: getPortraitShape(), + scalable: true, + overlayMoreButton: true, + allowBottomPadding: true, + showTitle: true, + centerText: true, + showYear: true + }); }); - }, [enableScrollX, getCurrentViewStyle, getPortraitShape, getThumbShape, topParentId]); + }, [getPortraitShape, topParentId]); useEffect(() => { - const elem = element.current?.querySelector('#items') as HTMLDivElement; - let html = ''; - const items = itemsResult.Items || []; - - for (let i = 0, length = items.length; i < length; i++) { - const item = items[i]; - - html += '
'; - html += ''; - if (enableScrollX()) { - html += '
'; - html += '
'; - } else { - html += '
'; - } - - html += '
'; - html += '
'; - } - - if (!itemsResult.Items?.length) { - html = ''; - - html += '
'; - html += '

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

'; - html += '

' + globalize.translate('MessageNoGenresAvailable') + '

'; - html += '
'; - } - - elem.innerHTML = html; + const elem = element.current; lazyLoader.lazyChildren(elem, fillItemsContainer); - }, [getCurrentViewStyle, itemsResult.Items, fillItemsContainer, topParentId, enableScrollX]); + }, [itemsResult.Items, fillItemsContainer]); + const items = itemsResult.Items || []; return (
-
+ { + !items.length ? ( +
+

{globalize.translate('MessageNothingHere')}

+

{globalize.translate('MessageNoGenresAvailable')}

+
+ ) : items.map((item, index) => ( +
+
+ + {enableScrollX() ? + : + } +
+ )) + }
); }; diff --git a/src/elements/ItemsContainerElement.tsx b/src/elements/ItemsContainerElement.tsx index 0e4fb7b6de..0c4d55724d 100644 --- a/src/elements/ItemsContainerElement.tsx +++ b/src/elements/ItemsContainerElement.tsx @@ -1,22 +1,25 @@ import React, { FC } from 'react'; -const createElement = ({ className }: IProps) => ({ +const createElement = ({ className, dataId }: IProps) => ({ __html: `
` }); interface IProps { className?: string; + dataId?: string; } -const ItemsContainerElement: FC = ({ className }) => { +const ItemsContainerElement: FC = ({ className, dataId }) => { return (
); diff --git a/src/elements/ItemsScrollerContainerElement.tsx b/src/elements/ItemsScrollerContainerElement.tsx index 01f823ae69..6e16807b85 100644 --- a/src/elements/ItemsScrollerContainerElement.tsx +++ b/src/elements/ItemsScrollerContainerElement.tsx @@ -1,6 +1,6 @@ import React, { FC } from 'react'; -const createScroller = ({ scrollerclassName, dataHorizontal, dataMousewheel, dataCenterfocus, className }: IProps) => ({ +const createScroller = ({ scrollerclassName, dataHorizontal, dataMousewheel, dataCenterfocus, dataId, className }: IProps) => ({ __html: `
` @@ -20,10 +21,11 @@ interface IProps { dataHorizontal?: string; dataMousewheel?: string; dataCenterfocus?: string; + dataId?: string; className?: string; } -const ItemsScrollerContainerElement: FC = ({ scrollerclassName, dataHorizontal, dataMousewheel, dataCenterfocus, className }) => { +const ItemsScrollerContainerElement: FC = ({ scrollerclassName, dataHorizontal, dataMousewheel, dataCenterfocus, dataId, className }) => { return (
= ({ scrollerclassName, dataHori dataHorizontal: dataHorizontal ? `data-horizontal="${dataHorizontal}"` : '', dataMousewheel: dataMousewheel ? `data-mousewheel="${dataMousewheel}"` : '', dataCenterfocus: dataCenterfocus ? `data-centerfocus="${dataCenterfocus}"` : '', + dataId: dataId ? `data-id="${dataId}"` : '', className: className })} /> diff --git a/src/routes/movies/GenresView.tsx b/src/routes/movies/GenresView.tsx index 041968e4b1..24ae5f79c0 100644 --- a/src/routes/movies/GenresView.tsx +++ b/src/routes/movies/GenresView.tsx @@ -1,54 +1,40 @@ import type { BaseItemDtoQueryResult } from '@jellyfin/sdk/lib/generated-client'; -import React, { FC, useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import React, { FC, useCallback, useEffect, useState } from 'react'; import loading from '../../components/loading/loading'; -import * as userSettings from '../../scripts/settings/userSettings'; import GenresItemsContainer from '../../components/common/GenresItemsContainer'; -import { LibraryViewProps, Query } from '../../types/interface'; +import { LibraryViewProps } from '../../types/interface'; const GenresView: FC = ({ topParentId }) => { const [ itemsResult, setItemsResult ] = useState({}); - const element = useRef(null); - - const getSettingsKey = useCallback(() => { - return topParentId + '-genres'; - }, [topParentId]); - - const getViewSettings = useCallback(() => { - return getSettingsKey() + '-view'; - }, [getSettingsKey]); - - let query = useMemo(() => ({ - SortBy: 'SortName', - SortOrder: 'Ascending', - IncludeItemTypes: 'Movie', - Recursive: true, - EnableTotalRecordCount: false, - Limit: userSettings.libraryPageSize(undefined), - StartIndex: 0, - ParentId: topParentId }), [topParentId]); - - query = userSettings.loadQuerySettings(getSettingsKey(), query); - - const getCurrentViewStyle = useCallback(() => { - return userSettings.get(getViewSettings(), false) || 'Poster'; - }, [getViewSettings]); const reloadItems = useCallback(() => { loading.show(); - window.ApiClient.getGenres(window.ApiClient.getCurrentUserId(), query).then((result) => { + window.ApiClient.getGenres( + window.ApiClient.getCurrentUserId(), + { + SortBy: 'SortName', + SortOrder: 'Ascending', + IncludeItemTypes: 'Movie', + Recursive: true, + EnableTotalRecordCount: false, + ParentId: topParentId + } + ).then((result) => { setItemsResult(result); loading.hide(); }); - }, [query]); + }, [topParentId]); useEffect(() => { reloadItems(); }, [reloadItems]); + return ( -
- -
+ ); };