1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00
jellyfin-web/src/apps/experimental/components/library/ProgramsSectionView.tsx

107 lines
3.8 KiB
TypeScript
Raw Normal View History

import React, { type FC } from 'react';
2024-01-12 21:08:06 +03:00
import { useGetProgramsSectionsWithItems, useGetTimers } from 'hooks/useFetchItems';
import { appRouter } from 'components/router/appRouter';
2024-08-14 13:31:34 -04:00
import globalize from 'lib/globalize';
2024-01-12 21:08:06 +03:00
import Loading from 'components/loading/LoadingComponent';
2024-09-23 02:53:44 +03:00
import NoItemsMessage from 'components/common/NoItemsMessage';
import SectionContainer from 'components/common/SectionContainer';
import { CardShape } from 'utils/card';
import type { ParentId } from 'types/library';
import type { Section, SectionType } from 'types/sections';
2024-01-12 21:08:06 +03:00
interface ProgramsSectionViewProps {
parentId: ParentId;
sectionType: SectionType[];
isUpcomingRecordingsEnabled: boolean | undefined
}
const ProgramsSectionView: FC<ProgramsSectionViewProps> = ({
parentId,
sectionType,
isUpcomingRecordingsEnabled = false
}) => {
const { isLoading, data: sectionsWithItems, refetch } = useGetProgramsSectionsWithItems(parentId, sectionType);
2024-01-12 21:08:06 +03:00
const {
isLoading: isUpcomingRecordingsLoading,
data: upcomingRecordings
} = useGetTimers(isUpcomingRecordingsEnabled);
if (isLoading || isUpcomingRecordingsLoading) {
return <Loading />;
}
if (!sectionsWithItems?.length && !upcomingRecordings?.length) {
2024-09-23 02:53:44 +03:00
return <NoItemsMessage />;
2024-01-12 21:08:06 +03:00
}
const getRouteUrl = (section: Section) => {
return appRouter.getRouteUrl('list', {
serverId: window.ApiClient.serverId(),
itemTypes: section.itemTypes,
isAiring: section.parametersOptions?.isAiring,
isMovie: section.parametersOptions?.isMovie,
isSports: section.parametersOptions?.isSports,
isKids: section.parametersOptions?.isKids,
isNews: section.parametersOptions?.isNews,
isSeries: section.parametersOptions?.isSeries
});
};
return (
<>
{sectionsWithItems?.map(({ section, items }) => (
<SectionContainer
key={section.type}
2024-09-23 02:53:44 +03:00
sectionHeaderProps={{
title: globalize.translate(section.name),
url: getRouteUrl(section)
}}
itemsContainerProps={{
queryKey: ['ProgramSectionWithItems'],
reloadItems: refetch
}}
items={items}
2024-01-12 21:08:06 +03:00
cardOptions={{
...section.cardOptions,
queryKey: ['ProgramSectionWithItems']
2024-01-12 21:08:06 +03:00
}}
/>
))}
{upcomingRecordings?.map((group) => (
<SectionContainer
key={group.name}
2024-09-23 02:53:44 +03:00
sectionHeaderProps={{
title: group.name
}}
itemsContainerProps={{
queryKey: ['Timers'],
reloadItems: refetch
}}
items={group.timerInfo}
2024-01-12 21:08:06 +03:00
cardOptions={{
queryKey: ['Timers'],
shape: CardShape.BackdropOverflow,
2024-01-12 21:08:06 +03:00
showTitle: true,
showParentTitleOrTitle: true,
showAirTime: true,
showAirEndTime: true,
showChannelName: false,
cardLayout: true,
centerText: false,
action: 'edit',
cardFooterAside: 'none',
preferThumb: true,
coverImage: true,
allowBottomPadding: false,
overlayText: false,
showChannelLogo: true
}}
/>
))}
</>
);
};
export default ProgramsSectionView;