"use client"; import { useCallback } from "react"; import { PageLayout, PageHeader } from "@/components/layout"; import { RefreshCw } from "lucide-react"; import { TransactionFilters, TransactionBulkActions, TransactionTable, TransactionPagination, formatCurrency, formatDate, } from "@/components/transactions"; import { RuleCreateDialog } from "@/components/rules"; import { OFXImportDialog } from "@/components/import/ofx-import-dialog"; import { useQueryClient } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { Upload } from "lucide-react"; import { useTransactionsPage } from "@/hooks/use-transactions-page"; import { useTransactionMutations } from "@/hooks/use-transaction-mutations"; import { useTransactionRules } from "@/hooks/use-transaction-rules"; export default function TransactionsPage() { const queryClient = useQueryClient(); // Main page state and logic const { metadata, isLoadingMetadata, searchQuery, setSearchQuery, selectedAccounts, onAccountsChange, selectedCategories, onCategoriesChange, showReconciled, onReconciledChange, period, onPeriodChange, customStartDate, customEndDate, onCustomStartDateChange, onCustomEndDateChange, isCustomDatePickerOpen, onCustomDatePickerOpenChange, showDuplicates, onShowDuplicatesChange, page, pageSize, onPageChange, sortField, sortOrder, onSortChange, selectedTransactions, onToggleSelectAll, onToggleSelectTransaction, clearSelection, transactionsData, isLoadingTransactions, invalidateTransactions, duplicateIds, transactionParams, } = useTransactionsPage(); // Transaction mutations const { toggleReconciled, markReconciled, setCategory, deleteTransaction, bulkReconcile: handleBulkReconcile, bulkSetCategory: handleBulkSetCategory, updatingTransactionIds, } = useTransactionMutations({ transactionParams, transactionsData, }); // Transaction rules const { ruleDialogOpen, setRuleDialogOpen, ruleGroup, handleCreateRule, handleSaveRule, } = useTransactionRules({ transactionsData, metadata, }); const invalidateAll = useCallback(() => { invalidateTransactions(); queryClient.invalidateQueries({ queryKey: ["banking-metadata"] }); }, [invalidateTransactions, queryClient]); const handleBulkReconcileWithClear = useCallback( (reconciled: boolean) => { handleBulkReconcile(reconciled, selectedTransactions); clearSelection(); }, [handleBulkReconcile, selectedTransactions, clearSelection], ); const handleBulkSetCategoryWithClear = useCallback( (categoryId: string | null) => { handleBulkSetCategory(categoryId, selectedTransactions); clearSelection(); }, [handleBulkSetCategory, selectedTransactions, clearSelection], ); const filteredTransactions = transactionsData?.transactions || []; const totalTransactions = transactionsData?.total || 0; const hasMore = transactionsData?.hasMore || false; const uncategorizedCount = transactionsData?.uncategorizedCount || 0; const uncategorizedPercent = totalTransactions > 0 ? Math.round((uncategorizedCount / totalTransactions) * 100) : 0; // For filter comboboxes, we'll use empty arrays for now // They can be enhanced later with separate queries if needed const transactionsForAccountFilter: never[] = []; const transactionsForCategoryFilter: never[] = []; // Early return for loading state - prevents sidebar flash if (isLoadingMetadata || !metadata) { return (
); } return ( 0 ? `${totalTransactions} transaction${totalTransactions > 1 ? "s" : ""} • ${uncategorizedPercent}% non catégorisées` : `${totalTransactions} transaction${totalTransactions > 1 ? "s" : ""}` } actions={ } /> {isLoadingTransactions ? (
) : ( <> )}
); }