"use client"; import { EstabelecimentoLogo } from "@/components/lancamentos/shared/estabelecimento-logo"; import MoneyValues from "@/components/money-values"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { CATEGORY_TYPE_LABEL } from "@/lib/categorias/constants"; import type { PurchasesByCategoryData } from "@/lib/dashboard/purchases-by-category"; import { RiArrowDownLine, RiStore3Line } from "@remixicon/react"; import { useEffect, useMemo, useState } from "react"; import { WidgetEmptyState } from "../widget-empty-state"; type PurchasesByCategoryWidgetProps = { data: PurchasesByCategoryData; }; const formatTransactionDate = (date: Date) => { const formatter = new Intl.DateTimeFormat("pt-BR", { weekday: "short", day: "2-digit", month: "short", timeZone: "UTC", }); const formatted = formatter.format(date); // Capitaliza a primeira letra do dia da semana return formatted.charAt(0).toUpperCase() + formatted.slice(1); }; const STORAGE_KEY = "purchases-by-category-selected"; export function PurchasesByCategoryWidget({ data, }: PurchasesByCategoryWidgetProps) { // Inicializa com a categoria salva ou a primeira disponível const [selectedCategoryId, setSelectedCategoryId] = useState(() => { if (typeof window === "undefined") { const firstCategory = data.categories[0]; return firstCategory ? firstCategory.id : ""; } const saved = sessionStorage.getItem(STORAGE_KEY); if (saved && data.categories.some((cat) => cat.id === saved)) { return saved; } const firstCategory = data.categories[0]; return firstCategory ? firstCategory.id : ""; }); // Agrupa categorias por tipo const categoriesByType = useMemo(() => { const grouped: Record = {}; for (const category of data.categories) { if (!grouped[category.type]) { grouped[category.type] = []; } const typeGroup = grouped[category.type]; if (typeGroup) { typeGroup.push(category); } } return grouped; // eslint-disable-next-line react-hooks/exhaustive-deps }, [data.categories]); // Salva a categoria selecionada quando mudar useEffect(() => { if (selectedCategoryId) { sessionStorage.setItem(STORAGE_KEY, selectedCategoryId); } }, [selectedCategoryId]); // Atualiza a categoria selecionada se ela não existir mais na lista useEffect(() => { if ( selectedCategoryId && !data.categories.some((cat) => cat.id === selectedCategoryId) ) { const firstCategory = data.categories[0]; if (firstCategory) { setSelectedCategoryId(firstCategory.id); } else { setSelectedCategoryId(""); } } }, [data.categories, selectedCategoryId]); const currentTransactions = useMemo(() => { if (!selectedCategoryId) { return []; } return data.transactionsByCategory[selectedCategoryId] ?? []; }, [selectedCategoryId, data.transactionsByCategory]); const selectedCategory = useMemo(() => { return data.categories.find((cat) => cat.id === selectedCategoryId); }, [data.categories, selectedCategoryId]); if (data.categories.length === 0) { return ( } title="Nenhuma categoria encontrada" description="Crie categorias de despesas ou receitas para visualizar as compras." /> ); } return (
{currentTransactions.length === 0 ? ( } title="Nenhuma compra encontrada" description={ selectedCategory ? `Não há lançamentos na categoria "${selectedCategory.name}".` : "Selecione uma categoria para visualizar as compras." } /> ) : (
    {currentTransactions.map((transaction) => { return (
  • {transaction.name}

    {formatTransactionDate(transaction.purchaseDate)}

  • ); })}
)}
); }