'use client'; import { useState } from 'react'; import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; import { Button } from '@/components/ui/button'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '@/components/ui/table'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { loanApi, Loan, LoanInput } from '@/lib/api'; export default function LoansPage() { const queryClient = useQueryClient(); const [isAddDialogOpen, setIsAddDialogOpen] = useState(false); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [loanToDelete, setLoanToDelete] = useState(null); const [selectedLoan, setSelectedLoan] = useState(null); // Form state const [loanName, setLoanName] = useState(''); const [originalAmount, setOriginalAmount] = useState(''); const [currentBalance, setCurrentBalance] = useState(''); const [interestRate, setInterestRate] = useState(''); const [startDate, setStartDate] = useState(''); const [endDate, setEndDate] = useState(''); const [formError, setFormError] = useState(''); // Query loans const { data, isLoading, error } = useQuery({ queryKey: ['loans'], queryFn: async () => { const response = await loanApi.getLoans(); console.log('API Response:', response); // Debug the response structure // The response might be the array directly rather than nested under a 'loans' property if (Array.isArray(response)) { return response as Loan[]; } // Or it might be nested under a 'loans' or 'data' property return (response.loans || response.data || []) as Loan[]; } }); // Create loan mutation const createLoanMutation = useMutation({ mutationFn: (loanData: LoanInput) => loanApi.createLoan(loanData), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['loans'] }); resetForm(); setIsAddDialogOpen(false); }, onError: (error: Error) => { setFormError(error.message); } }); // Delete loan mutation const deleteLoanMutation = useMutation({ mutationFn: (id: number) => loanApi.deleteLoan(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['loans'] }); setIsDeleteDialogOpen(false); setLoanToDelete(null); } }); const resetForm = () => { setLoanName(''); setOriginalAmount(''); setCurrentBalance(''); setInterestRate(''); setStartDate(''); setEndDate(''); setFormError(''); setSelectedLoan(null); }; const handleCreateLoan = (e: React.FormEvent) => { e.preventDefault(); setFormError(''); try { // Validate inputs if (!loanName || !originalAmount || !currentBalance || !startDate || !endDate) { setFormError('Please fill in all required fields'); return; } const loanData: LoanInput = { name: loanName, originalAmount: Number(originalAmount) * 100, // Convert to cents currentBalance: Number(currentBalance) * 100, // Convert to cents interestRate: Number(interestRate) || 0, startDate, endDate, }; createLoanMutation.mutate(loanData); } catch (err: any) { setFormError(err.message || 'Error creating loan'); } }; const handleDeleteLoan = (id: number) => { setLoanToDelete(id); setIsDeleteDialogOpen(true); }; const confirmDeleteLoan = () => { if (loanToDelete !== null) { deleteLoanMutation.mutate(loanToDelete); } }; // Format currency (convert cents to dollars) const formatCurrency = (amount: number) => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', }).format(amount / 100); }; // Format date const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString(); }; if (isLoading) { return
Loading loans...
; } if (error) { return
Error loading loans: {error.toString()}
; } return (

Loans

Add New Loan
setLoanName(e.target.value)} required />
setOriginalAmount(e.target.value)} required />
setCurrentBalance(e.target.value)} required />
setInterestRate(e.target.value)} />
setStartDate(e.target.value)} required />
setEndDate(e.target.value)} required />
{formError && (
{formError}
)}
{/* Delete Confirmation Dialog */} Confirm Deletion

Are you sure you want to delete this loan? This action cannot be undone.

{data && data.length > 0 ? ( Your Loans Name Original Amount Current Balance Interest Rate Start Date End Date Actions {data.map((loan) => ( {loan.Name} {formatCurrency(loan.OriginalAmount)} {formatCurrency(loan.CurrentBalance)} {loan.InterestRate}% {formatDate(loan.StartDate)} {formatDate(loan.EndDate)}
))}
) : (

You don't have any loans yet.

)}
); }