import React from 'react'; import { AlertCircle, Receipt, Tag, Plus, Search, X, Save, Sparkles, Zap, RotateCcw } from 'lucide-react'; import { Card, CardHeader, CardTitle, CardContent } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Badge } from '@/components/ui/badge'; import { Input } from '@/components/ui/input'; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription } from '@/components/ui/dialog'; import { Label } from '@/components/ui/label'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { cn } from '@/lib/utils'; import ExcelTable from '../../components/ExcelTable'; import { useToast } from '../../hooks/useToast'; import { formatDate, formatCurrency } from '../../utils/dateUtils'; import { StatementRow } from '../../components/StatementRow'; import { useStatementRefData } from '../../hooks/useStatementRefData'; import { CategorizacaoDialog } from '../../components/CategorizacaoDialog'; export function TransacoesNaoCategorizadasView({ state, actions }) { // IMPORTANTE: Todos os hooks devem ser chamados incondicionalmente no topo // NUNCA colocar hooks após early returns ou condições // Hooks de estado const [searchTerm, setSearchTerm] = React.useState(''); const [transacaoSelecionada, setTransacaoSelecionada] = React.useState(null); const [isDialogOpen, setIsDialogOpen] = React.useState(false); const [isSubmitting, setIsSubmitting] = React.useState(false); // Hook customizado const toast = useToast(); const { getCategoryName, getRuleName } = useStatementRefData(); // Extrair dados do state APÓS todos os hooks const { transacoesNaoCategorizadas = [], caixas = [], categorias = [], isReconciliando = false, progressoReconciliacao = { processados: 0, total: 0 } } = state || {}; // Logs para debug dos dados recebidos React.useEffect(() => { console.log('[TransacoesNaoCategorizadasView] ========== DADOS RECEBIDOS DO STATE =========='); console.log('[TransacoesNaoCategorizadasView] State completo:', state); console.log('[TransacoesNaoCategorizadasView] Categorias recebidas:', { count: categorias?.length || 0, categorias: categorias, isArray: Array.isArray(categorias), firstItem: categorias?.[0] }); console.log('[TransacoesNaoCategorizadasView] Caixas recebidas:', { count: caixas?.length || 0, caixas: caixas, isArray: Array.isArray(caixas), firstItem: caixas?.[0] }); }, [state, categorias, caixas]); // Logs após todos os hooks - removido dependências de objetos para evitar re-renders infinitos React.useEffect(() => { console.log('[TransacoesNaoCategorizadasView] ========== COMPONENTE RENDERIZADO =========='); console.log('[TransacoesNaoCategorizadasView] Estado:', { isDialogOpen, hasTransacaoSelecionada: !!transacaoSelecionada }); }, [isDialogOpen, transacaoSelecionada]); const filteredTransacoes = React.useMemo(() => { if (!transacoesNaoCategorizadas || !Array.isArray(transacoesNaoCategorizadas)) { return []; } return transacoesNaoCategorizadas.filter(t => (t.descricao || '').toLowerCase().includes((searchTerm || '').toLowerCase()) || (t.id || '').toString().includes(searchTerm || '') ); }, [transacoesNaoCategorizadas, searchTerm]); // Filtrar categorias pelo tipo da transação: CRÉDITO → apenas entrada, DÉBITO → apenas saída const categoriasFiltradasPorTipo = React.useMemo(() => { if (!categorias || !Array.isArray(categorias)) return []; const tipoTransacao = transacaoSelecionada?.tipo?.toUpperCase?.(); const tipoCategoriaDesejado = tipoTransacao === 'CREDITO' ? 'entrada' : 'saida'; return categorias.filter(cat => { const tipoCat = (cat?.tipo ?? cat?.tipoMovimento ?? '').toString().toLowerCase(); return tipoCat === tipoCategoriaDesejado; }); }, [categorias, transacaoSelecionada?.tipo]); const handleAbrirDialog = (transacao) => { setTransacaoSelecionada(transacao); setIsDialogOpen(true); }; return (

Pendentes {filteredTransacoes.length} TRANSAÇÕES

Transações que precisam de categorização

setSearchTerm(e.target.value)} className="bg-white dark:bg-slate-900/80 border-slate-200 dark:border-slate-700 pl-9 h-9 text-xs text-slate-900 dark:text-white placeholder:text-slate-400 dark:placeholder:text-slate-600 focus:border-amber-500/50 rounded-lg w-full sm:w-96" />
{/* */}
{filteredTransacoes.length > 0 ? ( filteredTransacoes.map((row, index) => ( handleAbrirDialog(row)} showCategory={true} showStatus={false} showBeneficiary={true} className="cursor-pointer hover:bg-slate-50 dark:hover:bg-slate-800/10" /> )) ) : (

Nenhuma transação pendente encontrada

)}
); };