/* global React */ const { useState, useEffect, useMemo } = React; // ===================================================================== // MODAL DE SELEÇÃO DE ITENS DO XML // ===================================================================== // Props: // open — boolean // parsed — resultado de parseXmlNFe (com itens, totalNF, etc) // onCancel — fechar sem aplicar // onConfirm — recebe { selecao, parsed, grupos } da seleção // ===================================================================== function XmlSelectModal({ open, parsed, onCancel, onConfirm }) { // grupos derivados dos itens const grupos = useMemo(() => { if (!parsed || !parsed.ok) return []; return window.agruparItensXml(parsed.itens); }, [parsed]); // índices dos grupos selecionados const [selecionados, setSelecionados] = useState(new Set()); // Quando o modal abre, selecionar todos por padrão useEffect(() => { if (open && grupos.length > 0) { setSelecionados(new Set(grupos.map((_, i) => i))); } }, [open, grupos]); if (!open || !parsed || !parsed.ok) return null; const toggleItem = (idx) => { setSelecionados(prev => { const next = new Set(prev); if (next.has(idx)) next.delete(idx); else next.add(idx); return next; }); }; const selecionarTodos = () => setSelecionados(new Set(grupos.map((_, i) => i))); const limparSelecao = () => setSelecionados(new Set()); // Calcula totais com base na seleção atual const gruposSel = grupos.filter((_, i) => selecionados.has(i)); const totais = gruposSel.length > 0 ? window.calcularSelecaoXml(gruposSel, parsed) : null; const confirmar = () => { if (gruposSel.length === 0) return; onConfirm({ selecao: totais, parsed, grupos: gruposSel }); }; const brl = window.brl; const intFmt = window.intFmt; return (