"use client"; 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 Image from "next/image"; import { useEffect, useMemo, useState } from "react"; import { WidgetEmptyState } from "../widget-empty-state"; type PurchasesByCategoryWidgetProps = { data: PurchasesByCategoryData; }; const resolveLogoPath = (logo: string | null) => { if (!logo) { return null; } if (/^(https?:\/\/|data:)/.test(logo)) { return logo; } return logo.startsWith("/") ? logo : `/logos/${logo}`; }; const buildInitials = (value: string) => { const parts = value.trim().split(/\s+/).filter(Boolean); if (parts.length === 0) { return "LC"; } if (parts.length === 1) { const firstPart = parts[0]; return firstPart ? firstPart.slice(0, 2).toUpperCase() : "LC"; } const firstChar = parts[0]?.[0] ?? ""; const secondChar = parts[1]?.[0] ?? ""; return `${firstChar}${secondChar}`.toUpperCase() || "LC"; }; 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) => { const logo = resolveLogoPath(transaction.logo); const initials = buildInitials(transaction.name); return (
  • {logo ? ( {`Logo ) : ( {initials} )}

    {transaction.name}

    {formatTransactionDate(transaction.purchaseDate)}

  • ); })}
)}
); }