8cbddba8fd
Use type import for react FC, Remove escapeHTML Co-authored-by: Bill Thornton <thornbill@users.noreply.github.com>
124 lines
3.5 KiB
TypeScript
124 lines
3.5 KiB
TypeScript
import { BaseItemKind } from '@jellyfin/sdk/lib/generated-client/models/base-item-kind';
|
|
import classNames from 'classnames';
|
|
import useCardImageUrl from './useCardImageUrl';
|
|
import {
|
|
resolveAction,
|
|
resolveMixedShapeByAspectRatio
|
|
} from '../cardBuilderUtils';
|
|
import { getDataAttributes } from 'utils/items';
|
|
import { CardShape } from 'utils/card';
|
|
import layoutManager from 'components/layoutManager';
|
|
|
|
import type { ItemDto } from 'types/itemDto';
|
|
import type { CardOptions } from 'types/cardOptions';
|
|
|
|
interface UseCardProps {
|
|
item: ItemDto;
|
|
cardOptions: CardOptions;
|
|
}
|
|
|
|
function useCard({ item, cardOptions }: UseCardProps) {
|
|
const action = resolveAction({
|
|
defaultAction: cardOptions.action ?? 'link',
|
|
isFolder: item.IsFolder ?? false,
|
|
isPhoto: item.MediaType === 'Photo'
|
|
});
|
|
|
|
let shape = cardOptions.shape;
|
|
|
|
if (shape === CardShape.Mixed) {
|
|
shape = resolveMixedShapeByAspectRatio(item.PrimaryImageAspectRatio);
|
|
}
|
|
|
|
const imgInfo = useCardImageUrl({
|
|
item: item.ProgramInfo ?? item,
|
|
cardOptions,
|
|
shape
|
|
});
|
|
const imgUrl = imgInfo.imgUrl;
|
|
const blurhash = imgInfo.blurhash;
|
|
const forceName = imgInfo.forceName;
|
|
const coveredImage = cardOptions.coverImage ?? imgInfo.coverImage;
|
|
const overlayText = cardOptions.overlayText;
|
|
|
|
const nameWithPrefix = item.SortName ?? item.Name ?? '';
|
|
let prefix = nameWithPrefix.substring(
|
|
0,
|
|
Math.min(3, nameWithPrefix.length)
|
|
);
|
|
|
|
if (prefix) {
|
|
prefix = prefix.toUpperCase();
|
|
}
|
|
|
|
const dataAttributes = getDataAttributes(
|
|
{
|
|
action,
|
|
itemServerId: item.ServerId ?? cardOptions.serverId,
|
|
context: cardOptions.context,
|
|
parentId: cardOptions.parentId,
|
|
collectionId: cardOptions.collectionId,
|
|
playlistId: cardOptions.playlistId,
|
|
itemId: item.Id,
|
|
itemTimerId: item.TimerId,
|
|
itemSeriesTimerId: item.SeriesTimerId,
|
|
itemChannelId: item.ChannelId,
|
|
itemType: item.Type,
|
|
itemMediaType: item.MediaType,
|
|
itemCollectionType: item.CollectionType,
|
|
itemIsFolder: item.IsFolder,
|
|
itemPath: item.Path,
|
|
itemStartDate: item.StartDate,
|
|
itemEndDate: item.EndDate,
|
|
itemUserData: item.UserData,
|
|
prefix
|
|
}
|
|
);
|
|
|
|
const cardClass = classNames(
|
|
'card',
|
|
{ [`${shape}Card`]: shape },
|
|
cardOptions.cardCssClass,
|
|
cardOptions.cardClass,
|
|
{ 'card-hoverable': layoutManager.desktop },
|
|
{ groupedCard: cardOptions.showChildCountIndicator && item.ChildCount },
|
|
{
|
|
'card-withuserdata':
|
|
item.Type !== BaseItemKind.MusicAlbum
|
|
&& item.Type !== BaseItemKind.MusicArtist
|
|
&& item.Type !== BaseItemKind.Audio
|
|
},
|
|
{ itemAction: layoutManager.tv }
|
|
);
|
|
|
|
const cardBoxClass = classNames(
|
|
'cardBox',
|
|
{ visualCardBox: cardOptions.cardLayout },
|
|
{ 'cardBox-bottompadded': !cardOptions.cardLayout }
|
|
);
|
|
|
|
const getCardWrapperProps = () => ({
|
|
className: cardClass,
|
|
dataAttributes
|
|
});
|
|
|
|
const getCardBoxProps = () => ({
|
|
item,
|
|
cardOptions,
|
|
className: cardBoxClass,
|
|
shape,
|
|
imgUrl,
|
|
blurhash,
|
|
forceName,
|
|
coveredImage,
|
|
overlayText
|
|
});
|
|
|
|
return {
|
|
getCardWrapperProps,
|
|
getCardBoxProps
|
|
};
|
|
}
|
|
|
|
export default useCard;
|