import { useState, useRef } from "react"; import { useExpensesContext } from "../ExpensesProvider"; import { PeriodicExpensesTable } from "./PeriodicExpensesTable"; import { PeriodicExpenseForm } from "./PeriodicExpenseForm"; import { GenerateCurrentMonthDialog } from "./GenerateCurrentMonthDialog"; import { ResponsiveDialog, ResponsiveDialogContent, ResponsiveDialogHeader, ResponsiveDialogTitle, ResponsiveDialogDescription, } from "@/components/ui/responsive-dialog"; import { Button } from "@/components/ui/button"; import { Plus, Upload } from "lucide-react"; import type { PeriodicExpense, ImportResult } from "@/lib/api"; export function PeriodicExpensesTabContent() { const { periodicExpenses, isLoadingPeriodic, createPeriodicExpense, updatePeriodicExpense, deletePeriodicExpense, generateMonthlyExpense, importPeriodicExpenses, } = useExpensesContext(); const [dialogOpen, setDialogOpen] = useState(false); const [editingItem, setEditingItem] = useState(null); const [generateDialog, setGenerateDialog] = useState<{ open: boolean; description: string; periodicExpenseId: number; }>({ open: false, description: "", periodicExpenseId: 0 }); const [importDialogOpen, setImportDialogOpen] = useState(false); const [importing, setImporting] = useState(false); const [importResult, setImportResult] = useState(null); const fileInputRef = useRef(null); function openCreate() { setEditingItem(null); setDialogOpen(true); } function openEdit(item: PeriodicExpense) { setEditingItem(item); setDialogOpen(true); } function closeDialog() { setDialogOpen(false); setEditingItem(null); } async function handleSubmit(data: { description: string; defaultDueDay: number; defaultAmount: number; periods: number[] }) { if (editingItem) { await updatePeriodicExpense(editingItem.id, data); } else { const numericData = { description: data.description, defaultDueDay: data.defaultDueDay, defaultAmount: data.defaultAmount, periods: data.periods, }; const result = await createPeriodicExpense(numericData); if (result.currentMonthApplicable) { setGenerateDialog({ open: true, description: result.description, periodicExpenseId: result.id, }); } } closeDialog(); } async function handleConfirmGenerate() { await generateMonthlyExpense(generateDialog.periodicExpenseId); setGenerateDialog({ open: false, description: "", periodicExpenseId: 0 }); } function handleSkipGenerate() { setGenerateDialog({ open: false, description: "", periodicExpenseId: 0 }); } async function handleDelete(id: number) { if (confirm("¿Eliminar este gasto periódico?")) { await deletePeriodicExpense(id); } } return (

Administrá tus gastos recurrentes.

{isLoadingPeriodic ? (

Cargando...

) : ( )} {editingItem ? "Editar gasto periódico" : "Nuevo gasto periódico"} setGenerateDialog((prev) => ({ ...prev, open }))} description={generateDialog.description} onConfirm={handleConfirmGenerate} onSkip={handleSkipGenerate} /> { setImportDialogOpen(open); if (!open) { setImportResult(null); } }}> Importar gastos periódicos Seleccioná un archivo CSV (delimitado por pipes) para importar gastos periódicos. {importResult ? (

Importación completada

  • Importados: {importResult.imported}
  • Omitidos (sin períodos): {importResult.skippedNoPeriods}
  • Omitidos (duplicados): {importResult.skippedDuplicate}
{importResult.errors && importResult.errors.length > 0 && (

Errores:

    {importResult.errors.map((err, i) => (
  • {err}
  • ))}
)}
) : (
)}
); }