import { show } from '@/actions/App/Http/Controllers/BudgetController'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card'; import { Progress } from '@/components/ui/progress'; import { useLocale } from '@/hooks/use-locale'; import { Budget, getBudgetPeriodTypeLabel } from '@/types/budget'; import { formatCurrency } from '@/utils/currency'; import { formatDate } from '@/utils/date'; import { __ } from '@/utils/i18n'; import { Link } from '@inertiajs/react'; import { ArrowRight, Calendar } from 'lucide-react'; import { useMemo } from 'react'; interface Props { budget: Budget; currencyCode: string; } export function BudgetListCard({ budget, currencyCode }: Props) { const locale = useLocale(); const currentPeriod = budget.periods?.[0]; const stats = useMemo(() => { if (!currentPeriod) { return { totalAllocated: 0, totalSpent: 0, remaining: 0, percentageUsed: 0, }; } const totalAllocated = currentPeriod.allocated_amount; const totalSpent = currentPeriod.budget_transactions?.reduce( (sum, t) => sum + t.amount, 0, ) ?? 0; const remaining = totalAllocated - totalSpent; const percentageUsed = totalAllocated > 0 ? (totalSpent / totalAllocated) * 100 : 0; return { totalAllocated, totalSpent, remaining, percentageUsed, }; }, [currentPeriod]); const periodLabel = useMemo(() => { if (!currentPeriod) return __('No active period'); const start = formatDate(currentPeriod.start_date, 'MMM d', locale); const end = formatDate(currentPeriod.end_date, 'MMM d', locale); return `${start} - ${end}`; }, [currentPeriod, locale]); const statusColor = useMemo(() => { if (stats.percentageUsed >= 100) return 'text-red-600 dark:text-red-400'; if (stats.percentageUsed >= 80) return 'text-yellow-600 dark:text-yellow-400'; return 'text-green-600 dark:text-green-400'; }, [stats.percentageUsed]); const trackingLabel = useMemo(() => { if (budget.category) return budget.category.name; if (budget.label) return budget.label.name; return __('No tracking'); }, [budget]); return (
{budget.name} {periodLabel}
{__(getBudgetPeriodTypeLabel(budget.period_type))}
{__('Spent')} {formatCurrency(stats.totalSpent, currencyCode)}{' '} {__('of')}{' '} {formatCurrency(stats.totalAllocated, currencyCode)}
{__('Remaining')} {formatCurrency(stats.remaining, currencyCode)}
{__('Tracking:')} {trackingLabel}
); }