"use client"; import { useCallback, useState } from "react"; import { PageLayout, PageHeader } from "@/components/layout"; import { RefreshCw, Maximize2, Minimize2 } 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 { MonthlyChart } from "@/components/statistics"; import { useQueryClient } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { Upload } from "lucide-react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { useTransactionsPage } from "@/hooks/use-transactions-page"; import { useTransactionMutations } from "@/hooks/use-transaction-mutations"; import { useTransactionRules } from "@/hooks/use-transaction-rules"; import { useTransactionsChartData } from "@/hooks/use-transactions-chart-data"; export default function TransactionsPage() { const queryClient = useQueryClient(); const [isFullscreen, setIsFullscreen] = useState(false); // 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, }); // Chart data const { monthlyData, isLoading: isLoadingChart } = useTransactionsChartData({ selectedAccounts, selectedCategories, period, customStartDate, customEndDate, showReconciled, searchQuery, }); 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={ } /> {!isLoadingChart && monthlyData.length > 0 && (
)} {isLoadingTransactions ? (
) : ( <>
)}
Transactions
); }