UNPKG

homebridge-config-ui-x

Version:

A web based management, configuration and control platform for Homebridge.

1 lines 14.2 kB
import{a as E,o as w,s as x}from"./chunk-D39XL-zh.js";import{$ as Le,Ct as Qo,E as Dy,Fr as se,I as Ga,Jr as ve$1,Kr as v3,Ln as db,M as Fe$1,Pr as sc,Q as Ko,Tn as ac,U as I_,Un as g,Vt as U3,Yr as vy,Yt as Va,b as Co,br as pb,cn as Xt,d as Ay,dt as Nf,fn as Z,hr as nc,in as X8,j as FD,jt as S_,lt as NU,pt as Ot,rr as jd,sr as kt,tt as Ln,u as An,ui as z0,ut as N_,vt as Py,wr as q,x as Cr}from"./chunk-D96TCRAL.js";import"./chunk-DZYp0NQB.js";import{n as zt}from"./chunk-CdJ3i4Aq.js";import{B as Hn,H as Jn,I as $,K as Se$1,R as Cn,U as Kn,W as Ln$1,Y as Ye$1,Z as _n,ft as he,ot as ve$2,rt as pt,st as zn,t as m}from"./main-E3N63CH7.js";import{t as ds}from"./chunk-CiY-LsUw.js";import{C as e,t as $$1,y as _}from"./chunk-BuXBmaui.js";var we=()=>[`restoring`,`restarting`,`restore-complete`];function xe(t,f){if(t&1){let e=sc();Va(0,`div`,5)(1,`h4`,6),Ot(2),S_(3,`translate`),jd(),Dy(4,`div`,7),S_(5,`translate`),Va(6,`button`,8),ac(`click`,function(){Ko(e);return Qo(ve$1().onClickGettingStarted())}),Ot(7),S_(8,`translate`),jd(),Va(9,`button`,9),ac(`click`,function(){Ko(e);return Qo(ve$1().onClickRestoreBackup())}),Ot(10),S_(11,`translate`),jd()()}t&2&&(se(2),Py(N_(3,4,`setup.welcome_to_homebridge`)),se(2),vy(`innerHTML`,N_(5,6,`setup.intro`),Ga),se(3),kt(` `,N_(8,8,`setup.button_get_started`),` `),se(3),kt(` `,N_(11,10,`setup_wizard_restore`),` `))}function Ce(t,f){if(t&1){let e=sc();Va(0,`div`,5)(1,`h4`,6),Ot(2),S_(3,`translate`),jd(),Va(4,`div`,10),Ot(5),S_(6,`translate`),jd(),Va(7,`div`,11)(8,`form`,12),ac(`ngSubmit`,function(){Ko(e);return Qo(ve$1().createFirstUser())}),Va(9,`div`,13)(10,`span`,14),Dy(11,`i`,15),jd(),Dy(12,`input`,16),S_(13,`translate`),db(),jd(),Va(14,`div`,13)(15,`span`,14),Dy(16,`i`,17),jd(),Dy(17,`input`,18),S_(18,`translate`),db(),jd(),Va(19,`div`,13)(20,`span`,14),Dy(21,`i`,17),jd(),Dy(22,`input`,19),S_(23,`translate`),db(),jd(),Va(24,`div`,20)(25,`button`,21),ac(`click`,function(){Ko(e);return Qo(ve$1().onClickCancelRestore())}),Ot(26),S_(27,`translate`),jd(),Va(28,`button`,22),Ot(29),S_(30,`translate`),jd()()()()()}if(t&2){let e=ve$1();se(2),Py(N_(3,25,`setup.create_account`)),se(3),Py(N_(6,27,`setup_wizard_create_info`)),se(3),vy(`formGroup`,e.createUserForm),se(4),Ay(`is-valid`,e.createUserForm.controls.username.dirty&&e.createUserForm.controls.username.valid)(`is-invalid`,e.createUserForm.controls.username.dirty&&e.createUserForm.controls.username.invalid),vy(`readonly`,e.loading())(`placeholder`,N_(13,29,`users.label_username`)),pb(),se(5),Ay(`is-valid`,e.createUserForm.controls.password.dirty&&e.createUserForm.controls.password.valid)(`is-invalid`,e.createUserForm.controls.password.dirty&&e.createUserForm.controls.password.errors),vy(`readonly`,e.loading())(`placeholder`,N_(18,31,`users.label_password`)),pb(),se(5),Ay(`is-valid`,e.createUserForm.controls.passwordConfirm.dirty&&e.createUserForm.controls.passwordConfirm.valid)(`is-invalid`,e.createUserForm.controls.passwordConfirm.dirty&&e.createUserForm.controls.passwordConfirm.errors),vy(`readonly`,e.loading())(`placeholder`,N_(23,33,`users.label_confirm_password`)),pb(),se(3),vy(`disabled`,e.restoreUploading()),se(),kt(` `,N_(27,35,`form.button_back`),` `),se(2),vy(`disabled`,e.createUserForm.invalid||e.loading()),se(),kt(` `,N_(30,37,`form.button_continue`),` `)}}function ve(t,f){t&1&&(Dy(0,`i`,25),Ot(1),S_(2,`translate`)),t&2&&(se(),kt(` `,N_(2,1,`backup.label_uploading`),` `))}function Se(t,f){t&1&&(Ot(0),S_(1,`translate`)),t&2&&kt(` `,N_(1,1,`form.button_continue`),` `)}function ye(t,f){if(t&1){let e=sc();Va(0,`div`,5)(1,`h4`,6),Ot(2),S_(3,`translate`),jd(),Va(4,`div`,10),Ot(5),S_(6,`translate`),jd(),Va(7,`input`,23),ac(`change`,function(i){Ko(e);return Qo(ve$1().handleRestoreFileInput(i))}),jd(),Va(8,`div`,20)(9,`button`,21),ac(`click`,function(){Ko(e);return Qo(ve$1().onClickCancelRestore())}),Ot(10),S_(11,`translate`),jd(),Va(12,`button`,24),ac(`click`,function(){Ko(e);return Qo(ve$1().onRestoreBackupClick())}),Fe$1(13,ve,3,3)(14,Se,2,3),jd()()()}if(t&2){let e=ve$1();se(2),Py(N_(3,6,`setup_wizard_restore`)),se(3),Py(N_(6,8,`backup.restore_help_one`)),se(4),vy(`disabled`,e.restoreUploading()),se(),kt(` `,N_(11,10,`form.button_back`),` `),se(2),vy(`disabled`,e.restoreUploading()||!e.selectedFile()),se(),Le(e.restoreUploading()?13:14)}}function ke(t,f){t&1&&(Ot(0),S_(1,`translate`)),t&2&&kt(` `,N_(1,1,`setup_wizard_restoring`),` `)}function ze(t,f){t&1&&(Ot(0),S_(1,`translate`)),t&2&&kt(` `,N_(1,1,`setup_wizard_starting`),` `)}function Fe(t,f){t&1&&(Ot(0),S_(1,`translate`)),t&2&&kt(` `,N_(1,1,`setup_wizard_complete`),` `)}function Ee(t,f){t&1&&(Va(0,`a`,27),Ot(1),S_(2,`translate`),jd()),t&2&&(se(),Py(N_(2,1,`form.button_continue`)))}function Te(t,f){if(t&1&&(Va(0,`div`,5)(1,`h4`,6),Fe$1(2,ke,2,3)(3,ze,2,3)(4,Fe,2,3),jd(),Dy(5,`div`,26),Fe$1(6,Ee,3,3,`a`,27),jd()),t&2){let e=ve$1();se(2),Le(e.step()===`restoring`?2:e.step()===`restarting`?3:e.step()===`restore-complete`?4:-1),se(4),Le(e.step()===`restore-complete`?6:-1)}}function $e(t,f){t&1&&(Va(0,`div`,5)(1,`h4`,28),Ot(2),S_(3,`translate`),jd(),Va(4,`div`,10),Ot(5),S_(6,`translate`),jd(),Va(7,`a`,29),Ot(8),S_(9,`translate`),jd()()),t&2&&(se(2),Py(N_(3,3,`setup_wizard_complete_title`)),se(3),Py(N_(6,5,`setup_wizard_completed`)),se(3),Py(N_(9,7,`form.button_continue`)))}var Ye=(()=>{class t{$api=g(U3);$auth=g(he);$errors=g(m);$settings=g(zt);$title=g(X8);$toastr=g(z0);$translate=g(Nf);$ws=g(ds);destroyRef=g(Z);step=q(`welcome`);backgroundStyle=q(void 0);progress=q(1);restoreInProgress=q(!1);restoreStarted=q(!1);restoreFailed=q(!1);loading=q(!1);selectedFile=q(void 0);restoreUploading=q(!1);io;createUserForm=new $({username:new Se$1(``,[ve$2.required]),password:new Se$1(``,[ve$2.required,ve$2.minLength(4)]),passwordConfirm:new Se$1(``,[ve$2.required])},this.matchPassword);ngOnInit(){this.$title.setTitle(this.$translate.instant(`setup_wizard_page_title`)),this.setBackground()}onClickGettingStarted(){this.step.set(`create-account`),this.progress.set(50)}onClickRestoreBackup(){this.step.set(`restore-backup`),this.progress.set(20)}onClickCancelRestore(){this.selectedFile.set(void 0),this.step.set(`welcome`),this.progress.set(1)}createFirstUser(){return E(this,null,function*(){this.loading.set(!0),this.progress.set(75);let e=this.createUserForm.getRawValue();e.name=e.username;try{yield this.$api.post(`/setup-wizard/create-first-user`,e),this.$settings.env.setupWizardComplete=!0,this.progress.set(100),this.loading.set(!1),yield this.$auth.login({username:e.username,password:e.password}),this.step.set(`setup-complete`)}catch(o){this.loading.set(!1),this.progress.set(50),console.error(o),this.$toastr.error(this.$errors.toToastMessage(o),this.$translate.instant(`toast.title_error`))}})}handleRestoreFileInput(e){let o=e.target.files;if(o?.length){let i=o[0];if(i.size>globalThis.backup.maxBackupSize){e.target.value=``,this.selectedFile.set(void 0),this.progress.set(20),this.$toastr.error(this.$translate.instant(`backup.backup_exceeds_max_size`,{maxBackupSizeText:globalThis.backup.maxBackupSizeText,size:`${(i.size/(1024*1024)).toFixed(1)}MB`}),this.$translate.instant(`toast.title_error`));return}this.selectedFile.set(i),this.progress.set(40)}else this.selectedFile.set(void 0),this.progress.set(20)}onRestoreBackupClick(){return E(this,null,function*(){this.restoreUploading.set(!0),this.step.set(`restoring`),this.progress.set(60);try{let e$1=yield this.$api.get(`/setup-wizard/get-setup-wizard-token`);window.localStorage.setItem(Co.jwt.tokenKey,e$1.access_token),this.$auth.token=e$1.access_token,this.progress.set(65);let o=new FormData,i=this.selectedFile();o.append(`restoreArchive`,i,i.name),yield this.$api.post(`/backup/restore`,o),this.progress.set(70),this.io=this.$ws.connectToNamespace(`backup`);let u=document.getElementById(`output`),d=null;this.io.socket.on(`stdout`,c=>{c.split(e).forEach(y=>{if(!y)return;let B=y.replace(_,``).trim();if(!B)return;if($$1.test(B))d||(d=document.createElement(`div`),u.appendChild(d)),d.textContent=B;else{d&&(d.remove(),d=null);let k=document.createElement(`div`);k.textContent=B,y.includes(`[0;31m`)?k.classList.add(`red-text`):y.includes(`[0;32m`)?k.classList.add(`green-text`):y.includes(`[0;33m`)?k.classList.add(`orange-text`):y.includes(`[0;36m`)&&k.classList.add(`cyan-text`),u.appendChild(k)}u.scrollTop=u.scrollHeight})}),this.restoreStarted.set(!0),this.restoreInProgress.set(!0),this.progress.set(75),yield Ln(this.io.request(`do-restore`)),this.progress.set(80),this.restoreInProgress.set(!1),yield this.$api.put(`/backup/restart`,{}),this.step.set(`restarting`),this.progress.set(85),window.localStorage.removeItem(Co.jwt.tokenKey),this.$auth.token=null;let N=document.createElement(`div`);N.classList.add(`orange-text`),N.innerHTML=`Starting Homebridge, please wait...`,u.appendChild(N),u.scrollTop=u.scrollHeight,yield new Promise(c=>setTimeout(c,3e3)),this.progress.set(88),yield new Promise(c=>setTimeout(c,3e3)),this.progress.set(91),yield new Promise(c=>setTimeout(c,3e3)),this.progress.set(94),yield new Promise(c=>setTimeout(c,3e3)),this.progress.set(97),yield new Promise(c=>setTimeout(c,3e3)),this.progress.set(99);let be=FD(1e3).pipe(An(this.destroyRef)).subscribe(()=>E(this,null,function*(){try{yield this.$api.get(`/auth/settings`),be.unsubscribe(),this.progress.set(100),this.restoreUploading.set(!1),this.step.set(`restore-complete`)}catch(c){}}))}catch(e){console.error(e),this.restoreUploading.set(!1),this.restoreFailed.set(!0),this.progress.set(20),this.step.set(`restore-backup`),this.$toastr.error(this.$errors.toToastMessage(e),this.$translate.instant(`toast.title_error`))}finally{this.io&&this.io.end?.()}})}setBackground(){return E(this,null,function*(){if(this.$settings.settingsLoaded||(yield Ln(this.$settings.onSettingsLoaded)),this.$settings.env.customWallpaperHash){let e=`${Co.api.base}/auth/wallpaper/${this.$settings.env.customWallpaperHash}`;this.backgroundStyle.set(`url('${e}') center/cover`)}})}matchPassword(e){let o=e.get(`passwordConfirm`),i=e.get(`password`).value,u=o.value,d=w({},o.errors??{});return delete d.matchPassword,i!==u?(o.setErrors(x(w({},d),{matchPassword:!0})),{matchPassword:!0}):(o.setErrors(Object.keys(d).length?d:null),null)}static ɵfac=function(o){return new(o||t)};static ɵcmp=nc({type:t,selectors:[[`app-setup-wizard`]],decls:10,vars:11,consts:[[1,`setup-container`,`gradient`,`d-flex`,`align-items-start`,`justify-content-center`],[1,`w-100`,`setup-card`,`d-flex`,`py-4`,`flex-column`],[`ngSrc`,`assets/homebridge-color-round.webp`,`alt`,`Homebridge Logo`,`height`,`100`,`width`,`100`,`priority`,`true`,1,`homebridge-logo`,`mx-auto`,`my-3`],[1,`progress`,`w-100`,`my-4`],[`role`,`progressbar`,`aria-valuemin`,`0`,`aria-valuemax`,`100`,1,`progress-bar`,`progress-bar-striped`,`bg-success`],[1,`w-100`,`d-flex`,`flex-column`,`align-items-center`,`mb-2`],[1,`mb-3`,`text-center`],[1,`mb-4`,`small`,`grey-text`,`text-center`,3,`innerHTML`],[`type`,`button`,1,`btn`,`btn-lg`,`btn-primary`,`mb-4`,3,`click`],[`type`,`button`,1,`btn`,`btn-link`,`grey-text`,`p-0`,3,`click`],[1,`mb-4`,`small`,`grey-text`,`text-center`],[1,`w-100`],[`novalidate`,``,3,`ngSubmit`,`formGroup`],[1,`input-group`,`mb-4`],[1,`input-group-text`,`custom-input`],[`aria-hidden`,`true`,1,`fas`,`fa-user`,`primary-text`,`fa-lg`],[`formControlName`,`username`,`type`,`text`,`id`,`form-username`,`autocomplete`,`username`,`autocapitalize`,`none`,`tabindex`,`0`,`required`,``,1,`form-control`,`custom-input`,3,`readonly`,`placeholder`],[`aria-hidden`,`true`,1,`fas`,`fa-lock`,`primary-text`,`fa-lg`],[`formControlName`,`password`,`type`,`password`,`id`,`form-pass`,`autocomplete`,`new-password`,`tabindex`,`0`,`required`,``,1,`form-control`,`custom-input`,3,`readonly`,`placeholder`],[`formControlName`,`passwordConfirm`,`type`,`password`,`id`,`form-pass-confirm`,`autocomplete`,`new-password`,`tabindex`,`0`,`required`,``,1,`form-control`,`custom-input`,3,`readonly`,`placeholder`],[1,`mt-3`,`w-100`,`d-flex`,`justify-content-between`],[`type`,`button`,1,`btn`,`btn-elegant`,`ms-0`,3,`click`,`disabled`],[`type`,`submit`,1,`btn`,`btn-primary`,3,`disabled`],[`type`,`file`,`id`,`restoreFileUpload`,`accept`,`application/gzip, .gz`,1,`form-control`,`custom-input`,`mb-3`,3,`change`],[`type`,`button`,1,`btn`,`btn-primary`,`me-0`,3,`click`,`disabled`],[`aria-hidden`,`true`,1,`fas`,`fa-circle-notch`,`fa-spin`],[`id`,`output`,1,`font-monospace`,`small`,`alert`,`alert-info`,`w-100`,`text-start`,`mt-1`,`mb-0`],[`href`,`/login`,1,`btn`,`btn-lg`,`btn-primary`,`mt-4`],[1,`mb-3`],[`href`,`/`,1,`btn`,`btn-lg`,`btn-primary`]],template:function(o,i){o&1&&(Va(0,`div`,0)(1,`div`,1),Dy(2,`img`,2),Va(3,`div`,3),Dy(4,`div`,4),jd(),Fe$1(5,xe,12,12,`div`,5)(6,Ce,31,39,`div`,5)(7,ye,15,12,`div`,5)(8,Te,7,2,`div`,5)(9,$e,10,9,`div`,5),jd()()),o&2&&(Xt(`background`,i.backgroundStyle()),Ay(`anim`,!i.backgroundStyle()),se(4),Xt(`width`,`${i.progress()}%`),Ay(`progress-bar-animated`,i.loading()||i.restoreUploading()),Cr(`aria-valuenow`,i.progress()),se(),Le(i.step()===`welcome`?5:i.step()===`create-account`?6:i.step()===`restore-backup`?7:I_(10,we).includes(i.step())?8:i.step()===`setup-complete`?9:-1))},dependencies:[NU,Kn,zn,Ye$1,Hn,Ln$1,pt,Jn,Cn,_n,v3],styles:[`.setup-container[_ngcontent-%COMP%]{z-index:-1;padding-top:2em;padding-bottom:2em;min-height:100%;background-size:300% 300%}.anim[_ngcontent-%COMP%]{-webkit-animation:_ngcontent-%COMP%_gradient 20s ease infinite;-moz-animation:gradient 20s ease infinite;animation:_ngcontent-%COMP%_gradient 20s ease infinite}@keyframes _ngcontent-%COMP%_gradient{0%{background-position:0 50%}50%{background-position:100% 50%}to{background-position:0 50%}}.setup-card[_ngcontent-%COMP%]{max-width:550px;border-radius:1rem;padding-right:25px;padding-left:25px;background-color:#ffffffe6}.setup-card[_ngcontent-%COMP%] .form-control[_ngcontent-%COMP%]:focus{background-color:inherit!important}@media screen and (max-width:575px){.setup-card[_ngcontent-%COMP%]{margin-left:1em;margin-right:1em}}.homebridge-logo[_ngcontent-%COMP%]{margin-bottom:10px}.progress[_ngcontent-%COMP%]{background-color:#ddd}#output[_ngcontent-%COMP%]{height:200px;overflow-y:scroll;white-space:pre-wrap}`]})}return t})();export{Ye as SetupWizardComponent};