// ================================================================ // frontend/src/components/dashboard/InsightsGrid.tsx // ================================================================ /** * Insights Grid - Key metrics at a glance * * 2x2 grid of important metrics: savings, inventory, waste, deliveries. * Mobile-first design with large touch targets. */ import React from 'react'; import { useTranslation } from 'react-i18next'; import { Insights } from '../../api/hooks/newDashboard'; interface InsightsGridProps { insights: Insights; loading?: boolean; } const colorConfig = { green: { bgColor: 'var(--color-success-50)', borderColor: 'var(--color-success-200)', textColor: 'var(--color-success-800)', detailColor: 'var(--color-success-600)', }, amber: { bgColor: 'var(--color-warning-50)', borderColor: 'var(--color-warning-200)', textColor: 'var(--color-warning-900)', detailColor: 'var(--color-warning-600)', }, red: { bgColor: 'var(--color-error-50)', borderColor: 'var(--color-error-200)', textColor: 'var(--color-error-900)', detailColor: 'var(--color-error-600)', }, }; function InsightCard({ color, i18n, }: { color: 'green' | 'amber' | 'red'; i18n: { label: { key: string; params?: Record; }; value: { key: string; params?: Record; }; detail: { key: string; params?: Record; } | null; }; }) { const { t } = useTranslation('dashboard'); const config = colorConfig[color]; // Translate using i18n keys const displayLabel = t(i18n.label.key, i18n.label.params); const displayValue = t(i18n.value.key, i18n.value.params); const displayDetail = i18n.detail ? t(i18n.detail.key, i18n.detail.params) : ''; return (
{/* Label */}
{displayLabel}
{/* Value */}
{displayValue}
{/* Detail */}
{displayDetail}
); } export function InsightsGrid({ insights, loading }: InsightsGridProps) { if (loading) { return (
{[1, 2, 3, 4].map((i) => (
))}
); } // Guard against undefined values if (!insights || !insights.savings || !insights.inventory || !insights.waste || !insights.deliveries) { return null; } return (
); }