Skip to content Kiwo Dashboard
Sample data
'; try{var f=document.createElement("iframe");f.setAttribute("aria-hidden","true");f.style.cssText="position:fixed;right:0;bottom:0;width:0;height:0;border:0";f.onload=function(){try{f.contentWindow.focus();f.contentWindow.print()}catch(e){toast(t("sp_print_fail"))}setTimeout(function(){if(f.parentNode)f.parentNode.removeChild(f)},60000)};f.srcdoc=doc;document.body.appendChild(f)}catch(e){toast(t("sp_print_fail"))}} function spHtml(s,steps,px){px=px||"sp";var u=spUrl(s); if(s.status!=="live")return '

'+esc(t("sp_t"))+'

'+esc(t("sp_draft"))+'

'; var svg=spQrSvg(u+"?src=qr"),nm=spBiz(s),help=REAL?"/help#promote":"/help#promote"; var caps=[["ig","sp_cap_ig","Instagram"],["tg","sp_cap_tg","Telegram"],["wa","sp_cap_wa","WhatsApp"]].map(function(c){var tx=fmt(c[1],{name:nm,url:u});return '
'+c[2]+'
'+esc(tx)+'
'}).join(""); var nx=steps?'

'+esc(t("sp_next_t"))+'

    '+[1,2,3].map(function(i){return '
  1. '+esc(t("sp_n"+i))+''+esc(t("sp_n"+i+"d"))+'
  2. '}).join("")+'

':''; return '

'+esc(t("sp_t"))+'

'+esc(fmt("sp_s",{url:siteUrl(s)}))+'

'+nx+ '
'+(svg?'':'

'+esc(t("sh_nolib"))+'

')+ (svg?'

'+esc(t("sp_print_tip"))+'

':'')+'
'+ '

'+esc(t("sh_link"))+'

'+esc(u)+'
'+ '

'+esc(t("sp_cap_t"))+'

'+caps+'
'+ '

'+esc(t("sp_help"))+'

'} function spBind(root,s){if(s.status!=="live")return;var u=spUrl(s); function mark(){s.shared=true} $$("[data-sp]",root).forEach(function(b){b.onclick=function(){var k=b.dataset.sp;mark(); if(k==="copy")copyTxt(u,"sp_copied"); else if(k==="svg"){var svg=spQrSvg(u+"?src=qr");if(svg&&download("kiwo-qr-"+s.slug+".svg",''+svg.replace("
'+spHtml(s,true,"spm")+'
',{label:t("sp_pub_t")});m.querySelector("[data-close]").onclick=closeLayers;var w=m.querySelector(".spn-wrap");if(w)spBind(w,s);var h=w&&w.querySelector("#spm-h");if(h)h.remove()} VIEW_RENDER.sh=function(){if(curSite())frMark("sh");renderShare()}; /* ================= account ================= */ var ACT=[["profile","ac_profile"],["security","ac_security"],["plan","ac_plan"],["notif","ac_notif"],["data","ac_data"],["support","ac_support"]]; var ACS={tfa:null,busy:false}; function renderAc(opts){if(opts&&opts.tab)AC.acTab=opts.tab;var u=AC.user; $("#ac-nav").innerHTML=ACT.map(function(x){return ''}).join(""); $$("#ac-nav button").forEach(function(b){b.onclick=function(){AC.acTab=b.dataset.t;renderAc()}}); var body=$("#ac-body"),tab=AC.acTab,h=""; if(tab==="profile"){h='

'+esc(t("pf_t"))+'

'+(REAL?'

'+esc(t("pf_local"))+'

':'')+'
'+ (REAL?'

'+esc(t("nt_t"))+' · Telegram

'+tgCardHtml()+'
':'

'+esc(t("nt_t"))+' · Telegram

'+esc(u.tgLinked?t("tg_on"):t("tg_off"))+''+esc(t("tg_help"))+'
'+esc(u.tgCode)+'

'+esc(t("proto"))+'

')} else if(tab==="security"){h='

'+esc(t("pw_t"))+'

'+esc(t("pw_s"))+'

'+ '

'+esc(t("tfa_t"))+'

'+esc(u.twoFactor?t("tfa_on"):t("tfa_off"))+'
'+(u.twoFactor?'':'')+'
'+ '

'+esc(t("ses_t"))+'

'+ (REAL?'':'

'+esc(t("lh_t"))+'

')} else if(tab==="plan"&&REAL){h=realPlanHtml()} else if(tab==="plan"){var pro=u.tier==="pro";h='

'+esc(t("pl_t"))+'

'+[["std",TIER.std,["plan_f1","plan_f2","plan_f3","plan_f4"]],["pro",TIER.pro,["plan_f1","plan_f2","plan_f3","plan_f5","plan_f6","plan_f7"]]].map(function(p){var cur=u.tier===p[0];return '
'+esc(t("plan_"+p[0]))+''+(cur?''+esc(t("plan_cur"))+'':'')+'
'+esc(fmt("plan_sites",{n:p[1]}))+''+esc(t("plan_price_na"))+'
    '+p[2].map(function(f){return '
  • '+esc(t(f))+'
  • '}).join("")+'
'+(cur?'':'')+'
'}).join("")+'
'+ '
'+ '
'+esc(t("ar"))+''+esc(t("ar_note2"))+'

'+esc((u.autoRenew?t("ar_on"):t("ar_off"))+": "+fmtDate(addMonths(TODAY,u.period),{day:"numeric",month:"long",year:"numeric"}))+'

'+ '

'+esc(t("inv_t"))+'

'+esc(t("inv_proto"))+'

'+ '

'+esc(t("dm_t2"))+'

'+liveSites().map(function(s){return '
'+esc(siteUrl(s))+''+esc(s.name)+'
'}).join("")+'
'+esc(t("dm_cust"))+''+esc(t("dm_soon"))+'
'} else if(tab==="notif"&&REAL){h='

'+esc(t("nd_t"))+'

'+esc(t("np_real"))+'

Telegram

'+tgCardHtml()+'
'} else if(tab==="notif"){var P=u.prefs;h='

'+esc(t("nd_t"))+'

'+[["book_tg","np_book_tg"],["book_mail","np_book_mail"],["week","np_week"],["promo","np_promo"],["sec","np_sec"],["prod","np_prod"]].map(function(x){return '
'+esc(t(x[1]))+'
'}).join("")+'
'+ '

Telegram

'+esc(u.tgLinked?t("tg_on"):t("tg_off"))+''+esc(t("tg_help"))+'
'+esc(u.tgCode)+'
'} else if(tab==="data"){h='

'+esc(t("dt_export_t"))+'

'+esc(t("dt_export_s"))+'

'+ '

'+esc(t("dz_t"))+'

'+esc(t("dt_del_t"))+'

'+esc(t("dt_del_s"))+'

'+(REAL?'
'+(u.twoFactor?'
':'')+'
':'')+'
'} else{h='

'+esc(t("sup_t"))+'

'+esc(t("sup_s2"))+'

'+esc(t("sup_mail"))+'support@kiwo.cc
'+esc(t("sup_mail"))+'
'+esc(t("sup_docs"))+'
'+esc(t("help"))+'
'+esc(t("sup_legal"))+'
'+[["offer","lg_o"],["terms","lg_t"],["privacy","lg_p"],["refunds","lg_r"]].map(function(x){return ''+esc(t(x[1]))+''}).join("")+'
'} body.innerHTML=h; if(tab==="profile"){$("#pf-l").value=u.lang||lang;$("#pf-save").onclick=function(){var nm=$("#pf-n").value.trim().slice(0,60),l=$("#pf-l").value,tz=$("#pf-tz").value;if(!nm)return;api.updateAccount({name:nm,lang:l,tz:tz}).then(function(a){AC.user=a;setCurSite();if(l!==lang)setLang(l);else renderAc();toast(t("pf_saved"))},fail)}} var tg=$("#tg-btn");if(tg)tg.onclick=function(){api.updateAccount({tgLinked:!u.tgLinked}).then(function(a){AC.user=a;renderAc()},fail)};if(REAL)bindTg(body,function(){renderAc()}); if(tab==="security"){ var pn=$("#pw-n"),pm=$("#pw-m"),ps=$("#pw-s");pn.oninput=function(){var v=this.value,sc=0;if(v.length>=10)sc++;if(v.length>=14)sc++;if(/[a-z]/.test(v)&&/[A-Z]/.test(v))sc++;if(/\d/.test(v))sc++;if(/[^A-Za-z0-9]/.test(v))sc++;if(v.length<10)sc=0;sc=Math.min(4,sc);pm.style.width=(v?25*Math.max(1,sc):0)+"%";pm.style.background=["var(--bad)","var(--bad)","var(--warn)","var(--good)","var(--good)"][sc];ps.textContent=v?t("pw_"+sc):""}; $("#pw-form").onsubmit=function(e){e.preventDefault();var er=$("#pw-err"),n=pn.value,r=$("#pw-r").value;er.hidden=true;if(n.length<10){er.textContent=t("pw_short");er.hidden=false;return}if(n!==r){er.textContent=t("pw_mismatch");er.hidden=false;return}api.changePassword($("#pw-c").value,n).then(function(){toast(t("pw_changed"));renderAc()},fail)}; var ts=$("#tfa-setup");if(ts)ts.onclick=function(){api.setupTwoFactor().then(function(r){ACS.tfa=r;$("#tfa-box").innerHTML='

'+esc(t("tfa_secret"))+'

'+esc(r.secret)+''+(REAL?'
':'')+'
'+(REAL?'':''+esc(t("proto_tag"))+'')+'
'+(REAL?'':'

'+esc(t("tfa_proto"))+'

')+'
'; $("#tfa-go").onclick=function(){var c=$("#tfa-c").value.trim();api.confirmTwoFactor(c,REAL?$("#tfa-pw").value:"").then(function(res){var codes=res&&res.codes&&res.codes.length?res.codes:r.codes;AC.user.twoFactor=true;toast(t("tfa_done"));renderAc();$("#tfa-box").innerHTML='
'+esc(t("tfa_codes"))+'
'+(REAL?'

'+esc(t("tfa_codes_s"))+'

':'')+'
'+codes.map(function(c){return ''+esc(c)+''}).join("")+'
'},function(e){toast(e&&(e.code==="bad_code"||e.code==="invalid_code")?t("tfa_bad"):errMsg(e))})}},fail)}; var to=$("#tfa-off");if(to)to.onclick=function(){if(REAL){tfaOffForm();return}api.disableTwoFactor().then(function(){AC.user.twoFactor=false;renderAc()},fail)}; api.sessions().then(function(L){var el=$("#ses-list");if(!el)return;el.innerHTML=L.map(function(s){return '
'+esc(s.dev)+''+(s.where?esc(s.where)+' · ':'')+esc(s.cur?t("ses_this"):fmt("ses_last",{when:rel(s.at)}))+'
'+(s.cur?'':'')+'
'}).join("")}); $("#ses-out").onclick=function(){api.signOutOthers().then(function(){toast(t("ses_out_done"));renderAc()},fail)}; api.loginHistory().then(function(L){var el=$("#lh-box");if(!el)return;el.innerHTML=tbl([t("lh_when"),t("lh_dev"),t("lh_where"),t("lh_how"),t("lh_res")],L.map(function(x){return [esc(rel(x.m)),esc(x.dev),esc(x.where),esc(x.how==="code"?t("au_email"):"Google"),''+esc(x.ok?t("lh_ok"):t("lh_fail"))+'']}))}); } if(tab==="plan"&&REAL)$$("[data-cp]",body).forEach(function(b){b.onclick=function(){copyTxt(b.dataset.cp,"addr_copied")}}); if(tab==="plan"&&REAL){$$("[data-pay]",body).forEach(function(b){b.onclick=function(){payBuy(b.dataset.pay,b)}});$$("[data-pm]",body).forEach(function(b){b.onclick=function(){payPortal(b.dataset.pm,b)}});var ps=$("#pay-per",body);if(ps)ps.onchange=function(){PAY.per=Number(ps.value)===12?12:1;renderAc()}} if(tab==="plan"&&!REAL){$$("[data-plan]",body).forEach(function(b){b.onclick=function(){var tr=b.dataset.plan;if(tr==="std"&&liveSites().length>TIER.std){toast(fmt("plan_down_block",{n:liveSites().length,max:TIER.std}));return}api.updateAccount({tier:tr}).then(function(a){AC.user=a;renderAc();toast(t("plan_changed"))},fail)}}); $("#pl-per").onchange=function(){api.updateAccount({period:+this.value}).then(function(a){AC.user=a;renderAc()},fail)};$("#pl-ar").onchange=function(){api.updateAccount({autoRenew:this.checked}).then(function(a){AC.user=a;renderAc()},fail)}; $$("[data-cp]",body).forEach(function(b){b.onclick=function(){copyTxt(b.dataset.cp,"addr_copied")}}); api.invoices().then(function(L){var el=$("#inv-box");if(!el)return;el.innerHTML=L.map(function(i){return '
'+esc(i.id)+''+esc(fmtDate(new Date(i.at),{day:"numeric",month:"short",year:"numeric"}))+' · '+esc(t("plan_price_na"))+'
'+esc(t("paid"))+'
'}).join("");$$("[data-proto]",el).forEach(function(b){b.onclick=function(){toast(t("proto"))}})}); } if(tab==="notif"&&REAL)npRealLoad($("#np-box",body)); if(tab==="notif"&&!REAL){$$("[data-np]",body).forEach(function(c){c.onchange=function(){var P2=clone(u.prefs);P2[c.dataset.np]=c.checked;api.updateAccount({prefs:P2}).then(function(a){AC.user=a;toast(t("np_saved"))},function(e){c.checked=!c.checked;fail(e)})}})} if(tab==="data"){$("#dt-exp").onclick=function(){var eb=this;eb.disabled=true;api.exportData().then(function(d){eb.disabled=false;if(download(REAL?"kiwo-data.json":"kiwo-export-"+iso(TODAY)+".json",JSON.stringify(d,null,2),"application/json"))toast(t("dt_export_done"));else toast(t("proto"))},function(e){eb.disabled=false;fail(e)})}; $("#da-in").oninput=function(){$("#da-btn").disabled=this.value.trim()!=="DELETE"};$("#da-btn").onclick=function(){var b=this;b.disabled=true;api.deleteAccount(REAL?$("#da-pw").value:null,REAL&&$("#da-code")?$("#da-code").value.trim():null).then(function(){var p=$("#da-done");p.hidden=false;p.textContent=t("dt_del_done");if(REAL)setTimeout(function(){location.href="/auth"},4000)},function(e){b.disabled=false;fail(e)})}} } VIEW_RENDER.ac=renderAc; /* ================= language ================= */ function applyLang(){document.documentElement.lang=HL[lang]; $$("[data-i]").forEach(function(el){var v=S[el.dataset.i];if(v)el.textContent=v[LI[lang]]||v[0]}); $("#lang").value=lang;applyTheme(); if(!AC.user){renderAuth();return} buildNav();setCurSite();renderBadge();if(VIEW_RENDER[AC.view])VIEW_RENDER[AC.view]({tab:AC.acTab})} function saveLang(l){try{localStorage.setItem("kiwo-dash-lang",l);localStorage.setItem("kiwo-lang",HL[l]||l)}catch(e){}} function setLang(l){if(!LI.hasOwnProperty(l))return;if(REAL&&AC.user&&AC.user.lang!==l)http("PATCH","/api/auth/me",{lang:l==="ua"?"uk":l}).catch(function(){});lang=l;saveLang(l);if(AC.user)AC.user.lang=l;applyLang()} $("#lang").onchange=function(){setLang(this.value)}; /* ================= boot ================= */ function boot(u){AC.user=u;$("#auth").hidden=true;$("#shell").hidden=false;$("#tabbar").hidden=false;if(u.lang&&LI.hasOwnProperty(u.lang)&&u.lang!==lang){lang=u.lang;saveLang(lang)} if(REAL)api.notifications().then(function(L){DB.notifications=L;renderBadge()},function(){});api.listSites().then(function(L){AC.sites=REAL?L:DB.sites;if(REAL)AC.lim=RS.lim;var saved=null;try{saved=localStorage.getItem("kiwo-cur")}catch(e){}AC.cur=saved&&AC.sites.some(function(s){return s.id===saved&&!s.deletedAt})?saved:(liveSites()[0]?liveSites()[0].id:null);ED.id=null; var hv=(location.hash||"").slice(1);AC.view=/^(ms|ov|an|bk|si|sh|ac)$/.test(hv)?hv:(liveSites().length?"ov":"ms");applyLang();updOnline();go(AC.view,{force:true});if(REAL){var qs=location.search;if(/[?&]paid=1(&|$)/.test(qs))payReturn();else if(/[?&]tab=plan(&|$)/.test(qs))go("ac",{tab:"plan"})}},function(e){if(REAL)bootErr(e);else fail(e)})} try{var pickL=function(c){c=c==="uk"?"ua":c;return c&&LI.hasOwnProperty(c)?c:null};lang=pickL(localStorage.getItem("kiwo-lang"))||pickL(localStorage.getItem("kiwo-dash-lang"))||pickL((navigator.language||"").toLowerCase().slice(0,2))||lang}catch(e){} if(REAL)realBoot();else(function(){var ses=null;try{ses=JSON.parse(localStorage.getItem("kiwo-session")||"null")}catch(e){} if(ses&&ses.email){var demo=ses.email.toLowerCase()==="owner@sharp-co.example";seedDB(ses.email,demo?"Alex Owner":ses.email.split("@")[0],lang,demo);boot(clone(DB.account))} else{applyLang();renderAuth()} })(); window.kiwoApi=api; })();