"use client"; import { RiArrowUpDoubleLine } from "@remixicon/react"; import { useMemo, useState } from "react"; import type { TopExpense, TopExpensesData, } from "@/features/dashboard/expenses/top-expenses-queries"; import { EstablishmentLogo } from "@/shared/components/entity-avatar"; import MoneyValues from "@/shared/components/money-values"; import { Switch } from "@/shared/components/ui/switch"; import { WidgetEmptyState } from "@/shared/components/widgets/widget-empty-state"; import { formatTransactionDate } from "@/shared/utils/date"; type TopExpensesWidgetProps = { allExpenses: TopExpensesData; cardOnlyExpenses: TopExpensesData; }; const shouldIncludeExpense = (expense: TopExpense) => { const normalizedName = expense.name.trim().toLowerCase(); if (normalizedName === "saldo inicial") { return false; } if (normalizedName.includes("fatura")) { return false; } return true; }; const isCardExpense = (expense: TopExpense) => expense.paymentMethod?.toLowerCase().includes("cartão") ?? false; export function TopExpensesWidget({ allExpenses, cardOnlyExpenses, }: TopExpensesWidgetProps) { const [cardOnly, setCardOnly] = useState(false); const normalizedAllExpenses = useMemo(() => { return allExpenses.expenses.filter(shouldIncludeExpense); }, [allExpenses]); const normalizedCardOnlyExpenses = useMemo(() => { const merged = [...cardOnlyExpenses.expenses, ...normalizedAllExpenses]; const seen = new Set(); return merged.filter((expense) => { if (seen.has(expense.id)) { return false; } if (!isCardExpense(expense) || !shouldIncludeExpense(expense)) { return false; } seen.add(expense.id); return true; }); }, [cardOnlyExpenses, normalizedAllExpenses]); const data = cardOnly ? { expenses: normalizedCardOnlyExpenses } : { expenses: normalizedAllExpenses }; return (
{data.expenses.length === 0 ? (
} title="Nenhuma despesa encontrada" description="Quando houver despesas registradas, elas aparecerão aqui." />
) : (
{data.expenses.map((expense) => { return (

{expense.name}

{formatTransactionDate(expense.purchaseDate)}

); })}
)}
); }