import { formatBytes } from '~/lib/util' 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 }) => { // 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}

{category.tiers.length} tiers available {!highlightedTierSlug && ( - Click to choose )}

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

Size: {formatBytes(minSize, 1)} - {formatBytes(maxSize, 1)}

) } export default CategoryCard