@heedb/web-sdk 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/widget.js +5 -5
- package/package.json +1 -1
- package/widget.js +5 -5
package/dist/widget.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/* Heedb Widget v1.0.
|
|
2
|
-
"use strict";(()=>{(function(){var ae,ne,se,oe,ie;let E=document.currentScript||document.querySelector("script[data-api-key]")
|
|
1
|
+
/* Heedb Widget v1.0.4 — https://heedb.com */
|
|
2
|
+
"use strict";(()=>{(function(){var ae,ne,se,oe,ie;let E=document.currentScript||document.querySelector("script[data-api-key]"),C=(ae=E==null?void 0:E.getAttribute("data-api-key"))!=null?ae:"",K=(ne=E==null?void 0:E.src)!=null?ne:"",D=(E==null?void 0:E.getAttribute("data-host"))||(K?new URL(K).origin:"");if(!C){console.warn("[Heedb] Missing data-api-key on <script> tag.");return}let re=1,l={},b=!1,de={primary:"#18181b",text:"#18181b",bg:"#ffffff"},le={primary:"#e4e4e7",text:"#e4e4e7",bg:"#1a1a1a"},B={en:{contactTab:"Message",privacyTab:"Privacy",messagesTab:"Messages",nameLabel:"Name",emailLabel:"Email",messageLabel:"Message",namePlaceholder:"Jane Smith",emailPlaceholder:"jane@example.com",messagePlaceholder:"How can we help?",sendMessage:"Send message",sending:"Sending\u2026",fillAllFields:"Please fill in all fields.",messageSentTitle:"Message sent!",messageSentBody:"We'll get back to you soon. Check your inbox for a confirmation email.",networkError:"Network error. Please try again.",somethingWrong:"Something went wrong.",rateLimited:"Too many messages. Please wait a moment.",requestType:"Request type",deleteData:"Delete my data",accessData:"Access my data",exportData:"Export my data",correctData:"Correct my data",restrictProcessing:"Restrict processing",objectProcessing:"Object to processing",other:"Other",submitRequest:"Submit request",submitting:"Submitting\u2026",requestSubmittedTitle:"Request submitted!",requestSubmittedBody:"Your privacy request has been received. We'll respond within 30 days.",contactUs:"Contact us",feedback:"Feedback",poweredBy:"Powered by Heedb",justNow:"Just now",minutesAgo:"{mins}m ago",hoursAgo:"{hours}h ago",send:"Send",backToMessages:"\u2190 Back to messages",noThreadsAuth:"Send a message below to view your message history.",sendAMessage:"+ Send a message",sendNewMessage:"+ Send a new message",noOpenMessages:"No open messages yet.",loading:"Loading\u2026",failedToLoad:"Failed to load messages.",failedToLoadConvo:"Failed to load conversation.",failedToSend:"Failed to send.",typeReply:"Type a reply\u2026",privacyRequest:"Privacy request",message:"Message"},es:{contactTab:"Mensaje",privacyTab:"Privacidad",messagesTab:"Mensajes",nameLabel:"Nombre",emailLabel:"Correo",messageLabel:"Mensaje",namePlaceholder:"Mar\xEDa Garc\xEDa",emailPlaceholder:"maria@empresa.com",messagePlaceholder:"\xBFC\xF3mo podemos ayudarte?",sendMessage:"Enviar mensaje",sending:"Enviando\u2026",fillAllFields:"Por favor, completa todos los campos.",messageSentTitle:"\xA1Mensaje enviado!",messageSentBody:"Te responderemos pronto. Revisa tu bandeja de entrada para un correo de confirmaci\xF3n.",networkError:"Error de red. Int\xE9ntalo de nuevo.",somethingWrong:"Algo sali\xF3 mal.",rateLimited:"Demasiados mensajes. Espera un momento.",requestType:"Tipo de solicitud",deleteData:"Eliminar mis datos",accessData:"Acceder a mis datos",exportData:"Exportar mis datos",correctData:"Corregir mis datos",restrictProcessing:"Restringir procesamiento",objectProcessing:"Oponerse al procesamiento",other:"Otro",submitRequest:"Enviar solicitud",submitting:"Enviando\u2026",requestSubmittedTitle:"\xA1Solicitud enviada!",requestSubmittedBody:"Tu solicitud de privacidad ha sido recibida. Responderemos en un plazo de 30 d\xEDas.",contactUs:"Cont\xE1ctanos",feedback:"Comentarios",poweredBy:"Impulsado por Heedb",justNow:"Ahora",minutesAgo:"hace {mins}m",hoursAgo:"hace {hours}h",send:"Enviar",backToMessages:"\u2190 Volver a mensajes",noThreadsAuth:"Env\xEDa un mensaje para ver tu historial.",sendAMessage:"+ Enviar un mensaje",sendNewMessage:"+ Enviar un nuevo mensaje",noOpenMessages:"No hay mensajes a\xFAn.",loading:"Cargando\u2026",failedToLoad:"No se pudieron cargar los mensajes.",failedToLoadConvo:"No se pudo cargar la conversaci\xF3n.",failedToSend:"No se pudo enviar.",typeReply:"Escribe una respuesta\u2026",privacyRequest:"Solicitud de privacidad",message:"Mensaje"},pt:{contactTab:"Mensagem",privacyTab:"Privacidade",messagesTab:"Mensagens",nameLabel:"Nome",emailLabel:"Email",messageLabel:"Mensagem",namePlaceholder:"Maria Silva",emailPlaceholder:"maria@empresa.com",messagePlaceholder:"Como podemos ajudar?",sendMessage:"Enviar mensagem",sending:"Enviando\u2026",fillAllFields:"Por favor, preencha todos os campos.",messageSentTitle:"Mensagem enviada!",messageSentBody:"Responderemos em breve. Verifique sua caixa de entrada para um email de confirma\xE7\xE3o.",networkError:"Erro de rede. Tente novamente.",somethingWrong:"Algo deu errado.",rateLimited:"Muitas mensagens. Aguarde um momento.",requestType:"Tipo de solicita\xE7\xE3o",deleteData:"Excluir meus dados",accessData:"Acessar meus dados",exportData:"Exportar meus dados",correctData:"Corrigir meus dados",restrictProcessing:"Restringir processamento",objectProcessing:"Opor-se ao processamento",other:"Outro",submitRequest:"Enviar solicita\xE7\xE3o",submitting:"Enviando\u2026",requestSubmittedTitle:"Solicita\xE7\xE3o enviada!",requestSubmittedBody:"Sua solicita\xE7\xE3o de privacidade foi recebida. Responderemos em at\xE9 30 dias.",contactUs:"Fale conosco",feedback:"Feedback",poweredBy:"Powered by Heedb",justNow:"Agora",minutesAgo:"h\xE1 {mins}m",hoursAgo:"h\xE1 {hours}h",send:"Enviar",backToMessages:"\u2190 Voltar \xE0s mensagens",noThreadsAuth:"Envie uma mensagem para ver seu hist\xF3rico.",sendAMessage:"+ Enviar uma mensagem",sendNewMessage:"+ Enviar uma nova mensagem",noOpenMessages:"Nenhuma mensagem ainda.",loading:"Carregando\u2026",failedToLoad:"N\xE3o foi poss\xEDvel carregar as mensagens.",failedToLoadConvo:"N\xE3o foi poss\xEDvel carregar a conversa.",failedToSend:"N\xE3o foi poss\xEDvel enviar.",typeReply:"Digite uma resposta\u2026",privacyRequest:"Solicita\xE7\xE3o de privacidade",message:"Mensagem"}},R="en";function n(e){var t,a,o;return(o=(a=(t=B[R])==null?void 0:t[e])!=null?a:B.en[e])!=null?o:e}function z(e){if(e)return e[R]||e.en}function J(){var a;let e=E==null?void 0:E.getAttribute("data-lang");if(e&&e in B)return e;if(O&&O in B)return O;if(l.language&&l.language in B)return l.language;let t=(a=document.documentElement.lang)==null?void 0:a.slice(0,2);return t&&t in B?t:"en"}let O;function Y(){return l.mode==="dark"?!0:l.mode==="light"?!1:l.mode==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:!1}function ce(){return b?le:de}function j(e,t){let a=l[e];return a!=null?String(a):t}let S=!1,T="contact",V="",H=(se=localStorage.getItem("heedb_name"))!=null?se:"",x=(oe=localStorage.getItem("heedb_email"))!=null?oe:"",L=(ie=localStorage.getItem("heedb_token"))!=null?ie:"",f=null,N=null;async function pe(e,t){try{let a=await F("/api/threads/token",{api_key:C,email:e,userHash:t});if(a.ok){let o=await a.json();if(o.widgetToken){L=o.widgetToken,localStorage.setItem("heedb_token",o.widgetToken);return}}L="",localStorage.removeItem("heedb_token")}catch(a){L="",localStorage.removeItem("heedb_token")}}window.Heedb={version:"1.0.4",init(e={}){e.lang&&(O=e.lang,R=J(),ee(),S&&f&&M()),e.name&&(H=e.name,localStorage.setItem("heedb_name",e.name)),e.email&&(x=e.email,localStorage.setItem("heedb_email",e.email),e.userHash?pe(e.email,e.userHash).then(()=>{q(),S&&f&&M()}):(q(),S&&f&&M()))},reset(){H="",x="",L="",localStorage.removeItem("heedb_name"),localStorage.removeItem("heedb_email"),localStorage.removeItem("heedb_token"),T="contact",S=!1,f&&(f.style.display="none"),q()}};function F(e,t){return fetch(`${D}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}function me(e){let t=new URL(`${D}/api/threads`);return t.searchParams.set("api_key",C),t.searchParams.set("email",e),L&&t.searchParams.set("token",L),fetch(t.toString()).then(a=>a.json())}function ge(e){let t=new URL(`${D}/api/threads/${e}`);return t.searchParams.set("api_key",C),t.searchParams.set("email",x),t.searchParams.set("token",L),fetch(t.toString()).then(a=>a.json())}function ue(e,t){return F(`/api/threads/${e}/reply`,{api_key:C,email:x,token:L,message:t})}async function he(){var e;try{let t=new URL(`${D}/api/widget-config`);t.searchParams.set("api_key",C),t.searchParams.set("v",String(re));let a=await fetch(t.toString());if(a.ok){let o=await a.json();return be(),(e=o.config)!=null?e:{}}}catch(t){}return{}}function be(){try{fetch(`${D}/api/widget-ping`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({api_key:C}),keepalive:!0})}catch(e){}}function X(){var u,v;let e=ce(),t=j(b?"darkPrimaryColor":"primaryColor",e.primary),a=j(b?"darkTextColor":"textColor",e.text),o=j(b?"darkBgColor":"bgColor",e.bg),i=(u=l.borderRadius)!=null?u:16,r=(v=l.buttonRadius)!=null?v:50,g=l.fontFamily||"system-ui, -apple-system, sans-serif",h=l.position==="bottom-left",p=r>=50?"50%":`${r}px`,m=Math.round(i*.5),c=l.triggerMode==="tag",d=l.triggerMode==="embedded"||c;return`
|
|
3
3
|
.heedb-btn {
|
|
4
4
|
position: fixed; bottom: 24px; ${h?"left: 24px":"right: 24px"}; z-index: 999998;
|
|
5
5
|
width: 52px; height: 52px; border-radius: ${p}; border: none;
|
|
@@ -163,10 +163,10 @@
|
|
|
163
163
|
|
|
164
164
|
/* Body fade transition */
|
|
165
165
|
.heedb-body { transition: opacity .15s ease; }
|
|
166
|
-
`}function s(e,t={},a=[]){let o=document.createElement(e);for(let[i,r]of Object.entries(t))i==="class"?o.className=r:i==="style"?o.setAttribute("style",r):i.startsWith("on")&&typeof r=="function"?o.addEventListener(i.slice(2),r):o.setAttribute(i,String(r));for(let i of a)o.appendChild(typeof i=="string"?document.createTextNode(i):i);return o}function Q(e){let a=new DOMParser().parseFromString(e,"image/svg+xml").querySelector("svg");if(!a)return null;a.querySelectorAll("script,foreignObject,iframe,object,embed").forEach(r=>r.remove());for(let r of Array.from(a.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&a.removeAttribute(r.name);let o=document.createTreeWalker(a,NodeFilter.SHOW_ELEMENT),i;for(;i=o.nextNode();)for(let r of Array.from(i.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&i.removeAttribute(r.name);return a}function W(e,t,a=""){let o=document.createElement("input");return o.type=e,o.id=t,o.placeholder=a,o.className="heedb-input",o}function
|
|
166
|
+
`}function s(e,t={},a=[]){let o=document.createElement(e);for(let[i,r]of Object.entries(t))i==="class"?o.className=r:i==="style"?o.setAttribute("style",r):i.startsWith("on")&&typeof r=="function"?o.addEventListener(i.slice(2),r):o.setAttribute(i,String(r));for(let i of a)o.appendChild(typeof i=="string"?document.createTextNode(i):i);return o}function Q(e){let a=new DOMParser().parseFromString(e,"image/svg+xml").querySelector("svg");if(!a)return null;a.querySelectorAll("script,foreignObject,iframe,object,embed").forEach(r=>r.remove());for(let r of Array.from(a.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&a.removeAttribute(r.name);let o=document.createTreeWalker(a,NodeFilter.SHOW_ELEMENT),i;for(;i=o.nextNode();)for(let r of Array.from(i.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&i.removeAttribute(r.name);return a}function W(e,t,a=""){let o=document.createElement("input");return o.type=e,o.id=t,o.placeholder=a,o.className="heedb-input",o}function fe(e,t=""){let a=document.createElement("textarea");return a.id=e,a.placeholder=t,a.className="heedb-textarea",a}function ye(e,t){let a=document.createElement("select");a.id=e,a.className="heedb-select";for(let o of t){let i=document.createElement("option");i.value=o.value,i.textContent=o.label,a.appendChild(i)}return a}function M(){if(!f)return;let e=f.querySelector(".heedb-body");e.innerHTML="",T==="contact"?xe(e):T==="privacy"?ve(e):T==="threads"?Te(e):T==="thread-detail"&&ke(e),$&&($.style.display=T==="thread-detail"?"none":"flex")}function xe(e,t=""){let a=!!(H&&x),o=s("label",{class:"heedb-label"},[n("nameLabel")]),i=W("text","heedb-name",n("namePlaceholder"));H&&(i.value=H);let r=s("label",{class:"heedb-label"},[n("emailLabel")]),g=W("email","heedb-email",n("emailPlaceholder"));(t||x)&&(g.value=t||x);let h=z(l.messageLabel),p=h?s("label",{class:"heedb-label"},[h]):null,m=fe("heedb-message",z(l.messagePlaceholder)||n("messagePlaceholder")),c=s("div",{class:"heedb-error",style:"display:none"}),d=s("button",{class:"heedb-btn-submit"},[n("sendMessage")]);d.onclick=async()=>{var w;let u=i.value.trim(),v=g.value.trim(),y=m.value.trim();if(c.style.display="none",!u||!v||!y){c.textContent=n("fillAllFields"),c.style.display="block";return}d.disabled=!0,d.textContent=n("sending");try{let k=await F("/api/contact",{api_key:C,name:u,email:v,message:y,lang:R});if(k.ok)x=v,localStorage.setItem("heedb_email",v),q(),Z(e,n("messageSentTitle"),n("messageSentBody"));else if(k.status===429){let P=parseInt((w=k.headers.get("Retry-After"))!=null?w:"60",10);c.textContent=n("rateLimited"),c.style.display="block",d.textContent=n("sendMessage"),setTimeout(()=>{d.disabled=!1,c.style.display="none"},P*1e3)}else{let P=await k.json();c.textContent=P.error||n("somethingWrong"),c.style.display="block",d.disabled=!1,d.textContent=n("sendMessage")}}catch(k){c.textContent=n("networkError"),c.style.display="block",d.disabled=!1,d.textContent=n("sendMessage")}},a?(p&&e.append(p),e.append(m,c,d)):(e.append(o,i,r,g),p&&e.append(p),e.append(m,c,d))}function ve(e){let t=!!(H&&x),a=s("label",{class:"heedb-label"},[n("nameLabel")]),o=W("text","heedb-priv-name",n("namePlaceholder"));H&&(o.value=H);let i=s("label",{class:"heedb-label"},[n("emailLabel")]),r=W("email","heedb-priv-email",n("emailPlaceholder"));x&&(r.value=x);let g=s("label",{class:"heedb-label"},[n("requestType")]),h=ye("heedb-priv-type",[{value:"deletion",label:n("deleteData")},{value:"access",label:n("accessData")},{value:"portability",label:n("exportData")}]),p=s("div",{class:"heedb-error",style:"display:none"}),m=s("button",{class:"heedb-btn-submit"},[n("submitRequest")]);m.onclick=async()=>{var v;let c=o.value.trim(),d=r.value.trim(),u=h.value;if(p.style.display="none",!c||!d){p.textContent=n("fillAllFields"),p.style.display="block";return}m.disabled=!0,m.textContent=n("submitting");try{let y=await F("/api/privacy-request",{api_key:C,name:c,email:d,request_type:u,lang:R});if(y.ok)x=d,localStorage.setItem("heedb_email",d),q(),Z(e,n("requestSubmittedTitle"),n("requestSubmittedBody"));else if(y.status===429){let w=parseInt((v=y.headers.get("Retry-After"))!=null?v:"60",10);p.textContent=n("rateLimited"),p.style.display="block",m.textContent=n("submitRequest"),setTimeout(()=>{m.disabled=!1,p.style.display="none"},w*1e3)}else{let w=await y.json();p.textContent=w.error||n("somethingWrong"),p.style.display="block",m.disabled=!1,m.textContent=n("submitRequest")}}catch(y){p.textContent=n("networkError"),p.style.display="block",m.disabled=!1,m.textContent=n("submitRequest")}},t?e.append(g,h,p,m):e.append(a,o,i,r,g,h,p,m)}async function Te(e){var t;if(!L){e.innerHTML="";let a=s("p",{style:"color:#71717a;text-align:center;margin:8px 0;font-size:13px;line-height:1.5"},[n("noThreadsAuth")]),o=s("div",{class:"heedb-new-msg"}),i=s("button",{},[n("sendAMessage")]);i.onclick=()=>{T="contact",A("contact"),M()},o.appendChild(i),e.append(a,o);return}e.innerHTML="";for(let a=0;a<3;a++){let o=s("div",{class:"heedb-thread-item heedb-skeleton"});o.append(s("div",{class:"heedb-skel-line",style:"width:40%;height:12px"}),s("div",{class:"heedb-skel-line",style:"width:80%;height:13px;margin-top:6px"}),s("div",{class:"heedb-skel-line",style:"width:30%;height:11px;margin-top:4px"})),e.appendChild(o)}try{let{threads:a}=await me(x);if(e.innerHTML="",e.style.opacity="0",requestAnimationFrame(()=>{e.style.opacity="1"}),a.length===0){let r=s("p",{style:"color:#71717a;text-align:center;margin:8px 0"},[z(l.emptyStateText)||n("noOpenMessages")]);e.appendChild(r)}else for(let r of a){let g=s("span",{class:`heedb-badge heedb-badge-${r.status}`},[r.status]),h=s("div",{class:"heedb-thread-label"},[r.type==="privacy"?n("privacyRequest"):n("message")," \u2022 "]);h.appendChild(g);let p=s("div",{class:"heedb-thread-text"},[(t=r.preview)!=null?t:""]),m=new Date(r.createdAt).toLocaleDateString(),c=s("div",{class:"heedb-thread-meta"},[m]),d=s("div",{class:"heedb-thread-item"});d.append(h,p,c),d.onclick=()=>we(r.id),e.appendChild(d)}let o=s("div",{class:"heedb-new-msg"}),i=s("button",{},[n("sendNewMessage")]);i.onclick=()=>{T="contact",A("contact"),M()},o.appendChild(i),e.appendChild(o)}catch(a){e.innerHTML=`<p style="color:#ef4444;text-align:center">${n("failedToLoad")}</p>`}}function we(e){V=e,T="thread-detail",M()}async function ke(e){e.innerHTML="",e.style.padding="12px";let t=s("div",{class:"heedb-skel-line",style:"width:50%;height:13px;margin-bottom:12px"});e.appendChild(t);let a=s("div",{style:"display:flex;flex-direction:column;gap:8px"}),o=["65%","50%","70%","45%"],i=["flex-start","flex-end","flex-start","flex-end"];for(let g=0;g<4;g++){let h=s("div",{style:`display:flex;flex-direction:column;align-items:${i[g]}`});h.appendChild(s("div",{class:"heedb-skel-line",style:`width:${o[g]};height:32px;border-radius:8px`})),a.appendChild(h)}e.appendChild(a);let r=s("button",{class:"heedb-chat-back"},[n("backToMessages")]);r.onclick=()=>{T="threads",A("threads"),M()};try{let h=(await ge(V)).messages||[];e.innerHTML="",e.style.padding="12px",e.appendChild(r);let p=s("div",{class:"heedb-chat-messages"});for(let y of h){let w=y.direction==="inbound",k=s("div",{style:`display:flex;flex-direction:column;${w?"align-items:flex-start":"align-items:flex-end"}`}),P=s("div",{class:`heedb-chat-bubble ${w?"heedb-chat-inbound":"heedb-chat-outbound"}`},[Ee(y.body)]),G=s("div",{class:`heedb-chat-time ${w?"":"heedb-chat-time-right"}`},[Le(y.createdAt)]);k.append(P,G),p.appendChild(k)}e.appendChild(p),requestAnimationFrame(()=>{p.scrollTop=p.scrollHeight});let m=s("div",{class:"heedb-chat-reply"}),c=document.createElement("textarea");c.className="heedb-chat-reply-input",c.placeholder=n("typeReply"),c.rows=1,c.addEventListener("input",()=>{c.style.height="auto",c.style.height=Math.min(c.scrollHeight,80)+"px"});let d=s("button",{class:"heedb-chat-send"},[n("send")]),u=s("div",{class:"heedb-error",style:"display:none;margin-top:4px"});async function v(){let y=c.value.trim();if(y){d.disabled=!0,d.textContent="\u2026",u.style.display="none";try{let w=await ue(V,y);if(w.ok){let k=s("div",{style:"display:flex;flex-direction:column;align-items:flex-start"}),P=s("div",{class:"heedb-chat-bubble heedb-chat-inbound"},[y]),G=s("div",{class:"heedb-chat-time"},[n("justNow")]);k.append(P,G),p.appendChild(k),p.scrollTop=p.scrollHeight,c.value="",c.style.height="auto"}else{let k=await w.json();u.textContent=k.error||n("failedToSend"),u.style.display="block"}}catch(w){u.textContent=n("networkError"),u.style.display="block"}d.disabled=!1,d.textContent=n("send")}}d.onclick=v,c.addEventListener("keydown",y=>{y.key==="Enter"&&!y.shiftKey&&(y.preventDefault(),v())}),m.append(c,d),e.append(m,u),requestAnimationFrame(()=>c.focus())}catch(g){e.innerHTML="",e.appendChild(r),e.appendChild(s("p",{style:"color:#ef4444;text-align:center"},[n("failedToLoadConvo")]))}}function Ee(e){let t=e.split(`
|
|
167
167
|
`),a=[];for(let o of t){let i=o.trim();if(/^(On|Em|El|Le|Am|Il giorno) .+(<[^>]+@[^>]+>).*(wrote|escreveu|escribi|crit|schrieb|scritto)\s?:$/i.test(i)||/<[^>]+@[^>]+>/.test(i)&&i.endsWith(":")||/^-{3,}$/.test(i))break;/^>{1,}\s/.test(i)||a.push(o)}return a.join(`
|
|
168
|
-
`).trim()}function
|
|
168
|
+
`).trim()}function Le(e){let t=new Date(e),o=new Date().getTime()-t.getTime(),i=Math.floor(o/6e4);if(i<1)return n("justNow");if(i<60)return n("minutesAgo").replace("{mins}",String(i));let r=Math.floor(i/60);return r<24?n("hoursAgo").replace("{hours}",String(r)):t.toLocaleDateString()}function Z(e,t,a){e.innerHTML="";let o=s("div",{class:"heedb-success"});o.innerHTML=`
|
|
169
169
|
<div class="heedb-success-icon">\u2705</div>
|
|
170
170
|
<h3>${t}</h3>
|
|
171
171
|
<p>${a}</p>
|
|
172
|
-
`,e.appendChild(o)}let
|
|
172
|
+
`,e.appendChild(o)}let $=null,_=null;function A(e){T=e,$&&$.querySelectorAll(".heedb-tab").forEach(t=>{t.classList.toggle("active",t.dataset.mode===e)})}function q(){_&&(_.style.display=x&&L?"":"none")}let I=null;function ee(){b=Y(),I&&(I.textContent=X())}async function te(){if(l=await he(),R=J(),b=Y(),I=document.createElement("style"),I.textContent=X(),document.head.appendChild(I),l.customCSS){let d=document.createElement("style");d.textContent=l.customCSS,document.head.appendChild(d)}l.mode==="system"&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{ee(),S&&f&&M()});let e=l.triggerText||"";if(N=s("button",{class:"heedb-btn",title:n("contactUs"),"aria-label":"Open contact widget"}),l.triggerIcon){let d=s("span",{class:"heedb-btn-icon"}),u=Q(l.triggerIcon);u&&d.appendChild(u),N.appendChild(d)}else N.appendChild(document.createTextNode(l.triggerEmoji||"\u{1F4AC}"));if(e&&N.appendChild(s("span",{class:"heedb-btn-label"},[e])),N.onclick=U,document.body.appendChild(N),l.triggerMode==="embedded"&&l.triggerSelector){let d=document.querySelector(l.triggerSelector);d&&d.addEventListener("click",u=>{u.preventDefault(),U()})}if(l.triggerMode==="tag"){let d=s("button",{class:"heedb-tag","aria-label":"Open contact widget"}),u=s("span",{class:"heedb-tag-icon"});if(l.triggerIcon){let v=Q(l.triggerIcon);v&&u.appendChild(v)}else u.appendChild(document.createTextNode(l.triggerEmoji||"\u{1F4AC}"));d.appendChild(u),d.appendChild(document.createTextNode(l.triggerText||n("feedback"))),d.onclick=U,document.body.appendChild(d)}f=s("div",{class:"heedb-panel",style:"display:none"});let t=s("div",{class:"heedb-header"}),a=s("h2",{},[l.headerTitle||n("contactUs")]),o=s("button",{class:"heedb-close","aria-label":"Close"},["\u2715"]);o.onclick=U,t.append(a,o),$=s("div",{class:"heedb-tabs"});let i=s("button",{class:"heedb-tab active","data-mode":"contact"},[z(l.contactTabLabel)||n("contactTab")]),g=l.showPrivacyTab!==!1?s("button",{class:"heedb-tab","data-mode":"privacy"},[n("privacyTab")]):null;_=s("button",{class:"heedb-tab","data-mode":"threads"},[n("messagesTab")]),_.style.display=x&&L?"":"none",i.onclick=()=>{A("contact"),M()},g&&(g.onclick=()=>{A("privacy"),M()}),_.onclick=()=>{A("threads"),M()},$.append(i),g&&$.append(g),$.append(_);let h=s("div",{class:"heedb-body"}),p=s("div",{class:"heedb-footer"}),m=new URLSearchParams({utm_source:"widget",utm_medium:"heedb-widget",utm_campaign:window.location.hostname}),c=s("a",{href:`https://heedb.com?${m.toString()}`,target:"_blank",rel:"noopener noreferrer"},[n("poweredBy")]);p.appendChild(c),f.append(t,$,h,p),document.body.appendChild(f)}function U(){S=!S,f&&(S?(f.style.display="flex",f.style.opacity="0",f.style.transform="translateY(8px)",requestAnimationFrame(()=>{f.style.opacity="1",f.style.transform="translateY(0)"}),x&&L&&T!=="privacy"&&T!=="thread-detail"&&(T="threads",A("threads")),M()):(f.style.opacity="0",f.style.transform="translateY(8px)",setTimeout(()=>{!S&&f&&(f.style.display="none")},150)))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",te):te()})();})();
|
package/package.json
CHANGED
package/widget.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/* Heedb Widget v1.0.
|
|
2
|
-
"use strict";(()=>{(function(){var ae,ne,se,oe,ie;let E=document.currentScript||document.querySelector("script[data-api-key]")
|
|
1
|
+
/* Heedb Widget v1.0.4 — https://heedb.com */
|
|
2
|
+
"use strict";(()=>{(function(){var ae,ne,se,oe,ie;let E=document.currentScript||document.querySelector("script[data-api-key]"),C=(ae=E==null?void 0:E.getAttribute("data-api-key"))!=null?ae:"",K=(ne=E==null?void 0:E.src)!=null?ne:"",D=(E==null?void 0:E.getAttribute("data-host"))||(K?new URL(K).origin:"");if(!C){console.warn("[Heedb] Missing data-api-key on <script> tag.");return}let re=1,l={},b=!1,de={primary:"#18181b",text:"#18181b",bg:"#ffffff"},le={primary:"#e4e4e7",text:"#e4e4e7",bg:"#1a1a1a"},B={en:{contactTab:"Message",privacyTab:"Privacy",messagesTab:"Messages",nameLabel:"Name",emailLabel:"Email",messageLabel:"Message",namePlaceholder:"Jane Smith",emailPlaceholder:"jane@example.com",messagePlaceholder:"How can we help?",sendMessage:"Send message",sending:"Sending\u2026",fillAllFields:"Please fill in all fields.",messageSentTitle:"Message sent!",messageSentBody:"We'll get back to you soon. Check your inbox for a confirmation email.",networkError:"Network error. Please try again.",somethingWrong:"Something went wrong.",rateLimited:"Too many messages. Please wait a moment.",requestType:"Request type",deleteData:"Delete my data",accessData:"Access my data",exportData:"Export my data",correctData:"Correct my data",restrictProcessing:"Restrict processing",objectProcessing:"Object to processing",other:"Other",submitRequest:"Submit request",submitting:"Submitting\u2026",requestSubmittedTitle:"Request submitted!",requestSubmittedBody:"Your privacy request has been received. We'll respond within 30 days.",contactUs:"Contact us",feedback:"Feedback",poweredBy:"Powered by Heedb",justNow:"Just now",minutesAgo:"{mins}m ago",hoursAgo:"{hours}h ago",send:"Send",backToMessages:"\u2190 Back to messages",noThreadsAuth:"Send a message below to view your message history.",sendAMessage:"+ Send a message",sendNewMessage:"+ Send a new message",noOpenMessages:"No open messages yet.",loading:"Loading\u2026",failedToLoad:"Failed to load messages.",failedToLoadConvo:"Failed to load conversation.",failedToSend:"Failed to send.",typeReply:"Type a reply\u2026",privacyRequest:"Privacy request",message:"Message"},es:{contactTab:"Mensaje",privacyTab:"Privacidad",messagesTab:"Mensajes",nameLabel:"Nombre",emailLabel:"Correo",messageLabel:"Mensaje",namePlaceholder:"Mar\xEDa Garc\xEDa",emailPlaceholder:"maria@empresa.com",messagePlaceholder:"\xBFC\xF3mo podemos ayudarte?",sendMessage:"Enviar mensaje",sending:"Enviando\u2026",fillAllFields:"Por favor, completa todos los campos.",messageSentTitle:"\xA1Mensaje enviado!",messageSentBody:"Te responderemos pronto. Revisa tu bandeja de entrada para un correo de confirmaci\xF3n.",networkError:"Error de red. Int\xE9ntalo de nuevo.",somethingWrong:"Algo sali\xF3 mal.",rateLimited:"Demasiados mensajes. Espera un momento.",requestType:"Tipo de solicitud",deleteData:"Eliminar mis datos",accessData:"Acceder a mis datos",exportData:"Exportar mis datos",correctData:"Corregir mis datos",restrictProcessing:"Restringir procesamiento",objectProcessing:"Oponerse al procesamiento",other:"Otro",submitRequest:"Enviar solicitud",submitting:"Enviando\u2026",requestSubmittedTitle:"\xA1Solicitud enviada!",requestSubmittedBody:"Tu solicitud de privacidad ha sido recibida. Responderemos en un plazo de 30 d\xEDas.",contactUs:"Cont\xE1ctanos",feedback:"Comentarios",poweredBy:"Impulsado por Heedb",justNow:"Ahora",minutesAgo:"hace {mins}m",hoursAgo:"hace {hours}h",send:"Enviar",backToMessages:"\u2190 Volver a mensajes",noThreadsAuth:"Env\xEDa un mensaje para ver tu historial.",sendAMessage:"+ Enviar un mensaje",sendNewMessage:"+ Enviar un nuevo mensaje",noOpenMessages:"No hay mensajes a\xFAn.",loading:"Cargando\u2026",failedToLoad:"No se pudieron cargar los mensajes.",failedToLoadConvo:"No se pudo cargar la conversaci\xF3n.",failedToSend:"No se pudo enviar.",typeReply:"Escribe una respuesta\u2026",privacyRequest:"Solicitud de privacidad",message:"Mensaje"},pt:{contactTab:"Mensagem",privacyTab:"Privacidade",messagesTab:"Mensagens",nameLabel:"Nome",emailLabel:"Email",messageLabel:"Mensagem",namePlaceholder:"Maria Silva",emailPlaceholder:"maria@empresa.com",messagePlaceholder:"Como podemos ajudar?",sendMessage:"Enviar mensagem",sending:"Enviando\u2026",fillAllFields:"Por favor, preencha todos os campos.",messageSentTitle:"Mensagem enviada!",messageSentBody:"Responderemos em breve. Verifique sua caixa de entrada para um email de confirma\xE7\xE3o.",networkError:"Erro de rede. Tente novamente.",somethingWrong:"Algo deu errado.",rateLimited:"Muitas mensagens. Aguarde um momento.",requestType:"Tipo de solicita\xE7\xE3o",deleteData:"Excluir meus dados",accessData:"Acessar meus dados",exportData:"Exportar meus dados",correctData:"Corrigir meus dados",restrictProcessing:"Restringir processamento",objectProcessing:"Opor-se ao processamento",other:"Outro",submitRequest:"Enviar solicita\xE7\xE3o",submitting:"Enviando\u2026",requestSubmittedTitle:"Solicita\xE7\xE3o enviada!",requestSubmittedBody:"Sua solicita\xE7\xE3o de privacidade foi recebida. Responderemos em at\xE9 30 dias.",contactUs:"Fale conosco",feedback:"Feedback",poweredBy:"Powered by Heedb",justNow:"Agora",minutesAgo:"h\xE1 {mins}m",hoursAgo:"h\xE1 {hours}h",send:"Enviar",backToMessages:"\u2190 Voltar \xE0s mensagens",noThreadsAuth:"Envie uma mensagem para ver seu hist\xF3rico.",sendAMessage:"+ Enviar uma mensagem",sendNewMessage:"+ Enviar uma nova mensagem",noOpenMessages:"Nenhuma mensagem ainda.",loading:"Carregando\u2026",failedToLoad:"N\xE3o foi poss\xEDvel carregar as mensagens.",failedToLoadConvo:"N\xE3o foi poss\xEDvel carregar a conversa.",failedToSend:"N\xE3o foi poss\xEDvel enviar.",typeReply:"Digite uma resposta\u2026",privacyRequest:"Solicita\xE7\xE3o de privacidade",message:"Mensagem"}},R="en";function n(e){var t,a,o;return(o=(a=(t=B[R])==null?void 0:t[e])!=null?a:B.en[e])!=null?o:e}function z(e){if(e)return e[R]||e.en}function J(){var a;let e=E==null?void 0:E.getAttribute("data-lang");if(e&&e in B)return e;if(O&&O in B)return O;if(l.language&&l.language in B)return l.language;let t=(a=document.documentElement.lang)==null?void 0:a.slice(0,2);return t&&t in B?t:"en"}let O;function Y(){return l.mode==="dark"?!0:l.mode==="light"?!1:l.mode==="system"?window.matchMedia("(prefers-color-scheme: dark)").matches:!1}function ce(){return b?le:de}function j(e,t){let a=l[e];return a!=null?String(a):t}let S=!1,T="contact",V="",H=(se=localStorage.getItem("heedb_name"))!=null?se:"",x=(oe=localStorage.getItem("heedb_email"))!=null?oe:"",L=(ie=localStorage.getItem("heedb_token"))!=null?ie:"",f=null,N=null;async function pe(e,t){try{let a=await F("/api/threads/token",{api_key:C,email:e,userHash:t});if(a.ok){let o=await a.json();if(o.widgetToken){L=o.widgetToken,localStorage.setItem("heedb_token",o.widgetToken);return}}L="",localStorage.removeItem("heedb_token")}catch(a){L="",localStorage.removeItem("heedb_token")}}window.Heedb={version:"1.0.4",init(e={}){e.lang&&(O=e.lang,R=J(),ee(),S&&f&&M()),e.name&&(H=e.name,localStorage.setItem("heedb_name",e.name)),e.email&&(x=e.email,localStorage.setItem("heedb_email",e.email),e.userHash?pe(e.email,e.userHash).then(()=>{q(),S&&f&&M()}):(q(),S&&f&&M()))},reset(){H="",x="",L="",localStorage.removeItem("heedb_name"),localStorage.removeItem("heedb_email"),localStorage.removeItem("heedb_token"),T="contact",S=!1,f&&(f.style.display="none"),q()}};function F(e,t){return fetch(`${D}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)})}function me(e){let t=new URL(`${D}/api/threads`);return t.searchParams.set("api_key",C),t.searchParams.set("email",e),L&&t.searchParams.set("token",L),fetch(t.toString()).then(a=>a.json())}function ge(e){let t=new URL(`${D}/api/threads/${e}`);return t.searchParams.set("api_key",C),t.searchParams.set("email",x),t.searchParams.set("token",L),fetch(t.toString()).then(a=>a.json())}function ue(e,t){return F(`/api/threads/${e}/reply`,{api_key:C,email:x,token:L,message:t})}async function he(){var e;try{let t=new URL(`${D}/api/widget-config`);t.searchParams.set("api_key",C),t.searchParams.set("v",String(re));let a=await fetch(t.toString());if(a.ok){let o=await a.json();return be(),(e=o.config)!=null?e:{}}}catch(t){}return{}}function be(){try{fetch(`${D}/api/widget-ping`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({api_key:C}),keepalive:!0})}catch(e){}}function X(){var u,v;let e=ce(),t=j(b?"darkPrimaryColor":"primaryColor",e.primary),a=j(b?"darkTextColor":"textColor",e.text),o=j(b?"darkBgColor":"bgColor",e.bg),i=(u=l.borderRadius)!=null?u:16,r=(v=l.buttonRadius)!=null?v:50,g=l.fontFamily||"system-ui, -apple-system, sans-serif",h=l.position==="bottom-left",p=r>=50?"50%":`${r}px`,m=Math.round(i*.5),c=l.triggerMode==="tag",d=l.triggerMode==="embedded"||c;return`
|
|
3
3
|
.heedb-btn {
|
|
4
4
|
position: fixed; bottom: 24px; ${h?"left: 24px":"right: 24px"}; z-index: 999998;
|
|
5
5
|
width: 52px; height: 52px; border-radius: ${p}; border: none;
|
|
@@ -163,10 +163,10 @@
|
|
|
163
163
|
|
|
164
164
|
/* Body fade transition */
|
|
165
165
|
.heedb-body { transition: opacity .15s ease; }
|
|
166
|
-
`}function s(e,t={},a=[]){let o=document.createElement(e);for(let[i,r]of Object.entries(t))i==="class"?o.className=r:i==="style"?o.setAttribute("style",r):i.startsWith("on")&&typeof r=="function"?o.addEventListener(i.slice(2),r):o.setAttribute(i,String(r));for(let i of a)o.appendChild(typeof i=="string"?document.createTextNode(i):i);return o}function Q(e){let a=new DOMParser().parseFromString(e,"image/svg+xml").querySelector("svg");if(!a)return null;a.querySelectorAll("script,foreignObject,iframe,object,embed").forEach(r=>r.remove());for(let r of Array.from(a.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&a.removeAttribute(r.name);let o=document.createTreeWalker(a,NodeFilter.SHOW_ELEMENT),i;for(;i=o.nextNode();)for(let r of Array.from(i.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&i.removeAttribute(r.name);return a}function W(e,t,a=""){let o=document.createElement("input");return o.type=e,o.id=t,o.placeholder=a,o.className="heedb-input",o}function
|
|
166
|
+
`}function s(e,t={},a=[]){let o=document.createElement(e);for(let[i,r]of Object.entries(t))i==="class"?o.className=r:i==="style"?o.setAttribute("style",r):i.startsWith("on")&&typeof r=="function"?o.addEventListener(i.slice(2),r):o.setAttribute(i,String(r));for(let i of a)o.appendChild(typeof i=="string"?document.createTextNode(i):i);return o}function Q(e){let a=new DOMParser().parseFromString(e,"image/svg+xml").querySelector("svg");if(!a)return null;a.querySelectorAll("script,foreignObject,iframe,object,embed").forEach(r=>r.remove());for(let r of Array.from(a.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&a.removeAttribute(r.name);let o=document.createTreeWalker(a,NodeFilter.SHOW_ELEMENT),i;for(;i=o.nextNode();)for(let r of Array.from(i.attributes))(r.name.startsWith("on")||/^\s*javascript:/i.test(r.value))&&i.removeAttribute(r.name);return a}function W(e,t,a=""){let o=document.createElement("input");return o.type=e,o.id=t,o.placeholder=a,o.className="heedb-input",o}function fe(e,t=""){let a=document.createElement("textarea");return a.id=e,a.placeholder=t,a.className="heedb-textarea",a}function ye(e,t){let a=document.createElement("select");a.id=e,a.className="heedb-select";for(let o of t){let i=document.createElement("option");i.value=o.value,i.textContent=o.label,a.appendChild(i)}return a}function M(){if(!f)return;let e=f.querySelector(".heedb-body");e.innerHTML="",T==="contact"?xe(e):T==="privacy"?ve(e):T==="threads"?Te(e):T==="thread-detail"&&ke(e),$&&($.style.display=T==="thread-detail"?"none":"flex")}function xe(e,t=""){let a=!!(H&&x),o=s("label",{class:"heedb-label"},[n("nameLabel")]),i=W("text","heedb-name",n("namePlaceholder"));H&&(i.value=H);let r=s("label",{class:"heedb-label"},[n("emailLabel")]),g=W("email","heedb-email",n("emailPlaceholder"));(t||x)&&(g.value=t||x);let h=z(l.messageLabel),p=h?s("label",{class:"heedb-label"},[h]):null,m=fe("heedb-message",z(l.messagePlaceholder)||n("messagePlaceholder")),c=s("div",{class:"heedb-error",style:"display:none"}),d=s("button",{class:"heedb-btn-submit"},[n("sendMessage")]);d.onclick=async()=>{var w;let u=i.value.trim(),v=g.value.trim(),y=m.value.trim();if(c.style.display="none",!u||!v||!y){c.textContent=n("fillAllFields"),c.style.display="block";return}d.disabled=!0,d.textContent=n("sending");try{let k=await F("/api/contact",{api_key:C,name:u,email:v,message:y,lang:R});if(k.ok)x=v,localStorage.setItem("heedb_email",v),q(),Z(e,n("messageSentTitle"),n("messageSentBody"));else if(k.status===429){let P=parseInt((w=k.headers.get("Retry-After"))!=null?w:"60",10);c.textContent=n("rateLimited"),c.style.display="block",d.textContent=n("sendMessage"),setTimeout(()=>{d.disabled=!1,c.style.display="none"},P*1e3)}else{let P=await k.json();c.textContent=P.error||n("somethingWrong"),c.style.display="block",d.disabled=!1,d.textContent=n("sendMessage")}}catch(k){c.textContent=n("networkError"),c.style.display="block",d.disabled=!1,d.textContent=n("sendMessage")}},a?(p&&e.append(p),e.append(m,c,d)):(e.append(o,i,r,g),p&&e.append(p),e.append(m,c,d))}function ve(e){let t=!!(H&&x),a=s("label",{class:"heedb-label"},[n("nameLabel")]),o=W("text","heedb-priv-name",n("namePlaceholder"));H&&(o.value=H);let i=s("label",{class:"heedb-label"},[n("emailLabel")]),r=W("email","heedb-priv-email",n("emailPlaceholder"));x&&(r.value=x);let g=s("label",{class:"heedb-label"},[n("requestType")]),h=ye("heedb-priv-type",[{value:"deletion",label:n("deleteData")},{value:"access",label:n("accessData")},{value:"portability",label:n("exportData")}]),p=s("div",{class:"heedb-error",style:"display:none"}),m=s("button",{class:"heedb-btn-submit"},[n("submitRequest")]);m.onclick=async()=>{var v;let c=o.value.trim(),d=r.value.trim(),u=h.value;if(p.style.display="none",!c||!d){p.textContent=n("fillAllFields"),p.style.display="block";return}m.disabled=!0,m.textContent=n("submitting");try{let y=await F("/api/privacy-request",{api_key:C,name:c,email:d,request_type:u,lang:R});if(y.ok)x=d,localStorage.setItem("heedb_email",d),q(),Z(e,n("requestSubmittedTitle"),n("requestSubmittedBody"));else if(y.status===429){let w=parseInt((v=y.headers.get("Retry-After"))!=null?v:"60",10);p.textContent=n("rateLimited"),p.style.display="block",m.textContent=n("submitRequest"),setTimeout(()=>{m.disabled=!1,p.style.display="none"},w*1e3)}else{let w=await y.json();p.textContent=w.error||n("somethingWrong"),p.style.display="block",m.disabled=!1,m.textContent=n("submitRequest")}}catch(y){p.textContent=n("networkError"),p.style.display="block",m.disabled=!1,m.textContent=n("submitRequest")}},t?e.append(g,h,p,m):e.append(a,o,i,r,g,h,p,m)}async function Te(e){var t;if(!L){e.innerHTML="";let a=s("p",{style:"color:#71717a;text-align:center;margin:8px 0;font-size:13px;line-height:1.5"},[n("noThreadsAuth")]),o=s("div",{class:"heedb-new-msg"}),i=s("button",{},[n("sendAMessage")]);i.onclick=()=>{T="contact",A("contact"),M()},o.appendChild(i),e.append(a,o);return}e.innerHTML="";for(let a=0;a<3;a++){let o=s("div",{class:"heedb-thread-item heedb-skeleton"});o.append(s("div",{class:"heedb-skel-line",style:"width:40%;height:12px"}),s("div",{class:"heedb-skel-line",style:"width:80%;height:13px;margin-top:6px"}),s("div",{class:"heedb-skel-line",style:"width:30%;height:11px;margin-top:4px"})),e.appendChild(o)}try{let{threads:a}=await me(x);if(e.innerHTML="",e.style.opacity="0",requestAnimationFrame(()=>{e.style.opacity="1"}),a.length===0){let r=s("p",{style:"color:#71717a;text-align:center;margin:8px 0"},[z(l.emptyStateText)||n("noOpenMessages")]);e.appendChild(r)}else for(let r of a){let g=s("span",{class:`heedb-badge heedb-badge-${r.status}`},[r.status]),h=s("div",{class:"heedb-thread-label"},[r.type==="privacy"?n("privacyRequest"):n("message")," \u2022 "]);h.appendChild(g);let p=s("div",{class:"heedb-thread-text"},[(t=r.preview)!=null?t:""]),m=new Date(r.createdAt).toLocaleDateString(),c=s("div",{class:"heedb-thread-meta"},[m]),d=s("div",{class:"heedb-thread-item"});d.append(h,p,c),d.onclick=()=>we(r.id),e.appendChild(d)}let o=s("div",{class:"heedb-new-msg"}),i=s("button",{},[n("sendNewMessage")]);i.onclick=()=>{T="contact",A("contact"),M()},o.appendChild(i),e.appendChild(o)}catch(a){e.innerHTML=`<p style="color:#ef4444;text-align:center">${n("failedToLoad")}</p>`}}function we(e){V=e,T="thread-detail",M()}async function ke(e){e.innerHTML="",e.style.padding="12px";let t=s("div",{class:"heedb-skel-line",style:"width:50%;height:13px;margin-bottom:12px"});e.appendChild(t);let a=s("div",{style:"display:flex;flex-direction:column;gap:8px"}),o=["65%","50%","70%","45%"],i=["flex-start","flex-end","flex-start","flex-end"];for(let g=0;g<4;g++){let h=s("div",{style:`display:flex;flex-direction:column;align-items:${i[g]}`});h.appendChild(s("div",{class:"heedb-skel-line",style:`width:${o[g]};height:32px;border-radius:8px`})),a.appendChild(h)}e.appendChild(a);let r=s("button",{class:"heedb-chat-back"},[n("backToMessages")]);r.onclick=()=>{T="threads",A("threads"),M()};try{let h=(await ge(V)).messages||[];e.innerHTML="",e.style.padding="12px",e.appendChild(r);let p=s("div",{class:"heedb-chat-messages"});for(let y of h){let w=y.direction==="inbound",k=s("div",{style:`display:flex;flex-direction:column;${w?"align-items:flex-start":"align-items:flex-end"}`}),P=s("div",{class:`heedb-chat-bubble ${w?"heedb-chat-inbound":"heedb-chat-outbound"}`},[Ee(y.body)]),G=s("div",{class:`heedb-chat-time ${w?"":"heedb-chat-time-right"}`},[Le(y.createdAt)]);k.append(P,G),p.appendChild(k)}e.appendChild(p),requestAnimationFrame(()=>{p.scrollTop=p.scrollHeight});let m=s("div",{class:"heedb-chat-reply"}),c=document.createElement("textarea");c.className="heedb-chat-reply-input",c.placeholder=n("typeReply"),c.rows=1,c.addEventListener("input",()=>{c.style.height="auto",c.style.height=Math.min(c.scrollHeight,80)+"px"});let d=s("button",{class:"heedb-chat-send"},[n("send")]),u=s("div",{class:"heedb-error",style:"display:none;margin-top:4px"});async function v(){let y=c.value.trim();if(y){d.disabled=!0,d.textContent="\u2026",u.style.display="none";try{let w=await ue(V,y);if(w.ok){let k=s("div",{style:"display:flex;flex-direction:column;align-items:flex-start"}),P=s("div",{class:"heedb-chat-bubble heedb-chat-inbound"},[y]),G=s("div",{class:"heedb-chat-time"},[n("justNow")]);k.append(P,G),p.appendChild(k),p.scrollTop=p.scrollHeight,c.value="",c.style.height="auto"}else{let k=await w.json();u.textContent=k.error||n("failedToSend"),u.style.display="block"}}catch(w){u.textContent=n("networkError"),u.style.display="block"}d.disabled=!1,d.textContent=n("send")}}d.onclick=v,c.addEventListener("keydown",y=>{y.key==="Enter"&&!y.shiftKey&&(y.preventDefault(),v())}),m.append(c,d),e.append(m,u),requestAnimationFrame(()=>c.focus())}catch(g){e.innerHTML="",e.appendChild(r),e.appendChild(s("p",{style:"color:#ef4444;text-align:center"},[n("failedToLoadConvo")]))}}function Ee(e){let t=e.split(`
|
|
167
167
|
`),a=[];for(let o of t){let i=o.trim();if(/^(On|Em|El|Le|Am|Il giorno) .+(<[^>]+@[^>]+>).*(wrote|escreveu|escribi|crit|schrieb|scritto)\s?:$/i.test(i)||/<[^>]+@[^>]+>/.test(i)&&i.endsWith(":")||/^-{3,}$/.test(i))break;/^>{1,}\s/.test(i)||a.push(o)}return a.join(`
|
|
168
|
-
`).trim()}function
|
|
168
|
+
`).trim()}function Le(e){let t=new Date(e),o=new Date().getTime()-t.getTime(),i=Math.floor(o/6e4);if(i<1)return n("justNow");if(i<60)return n("minutesAgo").replace("{mins}",String(i));let r=Math.floor(i/60);return r<24?n("hoursAgo").replace("{hours}",String(r)):t.toLocaleDateString()}function Z(e,t,a){e.innerHTML="";let o=s("div",{class:"heedb-success"});o.innerHTML=`
|
|
169
169
|
<div class="heedb-success-icon">\u2705</div>
|
|
170
170
|
<h3>${t}</h3>
|
|
171
171
|
<p>${a}</p>
|
|
172
|
-
`,e.appendChild(o)}let
|
|
172
|
+
`,e.appendChild(o)}let $=null,_=null;function A(e){T=e,$&&$.querySelectorAll(".heedb-tab").forEach(t=>{t.classList.toggle("active",t.dataset.mode===e)})}function q(){_&&(_.style.display=x&&L?"":"none")}let I=null;function ee(){b=Y(),I&&(I.textContent=X())}async function te(){if(l=await he(),R=J(),b=Y(),I=document.createElement("style"),I.textContent=X(),document.head.appendChild(I),l.customCSS){let d=document.createElement("style");d.textContent=l.customCSS,document.head.appendChild(d)}l.mode==="system"&&window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",()=>{ee(),S&&f&&M()});let e=l.triggerText||"";if(N=s("button",{class:"heedb-btn",title:n("contactUs"),"aria-label":"Open contact widget"}),l.triggerIcon){let d=s("span",{class:"heedb-btn-icon"}),u=Q(l.triggerIcon);u&&d.appendChild(u),N.appendChild(d)}else N.appendChild(document.createTextNode(l.triggerEmoji||"\u{1F4AC}"));if(e&&N.appendChild(s("span",{class:"heedb-btn-label"},[e])),N.onclick=U,document.body.appendChild(N),l.triggerMode==="embedded"&&l.triggerSelector){let d=document.querySelector(l.triggerSelector);d&&d.addEventListener("click",u=>{u.preventDefault(),U()})}if(l.triggerMode==="tag"){let d=s("button",{class:"heedb-tag","aria-label":"Open contact widget"}),u=s("span",{class:"heedb-tag-icon"});if(l.triggerIcon){let v=Q(l.triggerIcon);v&&u.appendChild(v)}else u.appendChild(document.createTextNode(l.triggerEmoji||"\u{1F4AC}"));d.appendChild(u),d.appendChild(document.createTextNode(l.triggerText||n("feedback"))),d.onclick=U,document.body.appendChild(d)}f=s("div",{class:"heedb-panel",style:"display:none"});let t=s("div",{class:"heedb-header"}),a=s("h2",{},[l.headerTitle||n("contactUs")]),o=s("button",{class:"heedb-close","aria-label":"Close"},["\u2715"]);o.onclick=U,t.append(a,o),$=s("div",{class:"heedb-tabs"});let i=s("button",{class:"heedb-tab active","data-mode":"contact"},[z(l.contactTabLabel)||n("contactTab")]),g=l.showPrivacyTab!==!1?s("button",{class:"heedb-tab","data-mode":"privacy"},[n("privacyTab")]):null;_=s("button",{class:"heedb-tab","data-mode":"threads"},[n("messagesTab")]),_.style.display=x&&L?"":"none",i.onclick=()=>{A("contact"),M()},g&&(g.onclick=()=>{A("privacy"),M()}),_.onclick=()=>{A("threads"),M()},$.append(i),g&&$.append(g),$.append(_);let h=s("div",{class:"heedb-body"}),p=s("div",{class:"heedb-footer"}),m=new URLSearchParams({utm_source:"widget",utm_medium:"heedb-widget",utm_campaign:window.location.hostname}),c=s("a",{href:`https://heedb.com?${m.toString()}`,target:"_blank",rel:"noopener noreferrer"},[n("poweredBy")]);p.appendChild(c),f.append(t,$,h,p),document.body.appendChild(f)}function U(){S=!S,f&&(S?(f.style.display="flex",f.style.opacity="0",f.style.transform="translateY(8px)",requestAnimationFrame(()=>{f.style.opacity="1",f.style.transform="translateY(0)"}),x&&L&&T!=="privacy"&&T!=="thread-detail"&&(T="threads",A("threads")),M()):(f.style.opacity="0",f.style.transform="translateY(8px)",setTimeout(()=>{!S&&f&&(f.style.display="none")},150)))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",te):te()})();})();
|