jellyfish-web/src/view/components/ItemsContainer.tsx

112 lines
3.8 KiB
TypeScript
Raw Normal View History

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';
import { CardOptionsI } from './interface';
2022-08-06 01:36:13 +03:00
interface ItemsContainerI {
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;
}
const ItemsContainer: FC<ItemsContainerI> = ({ getViewSettings, getContext, items = [], noItemsMessage }) => {
2022-08-06 01:36:13 +03:00
const element = useRef<HTMLDivElement>(null);
const viewsettings = getViewSettings();
2022-08-06 01:36:13 +03:00
const getCardOptions = useCallback(() => {
let shape;
let preferThumb;
let preferDisc;
let preferLogo;
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,
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]);
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,
context: getContext()});
2022-08-06 01:36:13 +03:00
} else {
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>';
}
return html;
}, [getCardOptions, getContext, getViewSettings, items, noItemsMessage]);
useEffect(() => {
2022-08-06 01:36:13 +03:00
const itemsContainer = element.current?.querySelector('.itemsContainer') as HTMLDivElement;
itemsContainer.innerHTML = getItemsHtml();
2022-08-06 01:36:13 +03:00
imageLoader.lazyChildren(itemsContainer);
}, [getItemsHtml]);
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;