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);
|
2022-08-10 22:08:49 +03:00
|
|
|
const viewStyle = getCurrentViewStyle();
|
2022-08-06 01:36:13 +03:00
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
let html;
|
2022-08-10 22:08:49 +03:00
|
|
|
|
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]);
|
2022-08-10 22:08:49 +03:00
|
|
|
|
|
|
|
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;
|