import { useEffect, useState, useCallback } from "react"; import { createPortal } from "react-dom"; import { useTranslation } from "react-i18next"; import { X, Loader2 } from "lucide-react"; import { getTransactionsByCategory } from "../../services/dashboardService"; import type { TransactionRow } from "../../shared/types"; const cadFormatter = new Intl.NumberFormat("en-CA", { style: "currency", currency: "CAD", }); interface TransactionDetailModalProps { categoryId: number | null; categoryName: string; categoryColor: string; dateFrom?: string; dateTo?: string; onClose: () => void; } export default function TransactionDetailModal({ categoryId, categoryName, categoryColor, dateFrom, dateTo, onClose, }: TransactionDetailModalProps) { const { t } = useTranslation(); const [rows, setRows] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); const fetchData = useCallback(async () => { setIsLoading(true); setError(null); try { const data = await getTransactionsByCategory(categoryId, dateFrom, dateTo); setRows(data); } catch (e) { setError(e instanceof Error ? e.message : String(e)); } finally { setIsLoading(false); } }, [categoryId, dateFrom, dateTo]); useEffect(() => { fetchData(); }, [fetchData]); useEffect(() => { function handleEscape(e: KeyboardEvent) { if (e.key === "Escape") onClose(); } document.addEventListener("keydown", handleEscape); return () => document.removeEventListener("keydown", handleEscape); }, [onClose]); const total = rows.reduce((sum, r) => sum + r.amount, 0); return createPortal(
{ if (e.target === e.currentTarget) onClose(); }} >
{/* Header */}

{categoryName}

({rows.length} {t("charts.transactions")})
{/* Body */}
{isLoading && (
)} {error && (
{error}
)} {!isLoading && !error && rows.length === 0 && (
{t("dashboard.noData")}
)} {!isLoading && !error && rows.length > 0 && ( {rows.map((row) => ( ))}
{t("transactions.date")} {t("transactions.description")} {t("transactions.amount")}
{row.date} {row.description} = 0 ? "text-[var(--positive)]" : "text-[var(--negative)]" }`}> {cadFormatter.format(row.amount)}
{t("charts.total")} = 0 ? "text-[var(--positive)]" : "text-[var(--negative)]" }`}> {cadFormatter.format(total)}
)}
, document.body ); }