import { formatBytes } from '~/lib/util' import { useTranslation } from 'react-i18next' import DynamicIcon, { DynamicIconName } from './DynamicIcon' import type { CategoryWithStatus, SpecTier } from '../../types/collections' import classNames from 'classnames' import { IconChevronRight, IconCircleCheck } from '@tabler/icons-react' export interface CategoryCardProps { category: CategoryWithStatus selectedTier?: SpecTier | null onClick?: (category: CategoryWithStatus) => void } const CategoryCard: React.FC = ({ category, selectedTier, onClick }) => { const { t } = useTranslation() // Calculate total size range across all tiers const getTierTotalSize = (tier: SpecTier, allTiers: SpecTier[]): number => { let total = tier.resources.reduce((acc, r) => acc + r.size_mb * 1024 * 1024, 0) // Add included tier sizes recursively if (tier.includesTier) { const includedTier = allTiers.find(t => t.slug === tier.includesTier) if (includedTier) { total += getTierTotalSize(includedTier, allTiers) } } return total } const minSize = getTierTotalSize(category.tiers[0], category.tiers) const maxSize = getTierTotalSize(category.tiers[category.tiers.length - 1], category.tiers) // Determine which tier to highlight: selectedTier (wizard) > installedTierSlug (persisted) const highlightedTierSlug = selectedTier?.slug || category.installedTierSlug return (
onClick?.(category)} >

{category.name}

{selectedTier ? (
{selectedTier.name}
) : ( )}

{category.description}

{t('contentExplorer.categoryCard.tiersAvailable', { count: category.tiers.length })} {!highlightedTierSlug && ( - {t('contentExplorer.categoryCard.clickToChoose')} )}

{category.tiers.map((tier) => { const isInstalled = tier.slug === highlightedTierSlug return ( {tier.name} ) })}

{t('contentExplorer.categoryCard.size', { min: formatBytes(minSize, 1), max: formatBytes(maxSize, 1) })}

) } export default CategoryCard