import React from "react"; import type { Bucket } from "@/lib/client/buckets"; type BucketCardProps = { bucket: Bucket; icon?: string | null; isExpanded: boolean; toggleExpanded: (bucketId: number) => void; isMenuOpen: boolean; setMenuOpenId: React.Dispatch>; setConfirmDeleteId: (bucketId: number) => void; openEdit: (bucketId: number) => void; limit: number; usageLabel: string; }; export function BucketCard({ bucket, icon, isExpanded, toggleExpanded, isMenuOpen, setMenuOpenId, setConfirmDeleteId, openEdit, limit, usageLabel, }: BucketCardProps) { const spent = bucket.totalUsage || 0; const rawPercent = limit > 0 ? (spent / limit) * 100 : 0; const progressPercent = Math.max(0, Math.min(100, rawPercent)); const progressColor = rawPercent > 100 ? "#ef4444" : rawPercent >= 80 ? "#facc15" : "#4ade80"; const ringTrackColor = "rgba(148, 163, 184, 0.25)"; return (
toggleExpanded(bucket.id)} >
{limit > 0 ? (
{icon || "?"}
) : (
{icon || "?"}
)}
{bucket.name}
{bucket.description ? (
{bucket.description}
) : null}
{isMenuOpen ? (
) : null}
{limit > 0 ? ( <> {isExpanded ? (
{usageLabel}
{bucket.tags?.length ? ( bucket.tags.map((tag) => ( #{tag} )) ) : ( No tags )}
) : null} ) : isExpanded ? (
{bucket.tags?.length ? ( bucket.tags.map((tag) => ( #{tag} )) ) : ( No tags )}
) : null}
); } export default React.memo(BucketCard, (prev, next) => ( prev.bucket === next.bucket && prev.icon === next.icon && prev.isExpanded === next.isExpanded && prev.isMenuOpen === next.isMenuOpen && prev.limit === next.limit && prev.usageLabel === next.usageLabel ));