import { useState } from "react"; import { Plus } from "lucide-react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/Card"; import { Button } from "@/components/ui/Button"; import { CategoryFormModal } from "@/components/categories/CategoryFormModal"; import { CategoryList } from "@/components/categories/CategoryList"; import { useCategories, useDeleteCategory } from "@/hooks/useCategories"; import { useTranslation } from "@/lib/i18n"; import type { Category, CategoryKind } from "@/types"; export function CategoriesPage() { const { t } = useTranslation(); const { data: categories, isLoading } = useCategories(); const deleteCategory = useDeleteCategory(); const [modalOpen, setModalOpen] = useState(false); const [editingCategory, setEditingCategory] = useState(null); const [modalKind, setModalKind] = useState("expense"); function openCreateModal(kind: CategoryKind) { setEditingCategory(null); setModalKind(kind); setModalOpen(true); } function openEditModal(category: Category) { setEditingCategory(category); setModalKind(category.kind); setModalOpen(true); } function handleDelete(category: Category) { // Default categories are protected server-side too (400) — the list // already disables the delete button for them, this is just a guard. if (category.is_default) return; if (window.confirm(t("category.confirmDelete", { name: category.name }))) { deleteCategory.mutate(category.id); } } const expenseCategories = (categories ?? []).filter((category) => category.kind === "expense"); const incomeCategories = (categories ?? []).filter((category) => category.kind === "income"); return (
{t("category.expenseSectionTitle")} {isLoading ? (

{t("common.loading")}

) : ( )}
{t("category.incomeSectionTitle")} {isLoading ? (

{t("common.loading")}

) : ( )}
setModalOpen(false)} category={editingCategory} defaultKind={modalKind} />
); }