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

114 lines
3.9 KiB
TypeScript
Raw Normal View History

2022-08-06 01:36:13 +03:00
import { BaseItemDto } from '@thornbill/jellyfin-sdk/dist/generated-client';
import React, { FunctionComponent, useEffect, useRef } from 'react';
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-02 19:07:42 +03:00
import { QueryI } from './interface';
2022-08-06 01:36:13 +03:00
type ItemsContainerProps = {
getCurrentViewStyle: () => string;
2022-10-02 19:07:42 +03:00
query: QueryI;
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-08-21 03:09:22 +03:00
const ItemsContainer: FunctionComponent<ItemsContainerProps> = ({ getCurrentViewStyle, query, getContext, items = [], noItemsMessage }: ItemsContainerProps) => {
2022-08-06 01:36:13 +03:00
const element = useRef<HTMLDivElement>(null);
const viewStyle = getCurrentViewStyle();
2022-08-06 01:36:13 +03:00
useEffect(() => {
let html;
2022-08-06 01:36:13 +03:00
if (viewStyle == 'Thumb') {
html = cardBuilder.getCardsHtml(items, {
items: items,
shape: 'backdrop',
preferThumb: true,
2022-08-21 03:09:22 +03:00
context: getContext(),
2022-08-06 01:36:13 +03:00
lazy: true,
overlayPlayButton: true,
showTitle: true,
showYear: true,
centerText: true
});
} else if (viewStyle == 'ThumbCard') {
html = cardBuilder.getCardsHtml(items, {
items: items,
shape: 'backdrop',
preferThumb: true,
2022-08-21 03:09:22 +03:00
context: getContext(),
2022-08-06 01:36:13 +03:00
lazy: true,
cardLayout: true,
showTitle: true,
showYear: true,
centerText: true
});
} else if (viewStyle == 'Banner') {
html = cardBuilder.getCardsHtml(items, {
items: items,
shape: 'banner',
preferBanner: true,
2022-08-21 03:09:22 +03:00
context: getContext(),
2022-08-06 01:36:13 +03:00
lazy: true
});
} else if (viewStyle == 'List') {
html = listview.getListViewHtml({
items: items,
2022-08-21 03:09:22 +03:00
context: getContext(),
2022-08-06 01:36:13 +03:00
sortBy: query.SortBy
});
} else if (viewStyle == 'PosterCard') {
html = cardBuilder.getCardsHtml(items, {
items: items,
shape: 'portrait',
2022-08-21 03:09:22 +03:00
context: getContext(),
2022-08-06 01:36:13 +03:00
showTitle: true,
showYear: true,
centerText: true,
lazy: true,
cardLayout: true
});
} else {
html = cardBuilder.getCardsHtml(items, {
items: items,
shape: 'portrait',
2022-08-21 03:09:22 +03:00
context: getContext(),
2022-08-06 01:36:13 +03:00
overlayPlayButton: true,
showTitle: true,
showYear: true,
centerText: true
});
}
if (!items?.length) {
html = '';
html += '<div class="noItemsMessage centerMessage">';
html += '<h1>' + globalize.translate('MessageNothingHere') + '</h1>';
html += '<p>' + globalize.translate(noItemsMessage) + '</p>';
html += '</div>';
}
const itemsContainer = element.current?.querySelector('.itemsContainer') as HTMLDivElement;
itemsContainer.innerHTML = html;
imageLoader.lazyChildren(itemsContainer);
2022-08-21 03:09:22 +03:00
}, [query.SortBy, items, noItemsMessage, viewStyle, getContext]);
const cssClass = viewStyle == '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;