import classNames from "classnames"; import { useTranslation } from "react-i18next"; import { Link } from "react-router-dom"; import { mediaItemToId } from "@/backend/metadata/tmdb"; import { DotList } from "@/components/text/DotList"; import { Flare } from "@/components/utils/Flare"; import { MediaItem } from "@/utils/mediaTypes"; import { IconPatch } from "../buttons/IconPatch"; import { Icons } from "../Icon"; export interface MediaCardProps { media: MediaItem; linkable?: boolean; series?: { episode: number; season?: number; episodeId: string; seasonId: string; }; percentage?: number; closable?: boolean; onClose?: () => void; } function MediaCardContent({ media, linkable, series, percentage, closable, onClose, }: MediaCardProps) { const { t } = useTranslation(); const percentageString = `${Math.round(percentage ?? 0).toFixed(0)}%`; const canLink = linkable && !closable && !!media.year; const dotListContent = [t(`media.types.${media.type}`)]; if (media.year) { dotListContent.push(media.year.toFixed()); } else { dotListContent.push(t("Unreleased")); } return ( e.key === "Enter" && e.currentTarget.click()} >
{series ? (

{t("media.episodeDisplay", { season: series.season || 1, episode: series.episode, })}

) : null} {percentage !== undefined ? ( <>
) : null}
closable && onClose?.()} icon={Icons.X} />

{media.title}

); } export function MediaCard(props: MediaCardProps) { const content = ; const canLink = props.linkable && !props.closable; let link = canLink ? `/media/${encodeURIComponent(mediaItemToId(props.media))}` : "#"; if (canLink && props.series) { if (props.series.season === 0 && !props.series.episodeId) { link += `/${encodeURIComponent(props.series.seasonId)}`; } else { link += `/${encodeURIComponent( props.series.seasonId, )}/${encodeURIComponent(props.series.episodeId)}`; } } if (!props.linkable || !props.media.year) return {content}; return ( {content} ); }