1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2391],{71759:(e,r,a)=>{"use strict";a.d(r,{KT:()=>m});var i=a(5671),t=a.n(i),l=a(62277);function s(e){return e.toLowerCase().trim().replace(/[_\s-]/g,"")}function o(e,r){let a=e.map(s);for(let e of r){let r=s(e),i=a.indexOf(r);if(-1!==i)return i}return -1}async function n(e){return new Promise((r,a)=>{t().parse(e,{header:!0,skipEmptyLines:!0,complete:e=>{try{let i=e.meta.fields||[],t=o(i,["email","e-mail","correo","mail","emailaddress"]),l=o(i,["firstname","first_name","nombre","name","fname"]),s=o(i,["lastname","last_name","apellido","surname","lname"]),n=o(i,["title","titulo","profiletitle","profile_title","displayname","display_name"]),c=o(i,["as","alias","nombre_template","template_name"]),m=o(i,["profile","profileurl","profile_url","profileurl","url","link","perfil","enlace","profilelink","profile_link"]),d=o(i,["platform","plataforma","red_social","social_network"]),p=o(i,["contacttype","contact_type","tipo","tipo_contacto","type"]),f=o(i,["bio","snippet","description","descripcion","biografia","biography"]);if(-1===t)return void a(Error("No se encontr\xf3 columna de email. Buscando: email, e-mail, correo, mail"));let h=e.data.filter(e=>{let r=e[i[t]];return r&&r.toString().trim()}).map(e=>{let r={email:String(e[i[t]]||"").trim()};if(-1!==l){let a=String(e[i[l]]||"").trim();a&&(r.firstName=a)}if(-1!==s){let a=String(e[i[s]]||"").trim();a&&(r.lastName=a)}if(-1!==c){let a=String(e[i[c]]||"").trim();a&&(r.as=a)}if(-1!==m){let a=String(e[i[m]]||"").trim();a&&(r.profileUrl=a)}if(!r.firstName&&-1!==n){let a=String(e[i[n]]||"").trim();if(a){let e=a.replace(/@\w+/g,"").replace(/\([^)]*\)/g,"").trim();e&&(r.firstName=e)}}if(-1!==d){let a=String(e[i[d]]||"").trim().toLowerCase();"tiktok"===a?r.platform="tiktok":"instagram"===a||"ig"===a?r.platform="instagram":("linkedin"===a||"linkedIn"===a||"ln"===a)&&(r.platform="linkedin")}if(-1!==p){let a=String(e[i[p]]||"").trim().toLowerCase();"company"===a||"brand"===a||"empresa"===a||"marca"===a?r.contactType="company":("creator"===a||"creador"===a)&&(r.contactType="creator")}if(-1!==n){let a=String(e[i[n]]||"").trim();a&&(r.profileTitle=a)}if(-1!==f){let a=String(e[i[f]]||"").trim();a&&(r.bio=a)}return r});r(h)}catch(e){a(e)}},error:e=>{a(Error(`Error al parsear CSV: ${e.message}`))}})})}async function c(e){return new Promise((r,a)=>{let i=new FileReader;i.onload=e=>{try{let i=new Uint8Array(e.target?.result),t=l.LF(i,{type:"array"}),s=t.SheetNames[0];if(!s)return void a(Error("El archivo Excel no contiene hojas"));let n=t.Sheets[s],c=l.Wp.sheet_to_json(n,{header:1});if(c.length<2)return void a(Error("El archivo Excel debe tener al menos una fila de datos adem\xe1s del encabezado"));let m=c[0].map(e=>String(e||"").trim()),d=o(m,["email","e-mail","correo","mail","emailaddress"]),p=o(m,["firstname","first_name","nombre","name","fname"]),f=o(m,["lastname","last_name","apellido","surname","lname"]),h=o(m,["as","alias","nombre_template","template_name"]),u=o(m,["profile","profileurl","profile_url","url","link","perfil","enlace"]),x=o(m,["platform","plataforma","red_social","social_network"]),g=o(m,["contacttype","contact_type","tipo","tipo_contacto","type"]),j=o(m,["title","titulo","profiletitle","profile_title","displayname","display_name"]),b=o(m,["bio","snippet","description","descripcion","biografia","biography"]);if(-1===d)return void a(Error("No se encontr\xf3 columna de email. Buscando: email, e-mail, correo, mail"));let N=c.slice(1).filter(e=>{let r=e[d];return r&&r.toString().trim()}).map(e=>{let r={email:String(e[d]||"").trim()};if(-1!==p){let a=String(e[p]||"").trim();a&&(r.firstName=a)}if(-1!==f){let a=String(e[f]||"").trim();a&&(r.lastName=a)}if(-1!==h){let a=String(e[h]||"").trim();a&&(r.as=a)}if(-1!==u){let a=String(e[u]||"").trim();a&&(r.profileUrl=a)}if(!r.firstName&&-1!==j){let a=String(e[j]||"").trim();if(a){let e=a.replace(/@\w+/g,"").replace(/\([^)]*\)/g,"").trim();e&&(r.firstName=e)}}if(-1!==x){let a=String(e[x]||"").trim().toLowerCase();"tiktok"===a?r.platform="tiktok":"instagram"===a||"ig"===a?r.platform="instagram":("linkedin"===a||"linkedIn"===a||"ln"===a)&&(r.platform="linkedin")}if(-1!==g){let a=String(e[g]||"").trim().toLowerCase();"company"===a||"brand"===a||"empresa"===a||"marca"===a?r.contactType="company":("creator"===a||"creador"===a)&&(r.contactType="creator")}if(-1!==j){let a=String(e[j]||"").trim();a&&(r.profileTitle=a)}if(-1!==b){let a=String(e[b]||"").trim();a&&(r.bio=a)}return r});r(N)}
1catch(e){a(e instanceof Error?e:Error("Error al parsear archivo Excel"))}},i.onerror=()=>{a(Error("Error al leer el archivo Excel"))},i.readAsArrayBuffer(e)})}async function m(e,r={}){let a,i=e.name.toLowerCase(),t=i.split(".").pop()?.toLowerCase();try{if("csv"===t)a=await n(e);else{if("xlsx"!==t&&"xls"!==t)return{isValid:!1,contacts:[],errors:[`Formato de archivo no soportado: ${t}. Se soportan: CSV, XLSX, XLS`]};a=await c(e)}return function(e,r={}){let{requireName:a=!1}=r,i=[],t=[],l=new Set;return e.forEach((e,r)=>{var s;let o=r+2;if(!e.email||!e.email.trim())return void i.push(`Fila ${o}: Email requerido`);if(s=e.email,!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(s.trim()))return void i.push(`Fila ${o}: Email inv\xe1lido: ${e.email}`);if(a&&!(e.firstName??e.lastName??"").trim())return void i.push(`Fila ${o}: Nombre requerido (columna "name")`);let n=e.email.toLowerCase().trim();if(l.has(n))return void i.push(`Fila ${o}: Email duplicado: ${e.email}`);l.add(n),t.push({email:e.email.trim(),firstName:e.firstName?.trim()||void 0,lastName:e.lastName?.trim()||void 0,as:e.as?.trim()||void 0,profileUrl:e.profileUrl?.trim()||void 0,platform:e.platform,profileTitle:e.profileTitle?.trim()||void 0,bio:e.bio?.trim()||void 0,contactType:e.contactType,selected:!0})}),{isValid:0===i.length&&t.length>0,contacts:t,errors:i}}(a,{requireName:r.requireName})}catch(e){return{isValid:!1,contacts:[],errors:[e instanceof Error?e.message:"Error desconocido al parsear el archivo"]}}}},79972:()=>{},84926:(e,r,a)=>{"use strict";a.r(r),a.d(r,{MailingUploadTab:()=>f});var i=a(48205),t=a(23833),l=a(33915),s=a(20042),o=a(71759),n=a(93873),c=a(57024),m=a(98854),d=a(52202);let p=e=>Number(e||0).toLocaleString("es-ES");function f({onGoToTracking:e}){let{user:r}=(0,l.As)(),[a,f]=(0,t.useState)(null),[h,u]=(0,t.useState)([]),[x,g]=(0,t.useState)(!1),[j,b]=(0,t.useState)(!1),[N,v]=(0,t.useState)(null),[y,S]=(0,t.useState)(null),[k,w]=(0,t.useState)(!1),E=(0,t.useCallback)(async e=>{let r=e.target.files?.[0];if(r){f(r),u([]),v(null),g(!0);try{let e=await (0,o.KT)(r);if(!e.isValid){m.oR.warning("Error al parsear archivo",{description:e.errors.join(", ")}),f(null),g(!1);return}if(0===e.contacts.length){m.oR.warning("Archivo vac\xedo",{description:"No se encontraron contactos v\xe1lidos en el archivo"}),f(null),g(!1);return}u(e.contacts),m.oR.success("Archivo cargado",{description:`${e.contacts.length} contactos encontrados`})}catch(e){(0,d.Qg)(e,{message:"Error desconocido",context:"admin/mailing/mailing-upload-tab:fileSelect"}),f(null)}finally{g(!1)}}},[]),C=(0,t.useCallback)(async()=>{if(!h.length||!r)return void m.oR.warning("No hay contactos para subir o no est\xe1s autenticado");b(!0),v(null);try{let e=(0,n.getAuthInstance)();if(!e)throw Error("Error de autenticaci\xf3n");let r=e.currentUser;if(!r)throw Error("Usuario no autenticado");let a=await r.getIdToken(),i=await fetch("/api/admin/upload-manual-contacts",{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${a}`},body:JSON.stringify({contacts:h.map(e=>({email:e.email,firstName:e.firstName,lastName:e.lastName,profileUrl:e.profileUrl,platform:e.platform,profileTitle:e.profileTitle,bio:e.bio}))})});if(!i.ok){let e=await i.json();throw Error(e.error||"Error al subir contactos")}let t=await i.json(),l=h.filter((e,r)=>r<t.success).map(e=>e.email.toLowerCase().trim());v({...t,uploadedEmails:l}),m.oR.success("Contactos subidos",{description:`${t.success} contactos agregados exitosamente${t.failed>0?`, ${t.failed} fallaron`:""}`})}catch(e){(0,d.Qg)(e,{message:"Error desconocido",context:"admin/mailing/mailing-upload-tab:upload"})}finally{b(!1)}},[h,r]);return(0,i.jsx)("div",{className:"ml-stack",children:(0,i.jsxs)("div",{className:"ml-card",children:[(0,i.jsxs)("div",{className:"ml-card-head",children:[(0,i.jsx)("h2",{children:"Subir contactos de scraping manual"}),(0,i.jsx)("p",{className:"ml-card-sub",children:"Sube un archivo CSV o Excel con contactos que recibieron emails de forma manual. Se agregar\xe1n a la base de datos de email tracking. El historial indicar\xe1 que el primer contacto fue manual (sin registros previos)."})]}),(0,i.jsxs)("div",{className:"ml-stack",children:[(0,i.jsx)("div",{className:"ml-note",children:(0,i.jsxs)("span",{style:{minWidth:0},children:[(0,i.jsx)("b",{children:"Formato del archivo"}),(0,i.jsxs)("ul",{children:[(0,i.jsxs)("li",{children:["El archivo debe contener al menos una columna ",(0,i.jsx)("b",{children:"email"})]}),(0,i.jsxs)("li",{children:["Columnas opcionales: ",(0,i.jsx)("b",{children:"firstName"}),", ",(0,i.jsx)("b",{children:"lastName"}),", ",(0,i.jsx)("b",{children:"profile"})," (o ",(0,i.jsx)("b",{children:"profileUrl"}),"), ",(0,i.jsx)("b",{children:"platform"})]}),(0,i.jsx)("li",{children:"Formatos soportados: CSV, XLSX, XLS \xb7 los emails se normalizan autom\xe1ticamente (lowercase)"}),(0,i.jsxs)("li",{children:[(0,i.jsx)("b",{children:"Platform"}),': acepta "tiktok", "TikTok", "instagram", "IG", etc. (cualquier variaci\xf3n de may\xfasculas/min\xfasculas)']}),(0,i.jsxs)("li",{children:[(0,i.jsx)("b",{children:"Profile URL"}),": debe ser una URL completa v\xe1lida â ej. ",(0,i.jsx)("code",{children:"https://www.tiktok.com/@username"})," o ",(0,i.jsx)("code",{children:"https://www.instagram.com/username"})]})]})]})}),(0,i.jsxs)("div",{children:[(0,i.jsx)("input",{type:"file",id:"ml-manual-file",accept:".csv,.xlsx,.xls",onChange:E,style:{display:"none"},disabled:x||j}),(0,i.jsxs)("label",{htmlFor:"ml-manual-file",className:`ml-drop${x||j?" busy":""}`,children:[(0,i.jsx)("span",{className:"ml-drop-ico",children:(0,i.jsx)(s.Pi,{})}),(0,i.jsx)("b",{children:x?"Procesando archivoâ¦":a?a.name:"Haz clic para seleccionar un archivo"}),(0,i.jsx)("p",{children:"CSV, XLSX o XLS. Columna requerida: email."})]})]}),!x&&0===h.length&&a&&(0,i.jsxs)("div",{className:"ml-err",children:[(0,i.jsx)("b",{children:"No se encontraron contactos v\xe1lidos en el archivo."}),' Verifica que el archivo tenga al menos una columna "email".']}),h.length>0&&!x&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)("div",{className:"ml-row between",children:[(0,i.jsxs)("div",{children:[(0,i.jsxs)("div",{style:{fontWeight:600,fontSize:13},children:[p(h.length)," contacto",1!==h.length?"s":""," encontrado",1!==h.length?"s":""]}),(0,i.jsx)("span",{className:"ml-hint",children:"Revisa la vista previa antes de subir."})]}),(0,i.jsxs)("button",{type:"button",className:"btn-create sm",onClick:C,disabled:j,children:[(0,i.jsx)(s.Pi,{})," ",j?"Subiendoâ¦":"Subir a Base de Datos"]})]}),(0,i.jsxs)("div",{className:"ml-tablewrap scroll",children:[(0,i.jsxs)("table",{className:"ml-table",children:[(0,i.jsx)("thead",{children:(0,i.jsxs)("tr",{children:[(0,i.jsx)("th",{children:"Email"}),(0,i.jsx)("th",{children:"Nombre"}),(0,i.jsx)("th",{children:"Apellido"}),(0,i.jsx)("th",{children:"Plataforma"}),(0,i.jsx)("th",{children:"Perfil"})]})}),(0,i.jsx)("tbody",{children:h.slice(0,50).map((e,r)=>(0,i.jsxs)("tr",{children:[(0,i.jsx)("td",{children:e.email}),(0,i.jsx)("td",{children:e.firstName||"-"}),(0,i.jsx)("td",{children:e.lastName||"-"}),(0,i.jsx)("td",{children:e.platform?(0,i.jsx)("span",{className:"st st-draft",children:"tiktok"===e.platform?"TikTok":"Instagram"}):"-"}),(0,i.jsx)("td",{children:e.profileUrl?(0,i.jsx)("a",{href:e.profileUrl,target:"_blank",rel:"noopener noreferrer",style:{fontSize:11.5,display:"block",maxWidth:240,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap"},children:e.profileUrl}):"-"})]},r))})]}),h.length>50&&(0,i.jsxs)("div",{className:"ml-table-foot",children:["Mostrando primeros 50 de ",p(h.length)," contactos"]})]})]}),N&&(0,i.jsxs)("div",{className:"ml-stack",style:{gap:12},children:[(0,i.jsxs)("div",{className:"ml-row between",children:[(0,i.jsx)("span",{className:"ml-row",style:{gap:8,fontWeight:600,fontSize:13},children:0===N.failed?(0,i.jsxs)("span",{className:"st st-done",children:[(0,i.jsx)(s.yt,{})," Resultado de la subida"]}):(0,i.jsx)("span",{className:"st st-review",children:"Resultado de la subida"})}),(0,i.jsxs)("button",{type:"button",className:"btn-soft",onClick:e,children:[(0,i.jsx)(s.tg,{})," Ver en Email Tracking"]})]}),(0,i.jsxs)("div",{className:0===N.failed?"ml-ok":"ml-err",children:["â ",N.success," contacto",1!==N.success?"s":""," agregado",1!==N.success?"s":""," exitosamente",N.failed>0&&(0,i.jsxs)(i.Fragment,{children:[" \xb7 â ",N.failed," contacto",1!==N.failed?"s":""," fallaron"]}),N.errors.length>0&&(0,i.jsxs)("pre",{children:[N.errors.slice(0,5).map(e=>`⢠${e}`).join("\n"),N.errors.length>5?` 2⦠y ${N.errors.length-5} error${N.errors.length-5!=1?"es":""} m\xe1s`:""]})]}),N.uploadedEmails&&N.uploadedEmails.length>0&&(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("div",{style:{fontWeight:600,fontSize:13},children:"Contactos subidos exitosamente:"}),(0,i.jsxs)("div",{className:"ml-tablewrap scroll",children:[(0,i.jsxs)("table",{className:"ml-table",children:[(0,i.jsx)("thead",{children:(0,i.jsxs)("tr",{children:[(0,i.jsx)("th",{children:"Email"}),(0,i.jsx)("th",{children:"Nombre"}),(0,i.jsx)("th",{children:"Plataforma"}),(0,i.jsx)("th",{children:"Perfil"}),(0,i.jsx)("th",{className:"ctr",children:"Acci\xf3n"})]})}),(0,i.jsx)("tbody",{children:h.filter(e=>N.uploadedEmails?.includes(e.email.toLowerCase().trim())).slice(0,20).map((e,r)=>(0,i.jsxs)("tr",{children:[(0,i.jsx)("td",{children:e.email}),(0,i.jsx)("td",{children:e.firstName||e.lastName?`${e.firstName||""} ${e.lastName||""}`.trim():"-"}),(0,i.jsx)("td",{children:e.platform?(0,i.jsx)("span",{className:"st st-draft",children:"tiktok"===e.platform?"TikTok":"Instagram"}):"-"}),(0,i.jsx)("td",{children:e.profileUrl?(0,i.jsx)("a",{href:e.profileUrl,target:"_blank",rel:"noopener noreferrer",style:{fontSize:11.5},children:"Ver perfil"}):"-"}),(0,i.jsx)("td",{className:"ctr",children:(0,i.jsx)("button",{type:"button",className:"iconbtn",title:"Ver historial",onClick:()=>{S(e.email.toLowerCase().trim()),w(!0)},children:(0,i.jsx)(s.j6,{})})})]},r))})]}),N.uploadedEmails.length>20&&(0,i.jsxs)("div",{className:"ml-table-foot",children:["Mostrando primeros 20 de ",p(N.uploadedEmails.length)," contactos \xb7"," ",(0,i.jsx)("a",{href:"#",onClick:r=>{r.preventDefault(),e()},style:{color:"var(--link)"},children:"Ver todos en Email Tracking"})]})]})]})]}),y&&(0,i.jsx)(c.y,{isOpen:k,onClose:()=>{w(!1),S(null)},email:y,contactName:h.find(e=>e.email.toLowerCase().trim()===y)?.firstName||h.find(e=>e.email.toLowerCase().trim()===y)?.lastName||void 0})]})]})})}},97615:()=>{}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.