2022-08-21 03:09:22 +03:00
|
|
|
import { BaseItemDtoQueryResult } from '@thornbill/jellyfin-sdk/dist/generated-client';
|
2022-10-03 01:23:59 +03:00
|
|
|
import React, { FC, useCallback, useEffect, useRef, useState } from 'react';
|
2022-08-21 03:09:22 +03:00
|
|
|
|
|
|
|
import loading from '../../components/loading/loading';
|
|
|
|
import * as userSettings from '../../scripts/settings/userSettings';
|
|
|
|
import AlphaPickerContainer from './AlphaPickerContainer';
|
|
|
|
import Filter from './Filter';
|
|
|
|
import ItemsContainer from './ItemsContainer';
|
|
|
|
import Pagination from './Pagination';
|
|
|
|
import SelectView from './SelectView';
|
|
|
|
import Shuffle from './Shuffle';
|
|
|
|
import Sort from './Sort';
|
2022-10-02 19:07:42 +03:00
|
|
|
import { QueryI } from './interface';
|
2022-08-21 03:09:22 +03:00
|
|
|
import NewCollection from './NewCollection';
|
2022-10-03 01:23:59 +03:00
|
|
|
import globalize from '../../scripts/globalize';
|
2022-08-21 03:09:22 +03:00
|
|
|
|
2022-10-02 19:07:42 +03:00
|
|
|
interface ViewItemsContainerI {
|
2022-08-21 03:09:22 +03:00
|
|
|
topParentId: string | null;
|
|
|
|
isBtnShuffleEnabled?: boolean;
|
|
|
|
isBtnFilterEnabled?: boolean;
|
|
|
|
isBtnNewCollectionEnabled?: boolean;
|
|
|
|
isAlphaPickerEnabled?: boolean;
|
|
|
|
getBasekey: () => string;
|
|
|
|
getFilterMode: () => string;
|
|
|
|
getItemTypes: () => string;
|
|
|
|
getNoItemsMessage: () => string;
|
|
|
|
}
|
|
|
|
|
2022-10-02 19:07:42 +03:00
|
|
|
const ViewItemsContainer: FC<ViewItemsContainerI> = ({
|
2022-08-21 03:09:22 +03:00
|
|
|
topParentId,
|
|
|
|
isBtnShuffleEnabled = false,
|
|
|
|
isBtnFilterEnabled = true,
|
|
|
|
isBtnNewCollectionEnabled = false,
|
|
|
|
isAlphaPickerEnabled = true,
|
|
|
|
getBasekey,
|
|
|
|
getFilterMode,
|
|
|
|
getItemTypes,
|
|
|
|
getNoItemsMessage
|
2022-10-02 19:07:42 +03:00
|
|
|
}) => {
|
2022-08-21 03:09:22 +03:00
|
|
|
const [ itemsResult, setItemsResult ] = useState<BaseItemDtoQueryResult>({});
|
|
|
|
|
|
|
|
const element = useRef<HTMLDivElement>(null);
|
|
|
|
|
|
|
|
const getSettingsKey = useCallback(() => {
|
|
|
|
return `${topParentId} - ${getBasekey()}`;
|
|
|
|
}, [getBasekey, topParentId]);
|
|
|
|
|
|
|
|
const getViewSettings = useCallback(() => {
|
|
|
|
return `${getSettingsKey()} -view`;
|
|
|
|
}, [getSettingsKey]);
|
|
|
|
|
2022-10-03 01:23:59 +03:00
|
|
|
const getDefaultSortBy = useCallback(() => {
|
|
|
|
return 'SortName';
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
const getSortValues = useCallback(() => {
|
|
|
|
const basekey = getSettingsKey();
|
|
|
|
|
|
|
|
return {
|
|
|
|
sortBy: userSettings.getFilter(basekey + '-sortby') || getDefaultSortBy(),
|
|
|
|
sortOrder: userSettings.getFilter(basekey + '-sortorder') === 'Descending' ? 'Descending' : 'Ascending'
|
|
|
|
};
|
|
|
|
}, [getDefaultSortBy, getSettingsKey]);
|
|
|
|
|
|
|
|
const getQuery = useCallback(() => {
|
|
|
|
const query: QueryI = {
|
|
|
|
SortBy: getSortValues().sortBy,
|
|
|
|
SortOrder: getSortValues().sortOrder,
|
|
|
|
IncludeItemTypes: getItemTypes(),
|
|
|
|
Recursive: true,
|
|
|
|
Fields: 'PrimaryImageAspectRatio,MediaSourceCount,BasicSyncInfo',
|
|
|
|
ImageTypeLimit: 1,
|
|
|
|
EnableImageTypes: 'Primary,Backdrop,Banner,Thumb',
|
|
|
|
Limit: userSettings.libraryPageSize(undefined),
|
|
|
|
StartIndex: 0,
|
|
|
|
ParentId: topParentId
|
|
|
|
};
|
|
|
|
|
|
|
|
if (getBasekey() === 'favorites') {
|
|
|
|
query.IsFavorite = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
userSettings.loadQuerySettings(getSettingsKey(), query);
|
|
|
|
return query;
|
|
|
|
}, [getSortValues, getItemTypes, topParentId, getBasekey, getSettingsKey]);
|
|
|
|
|
|
|
|
const getSortMenuOptions = useCallback(() => {
|
|
|
|
return [{
|
|
|
|
name: globalize.translate('Name'),
|
|
|
|
value: 'SortName,ProductionYear'
|
|
|
|
}, {
|
|
|
|
name: globalize.translate('OptionRandom'),
|
|
|
|
value: 'Random'
|
|
|
|
}, {
|
|
|
|
name: globalize.translate('OptionImdbRating'),
|
|
|
|
value: 'CommunityRating,SortName,ProductionYear'
|
|
|
|
}, {
|
|
|
|
name: globalize.translate('OptionCriticRating'),
|
|
|
|
value: 'CriticRating,SortName,ProductionYear'
|
|
|
|
}, {
|
|
|
|
name: globalize.translate('OptionDateAdded'),
|
|
|
|
value: 'DateCreated,SortName,ProductionYear'
|
|
|
|
}, {
|
|
|
|
name: globalize.translate('OptionDatePlayed'),
|
|
|
|
value: 'DatePlayed,SortName,ProductionYear'
|
|
|
|
}, {
|
|
|
|
name: globalize.translate('OptionParentalRating'),
|
|
|
|
value: 'OfficialRating,SortName,ProductionYear'
|
|
|
|
}, {
|
|
|
|
name: globalize.translate('OptionPlayCount'),
|
|
|
|
value: 'PlayCount,SortName,ProductionYear'
|
|
|
|
}, {
|
|
|
|
name: globalize.translate('OptionReleaseDate'),
|
|
|
|
value: 'PremiereDate,SortName,ProductionYear'
|
|
|
|
}, {
|
|
|
|
name: globalize.translate('Runtime'),
|
|
|
|
value: 'Runtime,SortName,ProductionYear'
|
|
|
|
}];
|
|
|
|
}, []);
|
2022-08-21 03:09:22 +03:00
|
|
|
|
|
|
|
const getCurrentViewStyle = useCallback(() => {
|
|
|
|
return userSettings.get(getViewSettings(), false) || 'Poster';
|
|
|
|
}, [getViewSettings]);
|
|
|
|
|
|
|
|
const getContext = useCallback(() => {
|
|
|
|
const itemType = getItemTypes();
|
|
|
|
if (itemType === 'Movie' || itemType === 'BoxSet') {
|
|
|
|
return 'movies';
|
|
|
|
}
|
|
|
|
|
|
|
|
return null;
|
|
|
|
}, [getItemTypes]);
|
|
|
|
|
|
|
|
const reloadItems = useCallback(() => {
|
|
|
|
const page = element.current;
|
|
|
|
|
|
|
|
if (!page) {
|
|
|
|
console.error('Unexpected null reference');
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
loading.show();
|
2022-10-03 01:23:59 +03:00
|
|
|
const query = getQuery();
|
2022-08-21 03:09:22 +03:00
|
|
|
window.ApiClient.getItems(window.ApiClient.getCurrentUserId(), query).then((result) => {
|
|
|
|
setItemsResult(result);
|
|
|
|
window.scrollTo(0, 0);
|
|
|
|
|
|
|
|
loading.hide();
|
|
|
|
|
|
|
|
import('../../components/autoFocuser').then(({ default: autoFocuser }) => {
|
|
|
|
autoFocuser.autoFocus(page);
|
|
|
|
});
|
|
|
|
});
|
2022-10-03 01:23:59 +03:00
|
|
|
}, [getQuery]);
|
2022-08-21 03:09:22 +03:00
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
reloadItems();
|
|
|
|
}, [reloadItems]);
|
|
|
|
|
|
|
|
return (
|
|
|
|
<div ref={element}>
|
|
|
|
<div className='flex align-items-center justify-content-center flex-wrap-wrap padded-top padded-left padded-right padded-bottom focuscontainer-x'>
|
2022-10-03 01:23:59 +03:00
|
|
|
<Pagination itemsResult= {itemsResult} query={getQuery()} reloadItems={reloadItems} />
|
2022-08-21 03:09:22 +03:00
|
|
|
|
|
|
|
{isBtnShuffleEnabled && <Shuffle itemsResult={itemsResult} topParentId={topParentId} />}
|
2022-10-03 01:23:59 +03:00
|
|
|
<SelectView getCurrentViewStyle={getCurrentViewStyle} getViewSettings={getViewSettings} query={getQuery()} reloadItems={reloadItems} />
|
|
|
|
|
|
|
|
<Sort
|
|
|
|
getSortMenuOptions={getSortMenuOptions}
|
|
|
|
getSortValues={getSortValues}
|
|
|
|
getSettingsKey={getSettingsKey}
|
|
|
|
reloadItems={reloadItems}
|
|
|
|
/>
|
2022-08-21 03:09:22 +03:00
|
|
|
|
2022-10-03 01:23:59 +03:00
|
|
|
{isBtnFilterEnabled && <Filter query={getQuery()} getFilterMode={getFilterMode} reloadItems={reloadItems} />}
|
2022-08-21 03:09:22 +03:00
|
|
|
|
|
|
|
{isBtnNewCollectionEnabled && <NewCollection />}
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
2022-10-03 01:23:59 +03:00
|
|
|
{isAlphaPickerEnabled && <AlphaPickerContainer query={getQuery()} reloadItems={reloadItems} />}
|
2022-08-21 03:09:22 +03:00
|
|
|
|
|
|
|
<ItemsContainer
|
|
|
|
getCurrentViewStyle={getCurrentViewStyle}
|
2022-10-03 01:23:59 +03:00
|
|
|
query={getQuery()}
|
2022-08-21 03:09:22 +03:00
|
|
|
getContext={getContext}
|
|
|
|
items={itemsResult?.Items}
|
|
|
|
noItemsMessage={getNoItemsMessage()}
|
|
|
|
/>
|
|
|
|
|
|
|
|
<div className='flex align-items-center justify-content-center flex-wrap-wrap padded-top padded-left padded-right padded-bottom focuscontainer-x'>
|
2022-10-03 01:23:59 +03:00
|
|
|
<Pagination itemsResult= {itemsResult} query={getQuery()} reloadItems={reloadItems} />
|
2022-08-21 03:09:22 +03:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
|
|
|
|
export default ViewItemsContainer;
|