1import{UserService as S}from"https://underpost.net/services/user/user.service.js";import{FileService as B}from"https://underpost.net/services/file/file.service.js";import{Auth as O}from"https://underpost.net/components/core/Auth.js";import{BtnIcon as h}from"https://underpost.net/components/core/BtnIcon.js";import{newInstance as R}from"https://underpost.net/components/core/CommonJs.js";import{renderStatus as K,renderWave as q}from"https://underpost.net/components/core/Css.js";import{EventsUI as y}from"https://underpost.net/components/core/EventsUI.js";import{fileFormDataFactory as H,Input as U}from"https://underpost.net/components/core/Input.js";import{LogIn as n}from"https://underpost.net/components/core/LogIn.js";import{Modal as T}from"https://underpost.net/components/core/Modal.js";import{NotificationManager as c}from"https://underpost.net/components/core/NotificationManager.js";import{ToggleSwitch as v}from"https://underpost.net/components/core/ToggleSwitch.js";import{Translate as e}from"https://underpost.net/components/core/Translate.js";import{Validator as N}from"https://underpost.net/components/core/Validator.js";import{append as W,htmls as z,s as t}from"https://underpost.net/components/core/VanillaJs.js";import{getProxyPath as G}from"https://underpost.net/components/core/Router.js";import{getApiBaseUrl as E}from"https://underpost.net/services/core/core.service.js";import{AccountEventType as _,accountEvents as C}from"https://underpost.net/components/core/ClientEvents.js";import{loggerFactory as J}from"https://underpost.net/components/core/Logger.js";var Q=J(import.meta),F=class P{static UpdateEvent={};static onUpdated(i,u={}){return u.key&&(P.UpdateEvent[u.key]=i),C.on(_.updated,i,u)}static offUpdated(i){return delete P.UpdateEvent[i],C.off(i)}static hasUpdatedListener(i){return C.has(i)}static async instance(i={user:{},bottomRender:async()=>"",idModal:""}){let{user:u,idModal:w}=i,$="account-wave",m=["image/png","image/jpeg"];return setTimeout(async()=>{W(`.wave-animation-container-${$}`,` <div class="abs center account-profile-image-container"> 2 <img 3 class="abs center account-profile-image" 4 style="opacity: 1" 5 ${n.Scope.user.main.model.user.profileImage?`src="${n.Scope.user.main.model.user.profileImage.imageSrc}"`:`src="${E({id:"assets/avatar",endpoint:"user"})}"`} 6 /> 7 </div> 8 <div class="abs center account-profile-image-loading" style="color: white"></div>`);let k=[{model:"username",id:"account-username",rules:[{type:"isEmpty"},{type:"isLength",options:{min:2,max:20}},{type:"isValidUsername"}]},{model:"email",id:"account-email",rules:[{type:"isEmpty"},{type:"isEmail"}]},{model:"password",defaultValue:"#Changethis123",id:"account-password",rules:[{type:"isStrongPassword"}]},{model:"briefDescription",id:"account-brief-description",defaultValue:"Uploader",rules:[{type:"isLength",options:{min:0,max:200}}]}];this.formData=k,this.instanceModalUiEvents=async({user:x})=>{let I=this,V=await N.instance(k);for(let a of k)t(`.${a.id}`).value=!x[a.model]&&a.defaultValue?a.defaultValue:x[a.model];P.renderRole(x);let D,L=async()=>{let a=n.Scope.user.main.model.user;if(!a||!a._id){c.Push({html:e.instance("error-user-not-authenticated"),status:"error"});return}if(a.role==="guest"){c.Push({html:e.instance("error-user-not-authenticated"),status:"error"});return}D=R(a);let{successKeys:r,errorKeys:s,errorMessage:l}=await V();if(l){c.Push({html:`${s.map(o=>e.instance(o.replace("account-","")))} ${l}`});return}let d={};for(let o of k){let f=t(`.${o.id}`).value;!f||f==="undefined"||"model"in o&&r.includes(o.id)&&(d[o.model]=f,a[o.model]=f)}let p=await S.put({id:a._id,body:d});if(c.Push({html:p.status==="error"&&p.message?p.message:e.instance(`${p.status}-update-user`),status:p.status}),p.status==="success"){let o=p.data,f=n.Scope.user.main.model.user.profileImage;n.Scope.user.main.model.user={...o},f&&!o.profileImage&&(n.Scope.user.main.model.user.profileImage=f),I.triggerUpdateEvent({user:o}),D.emailConfirmed!==o.emailConfirmed&&I.renderVerifyEmailStatus(o),D=R(o)}};y.onClick(".btn-account",async a=>{a.preventDefault(),await L()}),y.onClick(".btn-account-update-username",async a=>{a.preventDefault(),await L()}),t(".btn-confirm-email")&&y.onClick(".btn-confirm-email",async a=>{a.preventDefault();let r=n.Scope.user.main.model.user;if(!r||!r._id){c.Push({html:e.instance("error-user-not-authenticated"),status:"error"});return}if(r.role==="guest"){c.Push({html:e.instance("error-user-not-authenticated"),status:"error"});return}let s=await S.post({id:"mailer/verify-email",body:{email:t(".account-email").value,hostname:`${location.hostname}`,proxyPath:G()}});c.Push({html:s.status==="error"?s.message:e.instance("email send"),status:s.status})});let A=n.Scope.user.main.model.user;I.renderVerifyEmailStatus(A||x),t(`.${$}`).style.cursor="pointer",t(`.${$}`).onclick=async a=>{a.preventDefault(),t(".account-profile-image-input").click()},y.onChange(".account-profile-image-input",async a=>{a.preventDefault(),t(".account-profile-image").style.opacity=0;let r=H(a,m),s=n.Scope.user.main.model.user;if(!s||!s._id){c.Push({html:e.instance("error-user-not-authenticated"),status:"error"}),t(".account-profile-image").style.opacity=1;return}if(s.role==="guest"){c.Push({html:e.instance("error-user-not-authenticated"),status:"error"}),t(".account-profile-image").style.opacity=1;return}let{status:l,data:d}=await S.put({id:`profile-image/${s._id}`,body:r,headerId:"file"});if(l==="success"){s.profileImageId=d.profileImageId,n.Scope.user.main.model.user={...s},delete n.Scope.user.main.model.user.profileImage;let o=E({id:"assets/avatar",endpoint:"user"});try{let g=await B.get({id:d.profileImageId});if(g&&g.status==="success"&&g.data[0]){let b=g.data[0];if(!b.data?.data&&b._id)o=E({id:b._id,endpoint:"file/blob"});else if(b.data?.data){let M=new Blob([new Uint8Array(b.data.data)],{type:b.mimetype}
8),j=new File([M],b.name,{type:b.mimetype});o=URL.createObjectURL(j)}n.Scope.user.main.model.user.profileImage={resultFile:g,imageData:b,imageSrc:o}}}catch(g){Q.warn("Error fetching new profile image:",g)}t(".account-profile-image").src=o;let f=t(".top-box-profile-img");f&&(f.src=o),c.Push({html:e.instance("success-update-user"),status:"success"})}else c.Push({html:d?.message||e.instance("file-upload-failed"),status:"error"});t(".account-profile-image").style.opacity=1},{loadingContainer:".account-profile-image-loading"}),t(".btn-account-change-password").onclick=a=>{a.preventDefault(),t(".main-btn-recover").click()},y.onClick(".btn-account-delete-confirm",async a=>{a.preventDefault(),(await T.RenderConfirm({html:async()=>` 9 <div class="in section-mp" style="text-align: center"> 10 ${e.instance("confirm-delete-account")} 11 </div> 12 `,id:"delete-account-modal"})).status!=="cancelled"&&(t(".btn-account-delete-confirm").classList.add("hide"),t(".btn-account-delete").classList.remove("hide"),t(".btn-account-delete").click())},{context:"modal"}),y.onClick(".btn-brief-description-update",async a=>{a.preventDefault();let r=t(".account-brief-description").value;if(!r||r==="undefined"||r.trim()===""){c.Push({html:e.instance("brief-description-cannot-be-empty"),status:"error"});return}let s=n.Scope.user.main.model.user;if(!s||!s._id){c.Push({html:e.instance("error-user-not-authenticated"),status:"error"});return}if(s.role==="guest"){c.Push({html:e.instance("error-user-not-authenticated"),status:"error"});return}let l=await S.put({id:s._id,body:{briefDescription:r}});if(c.Push({html:l.status==="error"&&l.message?l.message:e.instance(`${l.status}-update-user`),status:l.status}),l.status==="success"){s.briefDescription=r;let d=n.Scope.user.main.model.user.profileImage;n.Scope.user.main.model.user.briefDescription=r,d&&(n.Scope.user.main.model.user.profileImage=d),I.triggerUpdateEvent({user:s})}}),setTimeout(()=>{if(v.Tokens["account-public-profile"]){let a=v.Tokens["account-public-profile"].click;v.Tokens["account-public-profile"].click=async function(){a.call(this);let s=t(".account-public-profile-checkbox").checked,l=n.Scope.user.main.model.user;if(!l||!l._id){c.Push({html:e.instance("error-user-not-authenticated"),status:"error"});return}if(l.role==="guest"){c.Push({html:e.instance("error-user-not-authenticated"),status:"error"});return}let d=await S.put({id:l._id,body:{publicProfile:s}});if(c.Push({html:d.status==="error"&&d.message?d.message:e.instance(`${d.status}-update-user`),status:d.status}),d.status==="success"){l.publicProfile=s;let p=n.Scope.user.main.model.user.profileImage;n.Scope.user.main.model.user.publicProfile=s,p&&(n.Scope.user.main.model.user.profileImage=p),I.triggerUpdateEvent({user:l})}};let r=t(".toggle-form-container-account-public-profile");r&&(r.onclick=()=>v.Tokens["account-public-profile"].click())}}),y.onClick(".btn-account-delete",async a=>{a.preventDefault();let r=n.Scope.user.main.model.user;if(!r||!r._id){c.Push({html:e.instance("error-user-not-authenticated"),status:"error"});return}let s=await S.delete({id:r._id});c.Push({html:s.status==="error"?s.message:e.instance("success-delete-account"),status:s.status}),t(".btn-account-delete-confirm").classList.remove("hide"),t(".btn-account-delete").classList.add("hide"),s.status==="success"&&(T.onHomeRouterEvent(),await O.sessionOut())})},await this.instanceModalUiEvents({user:u})}),` 13 <label for="account-profile-image-input-label" 14 ><span class="hide">Profile Image</span> 15 <input 16 type="file" 17 accept="${m.join(", ")}" 18 class="account-profile-image-input hide" 19 id="account-profile-image-input-label" 20 /></label> 21 ${q({id:$})} 22 23 <form class="in"> 24 <div class="in"> 25 ${await U.instance({id:"account-username",type:"text",label:`<i class="fa-solid fa-pen-to-square"></i> ${e.instance("username")}`,containerClass:"inl section-mp width-mini-box input-container",placeholder:!0,disabled:!1,extension:async()=>`${await h.instance({class:"in wfa btn-input-extension btn-account-update-username",type:"button",style:"text-align: left",label:`${e.instance("update")}`})}`})} 26 </div> 27 <div class="in"> 28 ${await U.instance({id:"account-email",type:"email",label:`<i class="fa-solid fa-envelope"></i> ${e.instance("email")}`,containerClass:"inl section-mp width-mini-box input-container",placeholder:!0,autocomplete:"email",disabled:u.emailConfirmed,extension:i&&i.disabled&&i.disabled.includes("emailConfirm")?void 0:async()=>`<div class="in verify-email-status"></div> 29 ${await h.instance({class:"in wfa btn-input-extension btn-confirm-email",type:"button",style:"text-align: left",label:`<div class="in"> 30 <i class="fa-solid fa-paper-plane"></i> ${e.instance("send")} 31 ${e.instance("verify-email")} 32 </div> `})}`})} 33 </div> 34 <div class="in"> 35 ${await U.instance({id:"account-password",type:"password",autocomplete:"new-password",label:`<i class="fa-solid fa-lock"></i> ${e.instance("password")}`,containerClass:"inl section-mp width-mini-box input-container",placeholder:!0,disabled:!0,disabledEye:!0,extension:async()=>`${await h.instance({class:"in wfa btn-input-extension btn-account-change-password",type:"button",style:"text-align: left",label:`${e.instance("change-password")}`})}`})} 36 </div> 37 <div class="in"> 38 ${await U.instance({id:"account-role",type:"text",label:`<i class="fa-solid fa-id-badge"></i> ${e.instance("role")}`,containerClass:"inl section-mp width-mini-box input-container",disabled:!0})} 39 </div> 40 <div class="in"> 41 ${await U.instance({id:"account-brief-description",label:`<i class="fa-solid fa-pen-fancy"></i> ${e.instance("brief-description")}`,containerClass:"inl section-mp width-mini-box input-container",placeholder:!0,rows:4,extension:async()=>`${await h.instance({class:"in wfa btn-input-extension btn-brief-description-update",type:"button",style:"text-align: left",label:`${e.instance("update")}`})}`})} 42 </div> 43 <div class="in section-mp"> 44 ${await v.instance({wrapper:!0,wrapperLabel:`<i class="fa-solid fa-globe"></i> ${e.instance("public-profile")}`,id:"account-public-profile",disabledOnClick:!0,checked:!!u.publicProfile})} 45 </div> 46 ${i?.bottomRender?await i.bottomRender():""} 47 <div class="in hide"> 48 ${await h.instance({class:"in section-mp form-button btn-account",label:e.instance("update"),type:"submit"})} 49 </div> 50 </form> 51 <div class="in"> 52 ${await h.instance({class:"in section-mp form-button btn-account-delete hide",label:` ${e.instance("delete-account")}`,type:"button",style:"color: #5f5f5f"})} 53 ${await h.instance({class:"in section-mp form-button btn-account-delete-confirm",label:` ${e.instance("delete-account")}`,type:"button",style:"color: #5f5f5f"})} 54 </div> 55 `}static async triggerUpdateEvent(i={user:{}}){await C.emit(_.updated,i);for(let u of Object.keys(this.UpdateEvent))await this.UpdateEvent[u](i)}static renderVerifyEmailStatus(i){t(".verify-email-status")&&(t(".btn-confirm-email")&&(i.emailConfirmed?t(".btn-confirm-email").classList.add("hide"):t(".btn-confirm-email").classList.remove("hide")),z(".verify-email-status",`${K(i.emailConfirmed?"success":"error",{class:"inl"})} ${e.instance("email")} 56 ${e.instance(i.emailConfirmed?"confirmed":"unconfirmed")}`),i.emailConfirmed===!0&&t(".account-email").setAttribute("disabled",""))}static renderRole(i){t(".account-role")&&(t(".account-role").value=i?.role||"guest")}static instanceModalUiEvents=async i=>null;static async updateForm(i){if(!t(".modal-account"))return;if(i&&i._id){let m=n.Scope.user.main.model.user.profileImage;n.Scope.user.main.model.user={...i},m&&!i.profileImage&&(n.Scope.user.main.model.user.profileImage=m)}let u=n.Scope.user.main.model.user;if(!u||!u._id)return;await this.instanceModalUiEvents({user:u}),t(".account-profile-image").style.opacity=0;for(let m of this.formData)t(`.${m.id}`)&&(t(`.${m.id}`).value=u[m.model]);P.renderRole(u);let w=t(".account-profile-image"),$=E({id:"assets/avatar",endpoint:"user"});if(u.role!=="guest"&&w){let m=n.Scope.user.main.model.user.profileImage?.imageSrc;w.src=m||$,w.style.opacity=1}else w&&(w.style.opacity=0);v.Tokens["account-public-profile"]&&u.publicProfile&&!t(".account-public-profile-checkbox").checked&&v.Tokens["account-public-profile"].click()}};export{F as Account};
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.