Sovanza Inbox
Live chat for every site, in one place.
Sign in
π Enable desktop alerts
β¬ Export leads (CSV)
Sign out
Open
Closed
All
Select a conversation
"})); inp("name","Brand name",s.name);inp("title","Home screen title",s.title);inp("reply_time","Reply-time line",s.reply_time);inp("greeting","Greeting message",s.greeting,"textarea"); var col=inp("color","Colour (#hex)",s.color);col.type="color"; b.appendChild(el("label",{text:"βWho are we chatting with?β options (one per line: Title | description)"})); var who=el("textarea",{class:"in",rows:"4"});who.value=s.who.map(function(w){return w.t+(w.d?" | "+w.d:"")}).join("\n");b.appendChild(who); b.appendChild(el("label",{text:"Help tab FAQs (blank = Help tab hidden)"}));var fl=el("div");b.appendChild(fl); var faqs=s.faqs.slice();function paintF(){fl.innerHTML="";faqs.forEach(function(q,i){var g=el("input",{class:"in",placeholder:"Group (e.g. Booking & pricing)"});g.value=q.g||"";g.oninput=function(){q.g=g.value}; var qq=el("input",{class:"in",placeholder:"Question"});qq.value=q.q;qq.oninput=function(){q.q=qq.value};var a=el("textarea",{class:"in",rows:"3",placeholder:"Answer"});a.value=q.a;a.oninput=function(){q.a=a.value}; fl.appendChild(el("div",{class:"faqrow"},[g,qq,a,el("button",{class:"btn",onclick:function(){faqs.splice(i,1);paintF()}},["Remove"])]))}); fl.appendChild(el("button",{class:"btn",onclick:function(){faqs.push({g:"",q:"",a:""});paintF()}},["+ Add FAQ"]))}paintF(); var en=el("input",{type:"checkbox"});en.checked=!!s.enabled;b.appendChild(el("label",{style:"display:flex;gap:8px;align-items:center;color:var(--ink);font-size:14px;margin-top:14px"},[en,"Widget enabled on this site"])); b.appendChild(el("div",{class:"row",style:"margin-top:16px"},[el("button",{class:"btn",onclick:function(){m.remove()}},["Cancel"]),el("button",{class:"btn pri",onclick:function(){ api("/a/site",{body:{key:key,name:f.name.value,title:f.title.value,reply_time:f.reply_time.value,greeting:f.greeting.value,color:f.color.value,enabled:en.checked, who:who.value.split("\n").map(function(l){var p=l.split("|");return{t:(p[0]||"").trim(),d:(p.slice(1).join("|")||"").trim()}}).filter(function(w){return w.t}), faqs:faqs.filter(function(q){return q.q&&q.a})}}).then(function(r){if(r.ok){m.remove();loadSites()}else alert("Not saved")})}},["Save"])])); document.body.appendChild(m)} var audioCtx;function ding(){try{audioCtx=audioCtx||new(window.AudioContext||window.webkitAudioContext)();var o=audioCtx.createOscillator(),g=audioCtx.createGain();o.connect(g);g.connect(audioCtx.destination);o.frequency.value=740;g.gain.setValueAtTime(.12,audioCtx.currentTime);g.gain.exponentialRampToValueAtTime(.0001,audioCtx.currentTime+.4);o.start();o.stop(audioCtx.currentTime+.41)}catch(e){}} function stream(){var es=new EventSource("/a/stream"); es.addEventListener("msg",function(e){var d=JSON.parse(e.data); if(state.curData&&state.curData.convo.id===d.convo.id){state.curData.msgs.push(d.msg);var ms=document.querySelector(".msgs");if(ms){ms.appendChild(bubble(d.msg));ms.scrollTop=ms.scrollHeight} if(d.msg.sender==="visitor"&&!document.hidden)api("/a/convo?id="+d.convo.id).catch(function(){})} if(d.msg.sender==="visitor"){ding();if(window.Notification&&Notification.permission==="granted"&&(document.hidden||state.cur!==d.convo.id)){var n=new Notification(d.convo.name+" Β· "+siteOf(d.convo.site).name,{body:d.msg.body||"π attachment",tag:d.convo.id});n.onclick=function(){window.focus();openConvo(d.convo.id)}}} loadList();loadSites()}); es.addEventListener("convo",function(){loadList();loadSites()}); es.onerror=function(){es.close();setTimeout(function(){api("/a/me").then(function(){stream();loadList();loadSites()}).catch(function(){})},4000)}} function boot(){api("/a/me").then(function(r){state.me=r.agent;$("#login").classList.add("hidden");$("#app").classList.remove("hidden");paintNotif(); loadSites().then(loadList).then(function(){var h=location.hash.slice(1);if(h)openConvo(h)});stream()}).catch(function(){})} boot(); })();