import '../../elements/emby-button/emby-button'; import '../../elements/emby-itemscontainer/emby-itemscontainer'; import type { BaseItemDtoQueryResult } from '@jellyfin/sdk/lib/generated-client'; import escapeHTML from 'escape-html'; import React, { FC, useCallback, useEffect, useRef } from 'react'; import { appRouter } from '../appRouter'; import cardBuilder from '../cardbuilder/cardBuilder'; import layoutManager from '../layoutManager'; import lazyLoader from '../lazyLoader/lazyLoaderIntersectionObserver'; import globalize from '../../scripts/globalize'; interface GenresItemsContainerProps { topParentId?: string | null; getCurrentViewStyle: () => string; itemsResult?: BaseItemDtoQueryResult; } const GenresItemsContainer: FC = ({ topParentId, getCurrentViewStyle, itemsResult = {} }) => { const element = useRef(null); const enableScrollX = useCallback(() => { return !layoutManager.desktop; }, []); const getPortraitShape = useCallback(() => { 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', IncludeItemTypes: 'Movie', Recursive: true, Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo', ImageTypeLimit: 1, EnableImageTypes: enableImageTypes, Limit: limit, 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 }); } }); }, [enableScrollX, getCurrentViewStyle, getPortraitShape, getThumbShape, 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; lazyLoader.lazyChildren(elem, fillItemsContainer); }, [getCurrentViewStyle, itemsResult.Items, fillItemsContainer, topParentId, enableScrollX]); return (
); }; export default GenresItemsContainer;