2 lines
12 KiB
JavaScript
2 lines
12 KiB
JavaScript
import{d as B,o as F,c as d,a as e,J as I,g as v,a3 as L,F as N,P as J,H as b,D as a,f,G as y,m as M,b as z,a1 as P,r,B as g,q as n,t as R}from"./index-DnbYEqLr.js";const q={class:"pb-6"},G={class:"mb-8"},H={class:"flex items-center gap-3 mb-2"},W={class:"glass-card p-6 mb-6"},Y={class:"space-y-4"},K={class:"grid grid-cols-1 md:grid-cols-2 gap-4"},Q=["value"],X=["disabled"],Z={class:"glass-card p-6 mb-6"},ee={class:"flex items-center justify-between mb-4"},te=["disabled"],se={key:0,class:"text-white/50 text-sm py-8 text-center"},le={key:1,class:"text-white/50 text-sm py-8 text-center"},ae={key:2,class:"space-y-3"},ie=["onClick"],oe={class:"flex items-center justify-between mb-2"},ne={class:"flex items-center gap-2"},de={class:"text-sm font-medium text-white"},re={class:"text-xs text-white/40 font-mono"},ue={class:"text-xs text-white/50 space-y-0.5"},ce={class:"font-mono"},ve={class:"font-mono"},pe={class:"glass-card p-6 mb-6"},xe={class:"space-y-4"},me={class:"flex items-center gap-4"},be=["disabled"],fe={key:0,class:"flex items-center gap-2"},ye={class:"relative glass-card p-6 max-w-2xl w-full max-h-[80vh] overflow-y-auto"},ge={class:"flex items-center justify-between mb-4"},we={class:"space-y-3 text-sm"},he={class:"bg-black/20 rounded-lg p-3"},ke={class:"text-white font-medium"},Ce={class:"bg-black/20 rounded-lg p-3"},_e={class:"text-white/80 font-mono text-xs break-all"},Ie={class:"bg-black/20 rounded-lg p-3"},De={class:"text-white/80 font-mono text-xs break-all"},je={class:"bg-black/20 rounded-lg p-3"},Ve={class:"text-white/80 font-mono text-xs break-all"},Se={key:0,class:"bg-black/20 rounded-lg p-3"},Ne={class:"text-white/80 font-mono text-xs whitespace-pre-wrap"},Je={class:"grid grid-cols-2 gap-3"},Te={class:"bg-black/20 rounded-lg p-3"},Ue={class:"text-white/80 text-xs"},Ee={class:"bg-black/20 rounded-lg p-3"},$e={class:"text-white/80 text-xs"},Oe={class:"bg-black/20 rounded-lg p-3"},Ae={class:"text-white/80 text-xs"},Be={class:"text-white/60 font-mono text-xs mt-1 break-all"},Fe={class:"bg-black/20 rounded-lg p-3"},Le={class:"flex gap-3 mt-6"},Me=["disabled"],ze=B({__name:"Credentials",setup(Pe){const D=r([]),w=r([]),p=r(!1),i=r(null),j=r(!1),h=r(!1),o=r({issuerId:"",subjectDid:"",type:"NodeOperator",claimsJson:"{}",expiresAt:""}),k=r(!1),x=r(""),C=r(!1),c=r(null),m=r(null);function u(s,t="success"){m.value={message:s,type:t},setTimeout(()=>{m.value=null},3e3)}function V(s){if(!s)return"N/A";try{return new Date(s).toLocaleString()}catch{return s}}function S(s){if(!s.type||s.type.length===0)return"Credential";const t=s.type.filter(l=>l!=="VerifiableCredential");return t.length>0?t[t.length-1]??"Credential":"VerifiableCredential"}function T(s){const t={...s};return delete t.id,JSON.stringify(t,null,2)}async function U(){try{const s=await g.call({method:"identity.list",params:{}});D.value=s.identities||[]}catch{D.value=[]}}async function _(){p.value=!0;try{const s=await g.call({method:"identity.list-credentials",params:{}});w.value=s.credentials||[]}catch(s){u(`Failed to load credentials: ${s instanceof Error?s.message:"Unknown error"}`,"error")}finally{p.value=!1}}async function E(){if(!o.value.issuerId||!o.value.subjectDid){u("Issuer identity and subject DID are required","error");return}let s;try{s=JSON.parse(o.value.claimsJson)}catch{u("Invalid JSON in claims field","error");return}k.value=!0;try{await g.call({method:"identity.issue-credential",params:{issuer_id:o.value.issuerId,subject_did:o.value.subjectDid,type:o.value.type||"VerifiableCredential",claims:s,expires_at:o.value.expiresAt||void 0}}),u("Credential issued successfully"),o.value.subjectDid="",o.value.claimsJson="{}",o.value.expiresAt="",await _()}catch(t){u(`Failed to issue credential: ${t instanceof Error?t.message:"Unknown error"}`,"error")}finally{k.value=!1}}async function $(){if(!x.value){u("Enter a credential ID to verify","error");return}C.value=!0,c.value=null;try{const s=await g.call({method:"identity.verify-credential",params:{id:x.value}});c.value=s.valid}catch(s){u(`Verification failed: ${s instanceof Error?s.message:"Unknown error"}`,"error"),c.value=!1}finally{C.value=!1}}async function O(){if(i.value){h.value=!0;try{await g.call({method:"identity.revoke-credential",params:{id:i.value.id}}),u("Credential revoked"),i.value=null,await _()}catch(s){u(`Failed to revoke: ${s instanceof Error?s.message:"Unknown error"}`,"error")}finally{h.value=!1}}}async function A(){if(!i.value)return;const s=JSON.stringify(i.value,null,2);try{await navigator.clipboard.writeText(s)}catch{const t=document.createElement("textarea");t.value=s,t.style.position="fixed",t.style.opacity="0",document.body.appendChild(t),t.select(),document.execCommand("copy"),document.body.removeChild(t)}j.value=!0,setTimeout(()=>{j.value=!1},2e3)}return F(async()=>{await Promise.all([U(),_()])}),(s,t)=>(n(),d("div",q,[e("div",G,[e("div",H,[e("button",{onClick:t[0]||(t[0]=l=>s.$router.push("/dashboard/web5")),class:"glass-button glass-button-sm px-3 py-1.5 text-sm"}," ← Back "),t[9]||(t[9]=e("h1",{class:"text-3xl font-bold text-white"},"Credentials",-1))]),t[10]||(t[10]=e("p",{class:"text-white/70"},"Issue, view, and verify W3C Verifiable Credentials",-1))]),e("div",W,[t[17]||(t[17]=e("h2",{class:"text-lg font-semibold text-white mb-4"},"Issue New Credential",-1)),e("div",Y,[e("div",K,[e("div",null,[t[12]||(t[12]=e("label",{class:"block text-sm text-white/70 mb-1"},[I("Issuer Identity "),e("span",{class:"text-red-400"},"*")],-1)),v(e("select",{"onUpdate:modelValue":t[1]||(t[1]=l=>o.value.issuerId=l),class:"credential-input w-full"},[t[11]||(t[11]=e("option",{value:"",disabled:""},"Select identity",-1)),(n(!0),d(N,null,J(D.value,l=>(n(),d("option",{key:l.id,value:l.id},a(l.name)+" ("+a(l.did?.slice(0,24))+"...) ",9,Q))),128))],512),[[L,o.value.issuerId]])]),e("div",null,[t[13]||(t[13]=e("label",{class:"block text-sm text-white/70 mb-1"},"Credential Type",-1)),v(e("input",{"onUpdate:modelValue":t[2]||(t[2]=l=>o.value.type=l),type:"text",placeholder:"e.g. NodeOperator",class:"credential-input w-full"},null,512),[[b,o.value.type]])])]),e("div",null,[t[14]||(t[14]=e("label",{class:"block text-sm text-white/70 mb-1"},[I("Subject DID "),e("span",{class:"text-red-400"},"*")],-1)),v(e("input",{"onUpdate:modelValue":t[3]||(t[3]=l=>o.value.subjectDid=l),type:"text",placeholder:"did:key:z6Mk...",class:"credential-input w-full font-mono text-sm"},null,512),[[b,o.value.subjectDid]])]),e("div",null,[t[15]||(t[15]=e("label",{class:"block text-sm text-white/70 mb-1"},"Claims (JSON)",-1)),v(e("textarea",{"onUpdate:modelValue":t[4]||(t[4]=l=>o.value.claimsJson=l),rows:"3",placeholder:'{"role": "admin", "level": "full"}',class:"credential-input w-full font-mono text-sm"},null,512),[[b,o.value.claimsJson]])]),e("div",null,[t[16]||(t[16]=e("label",{class:"block text-sm text-white/70 mb-1"},"Expiration (optional)",-1)),v(e("input",{"onUpdate:modelValue":t[5]||(t[5]=l=>o.value.expiresAt=l),type:"datetime-local",class:"credential-input w-full"},null,512),[[b,o.value.expiresAt]])]),e("button",{onClick:E,disabled:k.value||!o.value.issuerId||!o.value.subjectDid,class:"glass-button px-6 py-2 text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed"},a(k.value?"Issuing...":"Issue Credential"),9,X)])]),e("div",Z,[e("div",ee,[t[18]||(t[18]=e("h2",{class:"text-lg font-semibold text-white"},"Your Credentials",-1)),e("button",{onClick:_,disabled:p.value,class:"glass-button glass-button-sm px-3 py-1.5 text-xs"},a(p.value?"Loading...":"Refresh"),9,te)]),p.value&&w.value.length===0?(n(),d("div",se," Loading credentials... ")):w.value.length===0?(n(),d("div",le," No credentials yet. Issue one above or receive one from a peer. ")):(n(),d("div",ae,[(n(!0),d(N,null,J(w.value,l=>(n(),d("div",{key:l.id,class:"bg-black/20 rounded-xl border border-white/10 p-4 cursor-pointer hover:border-white/20 transition-colors",onClick:Re=>i.value=l},[e("div",oe,[e("div",ne,[e("span",de,a(S(l)),1),e("span",{class:f(["px-2 py-0.5 rounded text-xs font-medium",l.status==="revoked"?"bg-red-500/20 text-red-400":"bg-green-500/20 text-green-400"])},a(l.status),3)]),e("span",re,a(l.id?.slice(0,20))+"...",1)]),e("div",ue,[e("p",null,[t[19]||(t[19]=I("Issuer: ",-1)),e("span",ce,a(l.issuer?.slice(0,32))+"...",1)]),e("p",null,[t[20]||(t[20]=I("Subject: ",-1)),e("span",ve,a(l.credentialSubject?.id?.slice(0,32))+"...",1)]),e("p",null,"Issued: "+a(V(l.issuanceDate)),1)])],8,ie))),128))]))]),e("div",pe,[t[22]||(t[22]=e("h2",{class:"text-lg font-semibold text-white mb-4"},"Verify Credential",-1)),e("div",xe,[e("div",null,[t[21]||(t[21]=e("label",{class:"block text-sm text-white/70 mb-1"},"Credential ID",-1)),v(e("input",{"onUpdate:modelValue":t[6]||(t[6]=l=>x.value=l),type:"text",placeholder:"urn:uuid:...",class:"credential-input w-full font-mono text-sm"},null,512),[[b,x.value]])]),e("div",me,[e("button",{onClick:$,disabled:C.value||!x.value,class:"glass-button px-6 py-2 text-sm font-medium disabled:opacity-50 disabled:cursor-not-allowed"},a(C.value?"Verifying...":"Verify"),9,be),c.value!==null?(n(),d("div",fe,[e("div",{class:f(["w-3 h-3 rounded-full",c.value?"bg-green-400":"bg-red-400"])},null,2),e("span",{class:f(["text-sm",c.value?"text-green-400":"text-red-400"])},a(c.value?"Valid":"Invalid"),3)])):y("",!0)])])]),(n(),M(P,{to:"body"},[i.value?(n(),d("div",{key:0,class:"fixed inset-0 z-50 flex items-center justify-center p-4",onClick:t[8]||(t[8]=z(l=>i.value=null,["self"]))},[t[33]||(t[33]=e("div",{class:"fixed inset-0 bg-black/10 backdrop-blur-md"},null,-1)),e("div",ye,[e("div",ge,[t[23]||(t[23]=e("h3",{class:"text-lg font-semibold text-white"},"Credential Details",-1)),e("button",{onClick:t[7]||(t[7]=l=>i.value=null),class:"text-white/60 hover:text-white text-xl"},"✕")]),e("div",we,[e("div",he,[t[24]||(t[24]=e("p",{class:"text-white/50 text-xs mb-1"},"Type",-1)),e("p",ke,a(S(i.value)),1)]),e("div",Ce,[t[25]||(t[25]=e("p",{class:"text-white/50 text-xs mb-1"},"ID",-1)),e("p",_e,a(i.value.id),1)]),e("div",Ie,[t[26]||(t[26]=e("p",{class:"text-white/50 text-xs mb-1"},"Issuer",-1)),e("p",De,a(i.value.issuer),1)]),e("div",je,[t[27]||(t[27]=e("p",{class:"text-white/50 text-xs mb-1"},"Subject",-1)),e("p",Ve,a(i.value.credentialSubject?.id),1)]),i.value.credentialSubject?(n(),d("div",Se,[t[28]||(t[28]=e("p",{class:"text-white/50 text-xs mb-1"},"Claims",-1)),e("pre",Ne,a(T(i.value.credentialSubject)),1)])):y("",!0),e("div",Je,[e("div",Te,[t[29]||(t[29]=e("p",{class:"text-white/50 text-xs mb-1"},"Issued",-1)),e("p",Ue,a(V(i.value.issuanceDate)),1)]),e("div",Ee,[t[30]||(t[30]=e("p",{class:"text-white/50 text-xs mb-1"},"Expires",-1)),e("p",$e,a(i.value.expirationDate?V(i.value.expirationDate):"Never"),1)])]),e("div",Oe,[t[31]||(t[31]=e("p",{class:"text-white/50 text-xs mb-1"},"Proof",-1)),e("p",Ae,a(i.value.proof?.type)+" — "+a(i.value.proof?.proofPurpose),1),e("p",Be,a(i.value.proof?.proofValue),1)]),e("div",Fe,[t[32]||(t[32]=e("p",{class:"text-white/50 text-xs mb-1"},"Status",-1)),e("span",{class:f(["px-2 py-0.5 rounded text-xs font-medium",i.value.status==="revoked"?"bg-red-500/20 text-red-400":"bg-green-500/20 text-green-400"])},a(i.value.status),3)])]),e("div",Le,[e("button",{onClick:A,class:"glass-button px-4 py-2 text-sm"},a(j.value?"Copied!":"Copy JSON"),1),i.value.status!=="revoked"?(n(),d("button",{key:0,onClick:O,disabled:h.value,class:"glass-button px-4 py-2 text-sm text-red-400 hover:text-red-300"},a(h.value?"Revoking...":"Revoke"),9,Me)):y("",!0)])])])):y("",!0)])),m.value?(n(),d("div",{key:0,class:f(["fixed bottom-20 left-1/2 -translate-x-1/2 z-50 px-6 py-3 rounded-xl text-sm font-medium shadow-lg",m.value.type==="error"?"bg-red-500/90 text-white":"bg-green-500/90 text-white"])},a(m.value.message),3)):y("",!0)]))}}),Ge=R(ze,[["__scopeId","data-v-1283cbe7"]]);export{Ge as default};
|