"use client"; import { deleteBudgetAction, duplicatePreviousMonthBudgetsAction, } from "@/app/(dashboard)/orcamentos/actions"; import { ConfirmActionDialog } from "@/components/confirm-action-dialog"; import { EmptyState } from "@/components/empty-state"; import { Button } from "@/components/ui/button"; import { RiAddCircleLine, RiFileCopyLine, RiFundsLine } from "@remixicon/react"; import { useCallback, useState } from "react"; import { toast } from "sonner"; import { Card } from "../ui/card"; import { BudgetCard } from "./budget-card"; import { BudgetDialog } from "./budget-dialog"; import type { Budget, BudgetCategory } from "./types"; interface BudgetsPageProps { budgets: Budget[]; categories: BudgetCategory[]; selectedPeriod: string; periodLabel: string; } export function BudgetsPage({ budgets, categories, selectedPeriod, periodLabel, }: BudgetsPageProps) { const [editOpen, setEditOpen] = useState(false); const [selectedBudget, setSelectedBudget] = useState(null); const [removeOpen, setRemoveOpen] = useState(false); const [budgetToRemove, setBudgetToRemove] = useState(null); const [duplicateOpen, setDuplicateOpen] = useState(false); const hasBudgets = budgets.length > 0; const handleEdit = useCallback((budget: Budget) => { setSelectedBudget(budget); setEditOpen(true); }, []); const handleEditOpenChange = useCallback((open: boolean) => { setEditOpen(open); if (!open) { setSelectedBudget(null); } }, []); const handleRemoveRequest = useCallback((budget: Budget) => { setBudgetToRemove(budget); setRemoveOpen(true); }, []); const handleRemoveOpenChange = useCallback((open: boolean) => { setRemoveOpen(open); if (!open) { setBudgetToRemove(null); } }, []); const handleRemoveConfirm = useCallback(async () => { if (!budgetToRemove) { return; } const result = await deleteBudgetAction({ id: budgetToRemove.id }); if (result.success) { toast.success(result.message); return; } toast.error(result.error); throw new Error(result.error); }, [budgetToRemove]); const handleDuplicateConfirm = useCallback(async () => { const result = await duplicatePreviousMonthBudgetsAction({ period: selectedPeriod, }); if (result.success) { toast.success(result.message); setDuplicateOpen(false); return; } toast.error(result.error); throw new Error(result.error); }, [selectedPeriod]); const removeTitle = budgetToRemove ? `Remover orçamento de "${ budgetToRemove.category?.name ?? "categoria removida" }"?` : "Remover orçamento?"; const emptyDescription = categories.length === 0 ? "Cadastre uma categoria de despesa para começar a planejar seus gastos." : "Crie seu primeiro orçamento para controlar os gastos por categoria."; return ( <>
Novo orçamento } />
{hasBudgets ? (
{budgets.map((budget) => ( ))}
) : ( } title="Nenhum orçamento cadastrado" description={emptyDescription} /> )}
); }