2022-10-05 02:44:28 +03:00
|
|
|
import type { BaseItemDto } from '@jellyfin/sdk/lib/generated-client';
|
|
|
|
import React, { FC, useCallback, useEffect, useRef } from 'react';
|
2022-08-06 01:36:13 +03:00
|
|
|
|
|
|
|
import ItemsContainerElement from '../../elements/ItemsContainerElement';
|
|
|
|
import cardBuilder from '../../components/cardbuilder/cardBuilder';
|
|
|
|
import listview from '../../components/listview/listview';
|
|
|
|
import globalize from '../../scripts/globalize';
|
|
|
|
import imageLoader from '../../components/images/imageLoader';
|
|
|
|
import '../../elements/emby-itemscontainer/emby-itemscontainer';
|
2022-10-05 02:44:28 +03:00
|
|
|
import { CardOptionsI } from './interface';
|
2022-08-06 01:36:13 +03:00
|
|
|
|
2022-10-03 01:23:59 +03:00
|
|
|
interface ItemsContainerI {
|
2022-10-05 02:44:28 +03:00
|
|
|
getViewSettings: () => {
|
|
|
|
showTitle: string | boolean;
|
|
|
|
cardLayout: string | boolean;
|
|
|
|
showYear: string | boolean;
|
|
|
|
imageType: string;
|
|
|
|
viewType: string;
|
|
|
|
};
|
2022-08-21 03:09:22 +03:00
|
|
|
getContext: () => string | null;
|
2022-08-06 01:36:13 +03:00
|
|
|
items?: BaseItemDto[] | null;
|
|
|
|
noItemsMessage?: string;
|
|
|
|
}
|
|
|
|
|
2022-10-05 02:44:28 +03:00
|
|
|
const ItemsContainer: FC<ItemsContainerI> = ({ getViewSettings, getContext, items = [], noItemsMessage }) => {
|
2022-08-06 01:36:13 +03:00
|
|
|
const element = useRef<HTMLDivElement>(null);
|
2022-10-05 02:44:28 +03:00
|
|
|
const viewsettings = getViewSettings();
|
2022-08-06 01:36:13 +03:00
|
|
|
|
2022-10-05 02:44:28 +03:00
|
|
|
const getCardOptions = useCallback(() => {
|
|
|
|
let shape;
|
|
|
|
let preferThumb;
|
|
|
|
let preferDisc;
|
|
|
|
let preferLogo;
|
2022-08-10 22:08:49 +03:00
|
|
|
|
2022-10-05 02:44:28 +03:00
|
|
|
if (viewsettings.imageType === 'banner') {
|
|
|
|
shape = 'banner';
|
|
|
|
} else if (viewsettings.imageType === 'disc') {
|
|
|
|
shape = 'square';
|
|
|
|
preferDisc = true;
|
|
|
|
} else if (viewsettings.imageType === 'logo') {
|
|
|
|
shape = 'backdrop';
|
|
|
|
preferLogo = true;
|
|
|
|
} else if (viewsettings.imageType === 'thumb') {
|
|
|
|
shape = 'backdrop';
|
|
|
|
preferThumb = true;
|
|
|
|
} else {
|
|
|
|
shape = 'autoVertical';
|
|
|
|
}
|
|
|
|
|
|
|
|
const cardOptions: CardOptionsI = {
|
|
|
|
shape: shape,
|
|
|
|
showTitle: viewsettings.showTitle,
|
2022-10-14 02:07:54 +03:00
|
|
|
showYear: viewsettings.showYear,
|
2022-10-05 02:44:28 +03:00
|
|
|
cardLayout: viewsettings.cardLayout,
|
|
|
|
centerText: true,
|
|
|
|
context: getContext(),
|
|
|
|
coverImage: true,
|
|
|
|
preferThumb: preferThumb,
|
|
|
|
preferDisc: preferDisc,
|
|
|
|
preferLogo: preferLogo,
|
|
|
|
overlayPlayButton: false,
|
|
|
|
overlayMoreButton: true,
|
|
|
|
overlayText: !viewsettings.showTitle
|
|
|
|
};
|
|
|
|
|
|
|
|
cardOptions.items = items;
|
|
|
|
|
|
|
|
return cardOptions;
|
2022-10-14 02:07:54 +03:00
|
|
|
}, [getContext, items, viewsettings.cardLayout, viewsettings.imageType, viewsettings.showTitle, viewsettings.showYear]);
|
2022-10-05 02:44:28 +03:00
|
|
|
|
|
|
|
const getItemsHtml = useCallback(() => {
|
|
|
|
const settings = getViewSettings();
|
|
|
|
|
|
|
|
let html = '';
|
|
|
|
|
|
|
|
if (settings.imageType === 'list') {
|
2022-08-06 01:36:13 +03:00
|
|
|
html = listview.getListViewHtml({
|
|
|
|
items: items,
|
2022-10-05 02:44:28 +03:00
|
|
|
context: getContext()});
|
2022-08-06 01:36:13 +03:00
|
|
|
} else {
|
2022-10-05 02:44:28 +03:00
|
|
|
html = cardBuilder.getCardsHtml(items, getCardOptions());
|
2022-08-06 01:36:13 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!items?.length) {
|
|
|
|
html += '<div class="noItemsMessage centerMessage">';
|
|
|
|
html += '<h1>' + globalize.translate('MessageNothingHere') + '</h1>';
|
|
|
|
html += '<p>' + globalize.translate(noItemsMessage) + '</p>';
|
|
|
|
html += '</div>';
|
|
|
|
}
|
|
|
|
|
2022-10-05 02:44:28 +03:00
|
|
|
return html;
|
|
|
|
}, [getCardOptions, getContext, getViewSettings, items, noItemsMessage]);
|
|
|
|
|
|
|
|
useEffect(() => {
|
2022-08-06 01:36:13 +03:00
|
|
|
const itemsContainer = element.current?.querySelector('.itemsContainer') as HTMLDivElement;
|
2022-10-05 02:44:28 +03:00
|
|
|
itemsContainer.innerHTML = getItemsHtml();
|
2022-08-06 01:36:13 +03:00
|
|
|
imageLoader.lazyChildren(itemsContainer);
|
2022-10-05 02:44:28 +03:00
|
|
|
}, [getItemsHtml]);
|
2022-08-10 22:08:49 +03:00
|
|
|
|
2022-10-05 02:44:28 +03:00
|
|
|
const cssClass = viewsettings.imageType == 'List' ? 'vertical-list' : 'vertical-wrap';
|
2022-08-06 01:36:13 +03:00
|
|
|
|
|
|
|
return (
|
|
|
|
<div ref={element}>
|
|
|
|
<ItemsContainerElement
|
2022-08-21 03:09:22 +03:00
|
|
|
className={`itemsContainer ${cssClass} centered padded-left padded-right padded-right-withalphapicker`}
|
2022-08-06 01:36:13 +03:00
|
|
|
/>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default ItemsContainer;
|