import { useState } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Plus, Wallet } from 'lucide-react' import { getPiggyBanks, getCategories, createCategory, createPiggyBank, createTransaction, deletePiggyBank } from './lib/api' import type { PiggyBank } from './types' import { Button } from './components/ui/button' import { Dialog } from './components/ui/dialog' import { Input } from './components/ui/input' import { PiggyBankCard } from './components/PiggyBankCard' import { PiggyBankForm } from './components/PiggyBankForm' import { AddMoneyDialog } from './components/AddMoneyDialog' import { TransactionHistory } from './components/TransactionHistory' export default function App() { const queryClient = useQueryClient() const [showForm, setShowForm] = useState(false) const [showCatForm, setShowCatForm] = useState(false) const [catName, setCatName] = useState('') const [selectedBank, setSelectedBank] = useState(null) const { data: banks = [] } = useQuery({ queryKey: ['piggy-banks'], queryFn: getPiggyBanks, }) const { data: categories = [] } = useQuery({ queryKey: ['categories'], queryFn: getCategories, }) const createBank = useMutation({ mutationFn: createPiggyBank, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['piggy-banks'] }) setShowForm(false) }, }) const addCategory = useMutation({ mutationFn: (name: string) => createCategory(name), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['categories'] }) setShowCatForm(false) setCatName('') }, }) const addMoney = useMutation({ mutationFn: ({ bankId, amount, description }: { bankId: number; amount: number; description?: string }) => createTransaction(bankId, { amount, description }), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['piggy-banks'] }) queryClient.invalidateQueries({ queryKey: ['transactions'] }) }, }) const removeBank = useMutation({ mutationFn: deletePiggyBank, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['piggy-banks'] }) }, }) const totalSaved = banks.reduce((sum, b) => sum + b.current_amount, 0) const totalTarget = banks.reduce((sum, b) => sum + b.target_amount, 0) return (
{/* Header */}

Копилка

Сервис для накоплений

{/* Summary */} {banks.length > 0 && (

Копилок

{banks.length}

Накоплено

${totalSaved.toFixed(2)}

Цель

${totalTarget.toFixed(2)}

)} {/* Piggy Banks Grid */}
{banks.map((bank) => (
removeBank.mutate(id)} />
))}
{banks.length === 0 && (

Ещё нет ни одной копилки

Создайте первую копилку и начните копить!

)} {/* Create Piggy Bank Dialog */} createBank.mutateAsync(data)} onCancel={() => setShowForm(false)} /> {/* Add Money Dialog */} { if (!open) setSelectedBank(null) }} onSubmit={(bankId, amount, description) => addMoney.mutateAsync({ bankId, amount, description }) } /> {/* Create Category Dialog */}
{ e.preventDefault() if (catName.trim()) addCategory.mutate(catName.trim()) }} className="space-y-4" > setCatName(e.target.value)} required />
) }