1import{_ as ze}from"./4PmVc_v_.js";import{_ as De}from"./CDdF9CzP.js";import{_ as Fe}from"./DoxeulzJ.js";import{g as de,B as fe,j as ue,i as Ue,o as b,y as Q,w as i,a as e,t as u,b as s,a0 as ge,d as f,a1 as Z,L as xe,$ as ie,I as qe,n as Y,c as D,F as te,k as x,h as c,H as ye,_ as ce,D as be,f as re,C as W,z as Me,a2 as Be,u as je,E as Oe}from"./CVD3YBHf.js";import{p as se}from"./YP7OQmrh.js";import{u as Te}from"./B1iIjkWB.js";import{V as O,a as _e,b as he,d as ke,e as $e}from"./DJJZCnl0.js";import{V as S}from"./A4upYQBD.js";import{V as Ge}from"./CLebR0Xv.js";import{V as Le}from"./CSj2UWrX.js";import{V as Ce}from"./DDvQUYzx.js";import{V as Ne}from"./uX0tVbj-.js";import{V as L}from"./DYNFXihR.js";import{V as Ve,a as Ke}from"./CwVC-aUo.js";import{V as ae}from"./hidcr341.js";import{V as He}from"./5dfLtgIR.js";import{V as we}from"./DiOd-02c.js";import{V as Se}from"./C6maICEf.js";import{u as Je}from"./ytd3LELY.js";import"./nPTYJU3f.js";import"./tjrtWMLm.js";import"./BbKwezVR.js";import"./OfvZjwel.js";import"./Bc62sG5s.js";import"./RA3fEWSD.js";import"./CqHxzben.js";import"./keNbwMPv.js";import"./CSqth6Uu.js";import"./BCFh8Hif.js";import"./WhFXYx6C.js";import"./Cij_vDom.js";import"./DLctVVe0.js";const We={class:"stores-toolbar"},Qe={class:"stores-count"},Ye={class:"stores-search-row"},Xe={class:"d-flex align-center ga-3 py-1",style:{"min-width":"0"}},Ze=["src","alt","onError"],et={style:{"min-width":"0"}},tt={class:"store-url"},at=["title","onClick"],ot={class:"platform-name"},st={class:"synced-cell"},lt=["title"],nt={class:"num-cell"},it={class:"py-8 text-center text-medium-emphasis"},Ae=8,Ie=4,rt=de({__name:"StoresTable",props:{appId:{},mongoId:{},stores:{},storesTotal:{default:void 0},newStoreLink:{},loading:{type:Boolean,default:!1}},emits:["disconnect","search"],setup(G,{emit:I}){const p=G,N=I,h=x(()=>{const t=Number(p.storesTotal),a=p.stores?.length??0;return Number.isFinite(t)&&t>=0?Math.max(t,a):a}),{$toast:E}=fe(),T=Te();ue(()=>{T.ecommerces.length||T.getEcommerces()});const k=t=>(t||"").toLowerCase().replace(/[\s_-]/g,""),M=x(()=>{const t={};for(const a of T.ecommerces)a?.image&&(a._id&&(t[k(String(a._id))]=a.image),a.name&&(t[k(String(a.name))]=a.image));return t}),m=c(new Set),C=t=>{const a=k(t);return m.value.has(a)?"":M.value[a]||""},U=t=>{m.value=new Set(m.value).add(k(t))},g=c(""),_=c(1),V=x(()=>g.value.trim().length>=Ie),$=()=>{const t=g.value.trim();t.length>0&&t.length<Ie||(_.value=1,N("search",t))};Ue(g,t=>{t.trim()===""&&(_.value=1,N("search",""))});const y=new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:1}),P=new Intl.NumberFormat("en-US"),A=t=>y.format(t??0),R=t=>P.format(t??0),K=t=>t&&t.length>14?`${t.slice(0,8)}â¦${t.slice(-4)}`:t,F=t=>{if(!t)return"â";const a=new Date(t).getTime();if(Number.isNaN(a))return"â";const d=Math.round((Date.now()-a)/6e4);if(d<1)return"just now";if(d<60)return`${d} min ago`;const r=Math.round(d/60);if(r<24)return`${r} h ago`;const o=Math.round(r/24);return o<30?`${o} d ago`:new Date(t).toLocaleDateString()},z=t=>{const a=se(t);return{background:a.color,color:a.ink??"#fff"}},q=t=>t.error?{label:"Error",color:"error"}:t.active?{label:"Active",color:"success"}:{label:"Paused",color:"grey-darken-1"},B=[{title:"Store",key:"store",value:t=>t.url||"",sortable:!0},{title:"Store ID",key:"id",sortable:!0},{title:"Platform",key:"platform",value:t=>se(t.ecommerce).name,sortable:!0},{title:"Status",key:"status",value:t=>q(t).label,sortable:!0},{title:"Last synced",key:"synced",value:t=>t.updatedAt||"",sortable:!0},{title:"API calls",key:"requests",align:"end",sortable:!0},{title:"",key:"actions",align:"end",sortable:!1}],H=t=>{const a=p.mongoId?`?id=${encodeURIComponent(p.mongoId)}`:"";return`/dashboard/apps/${p.appId}/stores/${t}${a}`},j=(t,a)=>{const d=a?.item?.raw??a?.item;d?.id&&ye(H(d.id))},J=async t=>{try{await navigator.clipboard?.writeText(t),E.success("Store ID copied")}catch{}};return(t,a)=>{const d=De,r=Fe;return b(),Q(O,{rounded:"lg",border:"",flat:""},{default:i(()=>[e("div",We,[e("span",Qe,u(h.value)+" "+u(h.value===1?"store":"stores"),1),e("div",Ye,[s(d,{modelValue:g.value,"onUpdate:modelValue":a[0]||(a[0]=o=>g.value=o),placeholder:"Search by URL, ID, platform, or status",class:"stores-search",onKeydown:ge($,["enter"])},null,8,["modelValue"]),s(S,{color:"primary",variant:"flat","prepend-icon":"mdi-magnify",disabled:!V.value,onClick:$},{default:i(()=>[...a[4]||(a[4]=[f(" Search ",-1)])]),_:1}
1,8,["disabled"])]),s(S,{color:"primary","prepend-icon":"mdi-plus",class:"ms-auto",href:G.newStoreLink,target:"_blank",rel:"noopener"},{default:i(()=>[...a[5]||(a[5]=[f(" New store ",-1)])]),_:1},8,["href"])]),s(Ge,{page:_.value,"onUpdate:page":a[2]||(a[2]=o=>_.value=o),headers:B,items:G.stores,loading:G.loading,"items-per-page":Ae,"item-value":"id",hover:"","hide-default-footer":"",class:"stores-table","onClick:row":j},{"item.store":i(({item:o})=>[e("div",Xe,[e("span",{class:Y(["platform-tile",{"has-img":C(o.ecommerce)}]),style:qe(C(o.ecommerce)?{}:z(o.ecommerce))},[C(o.ecommerce)?(b(),D("img",{key:0,src:C(o.ecommerce),alt:ie(se)(o.ecommerce).name,class:"platform-img",onError:l=>U(o.ecommerce)},null,40,Ze)):(b(),D(te,{key:1},[f(u(ie(se)(o.ecommerce).initial),1)],64))],6),e("div",et,[e("div",tt,u(o.url||"â"),1)])])]),"item.id":i(({item:o})=>[e("button",{type:"button",class:"id-chip",title:o.id,onClick:Z(l=>J(o.id),["stop"])},[f(u(K(o.id))+" ",1),s(L,{icon:"mdi-content-copy",size:"13"})],8,at)]),"item.platform":i(({item:o})=>[e("span",ot,u(ie(se)(o.ecommerce).name),1)]),"item.status":i(({item:o})=>[s(Ne,{color:q(o).color,variant:"tonal",size:"small",class:"status-chip"},{default:i(()=>[a[6]||(a[6]=e("span",{class:"status-dot"},null,-1)),f(" "+u(q(o).label),1)]),_:2},1032,["color"])]),"item.synced":i(({item:o})=>[e("span",st,u(F(o.updatedAt)),1)]),"item.requests":i(({item:o})=>[e("span",{title:`${R(o.requests??0)} API calls`},[e("span",nt,u(A(o.requests??0)),1),a[7]||(a[7]=e("span",{class:"num-unit"},"calls",-1))],8,lt)]),"item.actions":i(({item:o})=>[e("div",{class:"d-flex align-center justify-end ga-1",onClick:a[1]||(a[1]=Z(()=>{},["stop"]))},[s(Ce,{text:"Edit",location:"top"},{activator:i(({props:l})=>[s(S,xe(l,{icon:"mdi-pencil-outline",size:"small",variant:"text",to:H(o.id),"aria-label":`Edit ${o.url}`}),null,16,["to","aria-label"])]),_:2},1024),s(Ce,{text:"Disconnect",location:"top"},{activator:i(({props:l})=>[s(S,xe(l,{icon:"mdi-delete-outline",size:"small",variant:"text","aria-label":`Disconnect ${o.url}`,onClick:ee=>N("disconnect",o)}),null,16,["aria-label","onClick"])]),_:2},1024)])]),"no-data":i(()=>[e("div",it," No stores match â"+u(g.value)+"â. ",1)]),loading:i(()=>[s(Le,{type:"table-row@4"})]),_:1},8,["page","items","loading"]),s(r,{page:_.value,"onUpdate:page":a[3]||(a[3]=o=>_.value=o),"page-size":Ae,total:h.value,noun:"stores"},null,8,["page","total"])]),_:1})}}}),dt=ce(rt,[["__scopeId","data-v-dd21fc7d"]]),ut={class:"d-flex flex-column ga-4"},ct={class:"pa-5"},pt={class:"copy-field"},mt={class:"copy-value"},vt={class:"pa-5"},ft={class:"d-flex flex-column ga-5"},gt={class:"icon-preview"},yt=["src"],bt={class:"icon-upload-body"},_t={class:"icon-upload-title"},ht={class:"icon-upload-hint"},kt={class:"d-flex flex-column ga-4"},$t={class:"pa-5"},wt={class:"d-flex flex-column ga-5"},St={class:"pa-5"},xt={class:"d-flex flex-column ga-5"},Ct={class:"d-flex justify-space-between ga-3"},Vt={class:"d-flex align-center ga-3"},At=de({__name:"AppSetupForm",props:{app:{}},emits:["saved","deleted"],setup(G,{emit:I}){const p=G,N=I,h=be(),{$apiFetch:E,$toast:T,$eventBus:k,$uploadFile:M}=fe(),m=x(()=>String(p.app?.app_id||h.params.id)),C=x(()=>m.value),U=c(""),g=c(""),_=c(""),V=c(""),$=c(""),y=c(""),P=c(""),A=c(""),R=c(null),K=c(""),F=c(null),z=c(!1),q=c(!1),B=c(!1),H=c(!1),j=c(!1),J=x(()=>q.value&&!U.value.trim()?"App name is required.":""),t=x(()=>q.value&&!V.value.trim()?"App URL is required.":""),a=x(()=>q.value&&!$.value.trim()?"Redirect URL is required.":""),d=x(()=>!!(U.value.trim()&&V.value.trim()&&$.value.trim()));function r(){const v=p.app||{};U.value=v.name||"",g.value=v.short_description||"",_.value=v.description||"",V.value=v.settings?.app_url||"",$.value=v.settings?.redirect_url||"",y.value=v.settings?.domain_url||"",P.value=v.settings?.cname||"",A.value=v.settings?.image||"",R.value=null,K.value=""}function o(){F.value?.click()}function l(v){if(v){if(!/\.(jpg|jpeg|png)$/i.test(v.name)){T.error("Only JPG and PNG images are allowed");return}R.value=v,K.value=v.name,A.value=URL.createObjectURL(v)}}function ee(v){const n=v.target;l(n.files?.[0])}function pe(v){z.value=!1,l(v.dataTransfer?.files?.[0])}function me(){R.value=null,K.value="",A.value="",F.value&&(F.value.value="")}function ve(v){v.target.src="/images/image404.svg"}async function X(v,n){try{await navigator.clipboard?.writeText(v),T.success(n)}catch{}}const le=c(!1);async function Ee(){await X(C.value,"API Id copied"),le.value=!0,setTimeout(()=>le.value=!1,1600)}async function Pe(){if(q.value=!0,!d.value){T.error("Please complete the required fields");return}B.value=!0;try{const v=p.app.settings?.domain_url||"",n=y.value!==v,w={name:U.value,description:_.value,short_description:g.value,settings:{redirect_url:$.value,app_url:V.value,domain_url:y.value,image:A.value,cname:P.value},domain_id:p.app.domain_id||null,own_domain:n?!!y.value:!!P.value,active:!0};if(R.value){const oe=await M(`/api/apps/img/upload/${m.value}`,R.value);w.settings.image=oe.Location||oe.url||oe}let ne;if(n){const oe=y.value?{updateDomain:!0}:{deleteDomain:!0};
1ne=await E(`/api/apps/${m.value}/domain`,{body:JSON.stringify(w),query:oe,method:"PUT"})}else ne=await E(`/api/apps/${m.value}?updateDomain=false`,{body:JSON.stringify(w),method:"PUT"});T.success("Saved successfully"),k?.emit?.("submit",ne),N("saved",ne)}catch(v){W(v)}finally{B.value=!1}}async function Re(){H.value=!0;try{const v=await E(`/api/apps/${m.value}`,{method:"DELETE"});T.success(v?.message||"App deleted"),k?.emit?.("submit",{deleted:!0}),N("deleted"),ye("/dashboard/apps")}catch(v){W(v)}finally{H.value=!1,j.value=!1}}return Ue(()=>p.app,r,{deep:!0}),ue(r),(v,n)=>(b(),D("div",ut,[s(O,{rounded:"lg",border:"",flat:""},{default:i(()=>[e("div",ct,[n[11]||(n[11]=e("div",{class:"section-label"},"App credentials",-1)),n[12]||(n[12]=e("label",{class:"field-label"},"API Id",-1)),e("div",pt,[e("span",mt,u(C.value),1),e("button",{type:"button",class:Y(["copy-btn",{copied:le.value}]),"aria-label":"Copy API Id",onClick:Ee},[s(L,{icon:le.value?"mdi-check-bold":"mdi-content-copy",size:"18"},null,8,["icon"])],2)])])]),_:1}),s(Ke,null,{default:i(()=>[s(Ve,{cols:"12",md:"6"},{default:i(()=>[s(O,{rounded:"lg",border:"",flat:"",height:"100%"},{default:i(()=>[e("div",vt,[n[18]||(n[18]=e("div",{class:"section-label"},"App details",-1)),e("div",ft,[e("div",null,[n[13]||(n[13]=e("label",{class:"field-label"},"App name *",-1)),s(ae,{modelValue:U.value,"onUpdate:modelValue":n[0]||(n[0]=w=>U.value=w),variant:"outlined",density:"comfortable","prepend-inner-icon":"mdi-package-variant","hide-details":"",error:!!J.value},null,8,["modelValue","error"]),e("div",{class:Y(["field-hint",{"field-error":!!J.value}])},u(J.value||"This will be the name used for your application in our App Store."),3)]),e("div",null,[n[14]||(n[14]=e("label",{class:"field-label"},"App icon",-1)),e("div",{class:Y(["icon-upload",{dragging:z.value}]),role:"button",tabindex:"0",onClick:o,onKeydown:ge(o,["enter"]),onDragover:n[1]||(n[1]=Z(w=>z.value=!0,["prevent"])),onDragleave:n[2]||(n[2]=Z(w=>z.value=!1,["prevent"])),onDrop:Z(pe,["prevent"])},[e("span",gt,[A.value?(b(),D("img",{key:0,src:A.value,alt:"App icon preview",onError:ve},null,40,yt)):(b(),Q(L,{key:1,icon:"mdi-image-outline",size:"26"}))]),e("div",bt,[e("div",_t,u(A.value?"Replace icon":"Drag & drop, or click to upload"),1),e("div",ht,u(K.value||"PNG or JPG · square · up to 1 MB"),1)]),A.value?(b(),Q(S,{key:0,icon:"mdi-close",size:"small",variant:"text","aria-label":"Remove icon",onClick:Z(me,["stop"])})):re("",!0),e("input",{ref_key:"fileInput",ref:F,type:"file",accept:"image/png,image/jpeg",hidden:"",onChange:ee},null,544)],34)]),e("div",null,[n[15]||(n[15]=e("label",{class:"field-label"},"Short description",-1)),s(ae,{modelValue:g.value,"onUpdate:modelValue":n[3]||(n[3]=w=>g.value=w),variant:"outlined",density:"comfortable","prepend-inner-icon":"mdi-file-document-outline","hide-details":""},null,8,["modelValue"]),n[16]||(n[16]=e("div",{class:"field-hint"},"Describe what your app does in 10 words or less.",-1))]),e("div",null,[s(He,{modelValue:_.value,"onUpdate:modelValue":n[4]||(n[4]=w=>_.value=w),label:"Description",variant:"outlined",rows:"4","auto-grow":"","hide-details":""},null,8,["modelValue"]),n[17]||(n[17]=e("div",{class:"field-hint"},"Long description of your app (optional).",-1))])])])]),_:1})]),_:1}),s(Ve,{cols:"12",md:"6"},{default:i(()=>[e("div",kt,[s(O,{rounded:"lg",border:"",flat:""},{default:i(()=>[e("div",$t,[n[21]||(n[21]=e("div",{class:"section-label"},"URLs",-1)),e("div",wt,[e("div",null,[n[19]||(n[19]=e("label",{class:"field-label"},"App URL *",-1)),s(ae,{modelValue:V.value,"onUpdate:modelValue":n[5]||(n[5]=w=>V.value=w),variant:"outlined",density:"comfortable","prepend-inner-icon":"mdi-web",placeholder:"https://yourapp.com","hide-details":"",error:!!t.value},null,8,["modelValue","error"]),e("div",{class:Y(["field-hint",{"field-error":!!t.value}])},u(t.value||"Add the URL of your website."),3)]),e("div",null,[n[20]||(n[20]=e("label",{class:"field-label"},"Redirect URL *",-1)),s(ae,{modelValue:$.value,"onUpdate:modelValue":n[6]||(n[6]=w=>$.value=w),variant:"outlined",density:"comfortable","prepend-inner-icon":"mdi-link-variant",placeholder:"https://ecartapi.com/integrations","hide-details":"",error:!!a.value},null,8,["modelValue","error"]),e("div",{class:Y(["field-hint",{"f
1ield-error":!!a.value}])},u(a.value||"When a store completes the OAuth process EcartApi will redirect to this URL and send as query params the store Access Token and other important information. You can use our URL to start testing: https://app.ecartapi.com/integrations (Very Important!)."),3)])])])]),_:1}),s(O,{rounded:"lg",border:"",flat:""},{default:i(()=>[e("div",St,[n[26]||(n[26]=e("div",{class:"section-label"},"Advanced settings",-1)),e("div",xt,[e("div",null,[n[22]||(n[22]=e("label",{class:"field-label"},"Integration page domain",-1)),s(ae,{modelValue:y.value,"onUpdate:modelValue":n[7]||(n[7]=w=>y.value=w),variant:"outlined",density:"comfortable","prepend-inner-icon":"mdi-domain",placeholder:"oauth.ecartapi.com","hide-details":""},null,8,["modelValue"]),n[23]||(n[23]=e("div",{class:"field-hint"}," White-label your app with your own domain. The domain must have SSL. Costs $19.99 USD / month (optional). ",-1))]),e("div",null,[n[24]||(n[24]=e("label",{class:"field-label"},"DNS address",-1)),s(ae,{"model-value":P.value,variant:"outlined",density:"comfortable","prepend-inner-icon":"mdi-server",placeholder:"cname.ecartapi.com",disabled:"","hide-details":""},null,8,["model-value"]),n[25]||(n[25]=e("div",{class:"field-hint"}," A unique CNAME address to point your domain's DNS at. Be careful not to share it. ",-1))])])])]),_:1})])]),_:1})]),_:1}),e("div",Ct,[s(S,{variant:"outlined",color:"error","prepend-icon":"mdi-trash-can-outline",onClick:n[8]||(n[8]=w=>j.value=!0)},{default:i(()=>[...n[27]||(n[27]=[f(" Delete app ",-1)])]),_:1}),s(S,{color:"primary","prepend-icon":"mdi-check",loading:B.value,onClick:Pe},{default:i(()=>[...n[28]||(n[28]=[f(" Save changes ",-1)])]),_:1},8,["loading"])]),s(Se,{modelValue:j.value,"onUpdate:modelValue":n[10]||(n[10]=w=>j.value=w),"max-width":"440"},{default:i(()=>[s(O,{rounded:"lg"},{default:i(()=>[s(_e,null,{default:i(()=>[e("div",Vt,[s(we,{color:"error",variant:"tonal",size:"40"},{default:i(()=>[s(L,{icon:"mdi-alert-outline"})]),_:1}),s(he,{class:"pa-0 text-subtitle-1 font-weight-bold"},{default:i(()=>[f("Delete "+u(U.value)+"?",1)]),_:1})])]),_:1}),s(ke,{class:"text-body-2 text-medium-emphasis"},{default:i(()=>[...n[29]||(n[29]=[f(" This permanently removes the app, its API credentials and store connections. This action cannot be undone. ",-1)])]),_:1}),s($e,{class:"justify-end px-4 pb-4"},{default:i(()=>[s(S,{variant:"text",color:"medium-emphasis",onClick:n[9]||(n[9]=w=>j.value=!1)},{default:i(()=>[...n[30]||(n[30]=[f("Cancel",-1)])]),_:1}),s(S,{color:"error",variant:"flat","prepend-icon":"mdi-delete",loading:H.value,onClick:Re},{default:i(()=>[...n[31]||(n[31]=[f(" Delete app ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"])]))}}),It=ce(At,[["__scopeId","data-v-08a9794d"]]),Dt={class:"es-header"},Ut={class:"es-subtitle"},Tt={class:"es-toolbar"},Lt={class:"es-count"},Nt={class:"es-bulk"},Et=["disabled"],Pt=["disabled"],Rt={key:0,class:"pa-6"},zt={key:1,class:"es-grid"},Ft=["onClick","onKeydown"],qt=["src","alt","onError"],Mt={class:"es-info"},Bt={class:"es-name"},jt={class:"es-auth"},Ot=["aria-checked","aria-label","disabled","onClick"],Gt={key:2,class:"py-10 text-center text-medium-emphasis"},Kt={class:"d-flex align-center ga-3"},Ht=de({__name:"EcommerceSetupList",props:{app:{}},setup(G){const I=G,{$apiFetch:p,$toast:N}=fe(),h=be(),E=String(h.params.id),T=Te(),k=c(!0),M=c(""),m=Be({}),C=c(new Set),U=c(new Set),g=c(!1),_=c(!1),V=c(null),$=x(()=>T.ecommerces),y=x(()=>$.value.length),P=x(()=>Object.values(m).filter(Boolean).length),A=x(()=>{const t=M.value.trim().toLowerCase();return t?$.value.filter(a=>String(a.name||"").toLowerCase().includes(t)):$.value}),R=t=>(t||"?").charAt(0).toUpperCase(),K=t=>Array.isArray(t.scopes)&&t.scopes.length?"OAuth · scopes":Array.isArray(t.oauth_pattern)&&t.oauth_pattern.length?"OAuth":"API keys",F=t=>{if(!t.required_app_keys)return!1;const a=I.app?.oauth?I.app.oauth[String(t.name).toLowerCase()]:null;return a?!(t.oauth_pattern||[]).some(d=>Object.keys(a).includes(d)):!0},z=t=>{const a=I.app?._id?String(I.app._id):"",d=a?`?id=${encodeURIComponent(a)}`:"";ye(`/dashboard/apps/${E}
1/settings/${t.name}${d}`)},q=()=>{V.value&&z(V.value),_.value=!1},B=(t,a)=>p(`/api/apps/${I.app?.app_id||E}/ecommerce`,{method:"PUT",body:JSON.stringify({active:a,ecommerce:t._id})}),H=async(t,a)=>{const d=!!a;if(d&&F(t)){V.value=t,_.value=!0;return}const r=!!m[t._id];m[t._id]=d,C.value=new Set(C.value).add(t._id);try{await B(t,d),N.success(`${t.name} ${d?"enabled":"disabled"}`)}catch(o){m[t._id]=r,W(o)}finally{const o=new Set(C.value);o.delete(t._id),C.value=o}},j=async()=>{const t=$.value.filter(d=>!m[d._id]&&!F(d)),a=$.value.filter(d=>!m[d._id]&&F(d)).length;if(!t.length){a&&N.success(`${a} platform(s) need app keys first`);return}g.value=!0;try{(await Promise.allSettled(t.map(r=>B(r,!0)))).forEach((r,o)=>{r.status==="fulfilled"&&(m[t[o]._id]=!0)}),N.success(a?`Enabled available platforms · ${a} need app keys first`:"All platforms enabled")}catch(d){W(d)}finally{g.value=!1}},J=async()=>{const t=$.value.filter(a=>m[a._id]);if(t.length){g.value=!0;try{(await Promise.allSettled(t.map(d=>B(d,!1)))).forEach((d,r)=>{d.status==="fulfilled"&&(m[t[r]._id]=!1)}),N.success("All platforms disabled")}catch(a){W(a)}finally{g.value=!1}}};return ue(async()=>{try{T.ecommerces.length||await T.getEcommerces(),(I.app?.ecommerces??[]).forEach(a=>{a?._id&&(m[a._id]=!0)})}catch(t){W(t)}finally{k.value=!1}}),(t,a)=>{const d=De;return b(),Q(O,{rounded:"lg",border:"",flat:""},{default:i(()=>[e("div",Dt,[a[6]||(a[6]=e("div",{class:"es-title"},"E-commerce platforms",-1)),e("p",Ut,[a[5]||(a[5]=f(" These are the e-commerces ",-1)),e("strong",null,u(G.app?.name),1),f(" offers in its OAuth flow â the same set you picked when creating the app. Turn one off to hide it from your integration page, or open it to set its app credentials and scopes · "+u(P.value)+" of "+u(y.value)+" enabled. ",1)]),e("div",Tt,[s(d,{modelValue:M.value,"onUpdate:modelValue":a[0]||(a[0]=r=>M.value=r),placeholder:"Search platforms",class:"es-search"},null,8,["modelValue"]),e("span",Lt,u(P.value)+" / "+u(y.value)+" enabled",1),e("div",Nt,[e("button",{type:"button",class:"es-bulk-btn",disabled:g.value,onClick:j}," Select all ",8,Et),e("button",{type:"button",class:"es-bulk-btn",disabled:g.value,onClick:J}," Clear ",8,Pt)])])]),k.value?(b(),D("div",Rt,[s(Le,{type:"list-item-avatar-two-line@6"})])):A.value.length?(b(),D("div",zt,[(b(!0),D(te,null,Me(A.value,r=>(b(),D("div",{key:r._id,class:Y(["es-row",{"is-off":!m[r._id]}]),role:"button",tabindex:"0",onClick:o=>z(r),onKeydown:ge(o=>z(r),["enter"])},[e("span",{class:Y(["platform-tile",{"has-img":!!r.image}])},[r.image&&!U.value.has(r._id)?(b(),D("img",{key:0,src:r.image,alt:r.name,class:"platform-img",onError:o=>U.value=new Set(U.value).add(r._id)},null,40,qt)):(b(),D(te,{key:1},[f(u(R(r.name)),1)],64))],2),e("span",Mt,[e("span",Bt,u(r.name),1),e("span",jt,u(K(r)),1)]),e("span",{class:"es-switch",onClick:a[1]||(a[1]=Z(()=>{},["stop"])),onKeydown:a[2]||(a[2]=Z(()=>{},["stop"]))},[e("button",{type:"button",role:"switch","aria-checked":!!m[r._id],"aria-label":`Toggle ${r.name}`,class:Y(["ds-switch",{"is-on":m[r._id]}]),disabled:C.value.has(r._id)||g.value,onClick:o=>H(r,!m[r._id])},[...a[7]||(a[7]=[e("span",{class:"ds-switch-track"},null,-1),e("span",{class:"ds-switch-thumb"},null,-1)])],10,Ot)],32),s(L,{icon:"mdi-chevron-right",size:"20",class:"es-chevron"})],42,Ft))),128))])):(b(),D("div",Gt," No platforms match â"+u(M.value)+"â. ",1)),s(Se,{modelValue:_.value,"onUpdate:modelValue":a[4]||(a[4]=r=>_.value=r),"max-width":"440"},{default:i(()=>[s(O,{rounded:"lg"},{default:i(()=>[s(_e,null,{default:i(()=>[e("div",Kt,[s(we,{color:"warning",variant:"tonal",size:"40"},{default:i(()=>[s(L,{icon:"mdi-key-alert-outline"})]),_:1}),s(he,{class:"pa-0 text-subtitle-1 font-weight-bold"},{default:i(()=>[f(" Set up "+u(V.value?.name),1)]),_:1})])]),_:1}),s(ke,{class:"text-body-2 text-medium-emphasis"},{default:i(()=>[f(" To activate "+u(V.value?.name)+" you must add your own app developer keys first. ",1)]),_:1}),s($e,{class:"justify-end px-4 pb-4"},{default:i(()=>[s(S,{variant:"text",color:"medium-emphasis",onClick:a[3]||(a[3]=r=>_.value=!1)},{default:i(()=>[...a[8]||(a[8]=[f("Cancel",-1)])]),_:1}),s(S,{color:"primary",variant:"flat","prepend-icon":"mdi-cog-outline",onClick:q},{default:i(()=>
1[...a[9]||(a[9]=[f(" Set up keys ",-1)])]),_:1})]),_:1})]),_:1})]),_:1},8,["modelValue"])]),_:1})}}}),Jt=ce(Ht,[["__scopeId","data-v-1c4fe493"]]),Wt={class:"app-detail-page"},Qt={class:"crumbs mb-3"},Yt={class:"crumb-current"},Xt={class:"empty-state"},Zt={class:"empty-icon"},ea={class:"detail-header mb-5"},ta={class:"d-flex flex-wrap align-center justify-space-between ga-4"},aa={class:"detail-title"},oa={class:"app-tile"},sa={class:"detail-actions"},la={class:"summary-chips mb-6"},na={class:"sum-chip"},ia={class:"sum-value"},ra={class:"sum-chip"},da={class:"sum-value"},ua={class:"sum-chip"},ca={class:"sum-value-plain"},pa={class:"empty-state"},ma={class:"empty-icon"},va={class:"empty-body"},fa={class:"d-flex align-center ga-3 mb-4"},ga={class:"section-sub"},ya={class:"d-flex align-center ga-3 mb-4"},ba={class:"section-sub"},_a={class:"d-flex align-center ga-3"},ha=de({__name:"index",setup(G){je({title:"App detail"});const I=be(),p=Je(),N=Oe(),h=String(I.params.id),E=o=>!!(o&&/^[a-f\d]{24}$/i.test(o)),k=c((()=>{const o=I.query.id?String(I.query.id):"";if(E(o))return o;const l=p.app?._id;if(l&&String(p.app?.app_id)===h&&E(String(l)))return String(l);if(typeof sessionStorage<"u"){const ee=sessionStorage.getItem(`app_mongo_id:${h}`)||"";if(E(ee))return ee}})()),M=o=>{E(o)&&(k.value=o,typeof sessionStorage<"u"&&sessionStorage.setItem(`app_mongo_id:${h}`,o))},m=c(!0),C=c(!1),U=I.hash==="#ecommerce"?"ecommerce":I.hash==="#setup"?"setup":"stores",g=c(U),_=c(!1),V=c(!1),$=c(null),y=x(()=>p.app&&p.app.app_id?p.app:null),P=x(()=>p.appStores??[]),A=x(()=>{const o=Number(p.appStoresCount),l=P.value.length;return Number.isFinite(o)&&o>=0?Math.max(o,l):l}),R=c(!1),K=x(()=>A.value>0||P.value.length>0),F=x(()=>!m.value&&!y.value),z=x(()=>{const o=y.value?.settings?.domain_url;return o?`https://${o}?back_device=true`:`${N.public.OAUTH_URL||""}/${h}`}),q=x(()=>{const o=k.value?`?id=${encodeURIComponent(k.value)}`:"";return`/dashboard/apps/${h}/webhooks${o}`}),B=new Intl.NumberFormat("en-US",{notation:"compact",maximumFractionDigits:1}),H=o=>B.format(o??0),j=o=>{if(!o)return"â";const l=new Date(o);return Number.isNaN(l.getTime())?"â":l.toLocaleDateString("en-US",{month:"short",day:"numeric",year:"numeric"})},J=o=>{g.value=g.value===o?"stores":o},t=o=>{$.value=o,_.value=!0},a=async()=>{if($.value){V.value=!0;try{await p.DeleteStore(h,$.value.id),_.value=!1,$.value=null}catch(o){W(o)}finally{V.value=!1}}},d=async()=>{try{await p.GetApp(h,k.value),M(p.app?._id)}catch(o){W(o)}},r=async o=>{R.value=o.trim().length>0,C.value=!0;try{await p.GetAppStores(h,o,k.value)}catch(l){W(l)}finally{C.value=!1}};return ue(async()=>{if(p.app={},p.invalidateStoresCache(h,k.value),p.appStores=[],p.appStoresCount=0,R.value=!1,!h||h==="undefined"){m.value=!1;return}m.value=!0;try{await Promise.all([p.GetApp(h,k.value),p.GetAppStores(h,"",k.value)]),M(p.app?._id||k.value)}catch(o){W(o)}finally{m.value=!1}}),(o,l)=>{const ee=ze,pe=dt,me=It,ve=Jt;return b(),D("div",Wt,[e("div",Qt,[s(ee,{to:"/dashboard/apps",class:"crumb-link"},{default:i(()=>[...l[6]||(l[6]=[f("My apps",-1)])]),_:1}),s(L,{icon:"mdi-chevron-right",size:"16",class:"crumb-sep"}),e("span",Yt,u(y.value?.name||"â¦"),1)]),F.value?(b(),Q(O,{key:0,rounded:"lg",border:"",flat:""},{default:i(()=>[e("div",Xt,[e("span",Zt,[s(L,{icon:"mdi-package-variant",size:"36"})]),l[8]||(l[8]=e("div",{class:"empty-title"},"This app no longer exists",-1)),l[9]||(l[9]=e("p",{class:"empty-body"},"It may have been deleted, or the link is incorrect.",-1)),s(S,{color:"primary",variant:"flat","prepend-icon":"mdi-arrow-left",class:"mt-3",to:"/dashboard/apps"},{default:i(()=>[...l[7]||(l[7]=[f(" Back to my apps ",-1)])]),_:1})])]),_:1})):(b(),D(te,{key:1},[e("div",ea,[e("div",ta,[e("h1",aa,[e("span",oa,[s(L,{icon:"mdi-package-variant",size:"26"})]),f(" "+u(y.value?.name||"Loadingâ¦"),1)]),s(Ne,{color:y.value?.active?"success":"grey-darken-1",variant:"tonal",class:"status-chip"},{default:i(()=>[l[10]||(l[10]=e("span",{class:"status-dot"},null,-1)),f(" "+u(y.value?.active?"Active":"Paused"),1)]),_:1},8,["color"])]),e("div",sa,[s(S,{variant:g.value==="setup"?"flat":"outlined",color:"primary","prepe
1nd-icon":"mdi-cog",onClick:l[0]||(l[0]=X=>J("setup"))},{default:i(()=>[...l[11]||(l[11]=[f(" App setup ",-1)])]),_:1},8,["variant"]),s(S,{variant:g.value==="ecommerce"?"flat":"outlined",color:"primary","prepend-icon":"mdi-view-grid-outline",onClick:l[1]||(l[1]=X=>J("ecommerce"))},{default:i(()=>[...l[12]||(l[12]=[f(" E-commerce setup ",-1)])]),_:1},8,["variant"]),s(S,{variant:"outlined",color:"primary","prepend-icon":"mdi-webhook",to:q.value},{default:i(()=>[...l[13]||(l[13]=[f(" Stores Webhooks ",-1)])]),_:1},8,["to"])])]),e("div",la,[e("span",na,[s(L,{icon:"mdi-chart-line",size:"16",color:"primary"}),l[14]||(l[14]=e("span",{class:"sum-label"},"API calls",-1)),e("strong",ia,u(H(y.value?.month_requests??0)),1)]),e("span",ra,[s(L,{icon:"mdi-storefront-outline",size:"16",color:"primary"}),l[15]||(l[15]=e("span",{class:"sum-label"},"Stores",-1)),e("strong",da,u(A.value),1)]),e("span",ua,[s(L,{icon:"mdi-calendar-blank-outline",size:"16",class:"text-medium-emphasis"}),l[16]||(l[16]=e("span",{class:"sum-label"},"Created",-1)),e("strong",ca,u(j(y.value?.created_at)),1)])]),g.value==="stores"?(b(),D(te,{key:0},[m.value||C.value||K.value||R.value?(b(),Q(pe,{key:0,"app-id":ie(h),"mongo-id":k.value,stores:P.value,"stores-total":A.value,"new-store-link":z.value,loading:m.value||C.value,onDisconnect:t,onSearch:r},null,8,["app-id","mongo-id","stores","stores-total","new-store-link","loading"])):m.value?re("",!0):(b(),Q(O,{key:1,rounded:"lg",border:"",flat:""},{default:i(()=>[e("div",pa,[e("span",ma,[s(L,{icon:"mdi-storefront-outline",size:"36"})]),l[18]||(l[18]=e("div",{class:"empty-title"},"No stores connected yet",-1)),e("p",va," Connect your first store to "+u(y.value?.name)+" to start syncing through EcartAPI. ",1),s(S,{color:"primary","prepend-icon":"mdi-plus",class:"mt-3",href:z.value,target:"_blank",rel:"noopener"},{default:i(()=>[...l[17]||(l[17]=[f(" Connect a store ",-1)])]),_:1},8,["href"])])]),_:1}))],64)):g.value==="setup"?(b(),D(te,{key:1},[e("div",fa,[s(S,{icon:"mdi-arrow-left",variant:"outlined",size:"small",onClick:l[2]||(l[2]=X=>g.value="stores")}),e("div",null,[l[19]||(l[19]=e("div",{class:"section-title"},"App setup",-1)),e("div",ga,"General settings for "+u(y.value?.name)+" â these apply across every connected store.",1)])]),y.value?(b(),Q(me,{key:0,app:y.value,onSaved:d},null,8,["app"])):re("",!0)],64)):(b(),D(te,{key:2},[e("div",ya,[s(S,{icon:"mdi-arrow-left",variant:"outlined",size:"small",onClick:l[3]||(l[3]=X=>g.value="stores")}),e("div",null,[l[20]||(l[20]=e("div",{class:"section-title"},"E-commerce setup",-1)),e("div",ba,"Choose which platforms can integrate with "+u(y.value?.name)+", then open one to set its credentials and scopes.",1)])]),y.value?(b(),Q(ve,{key:0,app:y.value},null,8,["app"])):re("",!0)],64)),s(Se,{modelValue:_.value,"onUpdate:modelValue":l[5]||(l[5]=X=>_.value=X),"max-width":"440"},{default:i(()=>[s(O,{rounded:"lg"},{default:i(()=>[s(_e,null,{default:i(()=>[e("div",_a,[s(we,{color:"error",variant:"tonal",size:"40"},{default:i(()=>[s(L,{icon:"mdi-alert-outline"})]),_:1}),s(he,{class:"pa-0 text-subtitle-1 font-weight-bold"},{default:i(()=>[...l[21]||(l[21]=[f(" Disconnect this store? ",-1)])]),_:1})])]),_:1}),s(ke,{class:"text-body-2 text-medium-emphasis"},{default:i(()=>[...l[22]||(l[22]=[f(" This removes the store connection and its credentials. Sync activity will stop immediately. ",-1)])]),_:1}),s($e,{class:"justify-end px-4 pb-4"},{default:i(()=>[s(S,{variant:"text",color:"medium-emphasis",onClick:l[4]||(l[4]=X=>_.value=!1)},{default:i(()=>[...l[23]||(l[23]=[f("Cancel",-1)])]),_:1}),s(S,{color:"error",variant:"flat","prepend-icon":"mdi-delete",loading:V.value,onClick:a},{default:i(()=>[...l[24]||(l[24]=[f(" Disconnect ",-1)])]),_:1},8,["loading"])]),_:1})]),_:1})]),_:1},8,["modelValue"])],64))])}}}),Za=ce(ha,[["__scopeId","data-v-59edba2b"]]);export{Za as default};
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.