function generateChart(e,n){const t=n.reduce(((e,n)=>(e.labels.push(n.date),e.income.push(n.income),e.spending.push(n.spending),e.cumulative.push(n.balance),e)),{labels:[],income:[],spending:[],cumulative:[]});return new Chart(e.getContext("2d"),{type:"bar",data:{labels:t.labels,datasets:[{data:t.cumulative,type:"line",label:"balance",backgroundColor:"#673ab7",borderColor:"#673ab7",borderWidth:4,pointRadius:3,fill:!1},{data:t.income,type:"bar",label:"in",barPercentage:.75,backgroundColor:window.Color("rgb(76,175,80)").alpha(.5).rgbString()},{data:t.spending,type:"bar",label:"out",barPercentage:.75,backgroundColor:window.Color("rgb(233,30,99)").alpha(.5).rgbString()}]},options:{title:{text:"Chart.js Combo Time Scale"},tooltips:{mode:"index",intersect:!1},scales:{xAxes:[{type:"time",display:!0,time:{minUnit:"hour",stepSize:3}}]},animation:{duration:0},elements:{line:{tension:0}}}})}window.app.component("lnbits-funding-sources",{mixins:[window.windowMixin],props:["form-data","allowed-funding-sources"],methods:{getFundingSourceLabel(e){const n=this.rawFundingSources.find((n=>n[0]===e));return n?n[1]:e}},computed:{fundingSources(){let e=[];for(const[n,t,i]of this.rawFundingSources){const t={};if(null!==i)for(let[e,n]of Object.entries(i))t[e]={label:n,value:null};e.push([n,t])}return new Map(e)},sortedAllowedFundingSources(){return this.allowedFundingSources.sort()}},data:()=>({rawFundingSources:[["VoidWallet","Void Wallet",null],["FakeWallet","Fake Wallet",{fake_wallet_secret:"Secret"}],["CoreLightningWallet","Core Lightning",{corelightning_rpc:"Endpoint",corelightning_pay_command:"Custom Pay Command"}],["CoreLightningRestWallet","Core Lightning Rest",{corelightning_rest_url:"Endpoint",corelightning_rest_cert:"Certificate",corelightning_rest_macaroon:"Macaroon"}],["LndRestWallet","Lightning Network Daemon (LND Rest)",{lnd_rest_endpoint:"Endpoint",lnd_rest_cert:"Certificate",lnd_rest_macaroon:"Macaroon",lnd_rest_macaroon_encrypted:"Encrypted Macaroon",lnd_rest_route_hints:"Enable Route Hints"}],["LndWallet","Lightning Network Daemon (LND)",{lnd_grpc_endpoint:"Endpoint",lnd_grpc_cert:"Certificate",lnd_grpc_port:"Port",lnd_grpc_admin_macaroon:"Admin Macaroon",lnd_grpc_macaroon_encrypted:"Encrypted Macaroon"}],["LnTipsWallet","LN.Tips",{lntips_api_endpoint:"Endpoint",lntips_api_key:"API Key"}],["LNPayWallet","LN Pay",{lnpay_api_endpoint:"Endpoint",lnpay_api_key:"API Key",lnpay_wallet_key:"Wallet Key"}],["EclairWallet","Eclair (ACINQ)",{eclair_url:"URL",eclair_pass:"Password"}],["LNbitsWallet","LNbits",{lnbits_endpoint:"Endpoint",lnbits_key:"Admin Key"}],["BlinkWallet","Blink",{blink_api_endpoint:"Endpoint",blink_ws_endpoint:"WebSocket",blink_token:"Key"}],["AlbyWallet","Alby",{alby_api_endpoint:"Endpoint",alby_access_token:"Key"}],["BoltzWallet","Boltz",{boltz_client_endpoint:"Endpoint",boltz_client_macaroon:"Admin Macaroon path or hex",boltz_client_cert:"Certificate path or hex",boltz_client_wallet:"Wallet Name"}],["ZBDWallet","ZBD",{zbd_api_endpoint:"Endpoint",zbd_api_key:"Key"}],["PhoenixdWallet","Phoenixd",{phoenixd_api_endpoint:"Endpoint",phoenixd_api_password:"Key"}],["OpenNodeWallet","OpenNode",{opennode_api_endpoint:"Endpoint",opennode_key:"Key"}],["ClicheWallet","Cliche (NBD)",{cliche_endpoint:"Endpoint"}],["SparkWallet","Spark",{spark_url:"Endpoint",spark_token:"Token"}],["NWCWallet","Nostr Wallet Connect",{nwc_pairing_url:"Pairing URL"}],["BreezSdkWallet","Breez SDK",{breez_api_key:"Breez API Key",breez_greenlight_seed:"Greenlight Seed",breez_greenlight_device_key:"Greenlight Device Key",breez_greenlight_device_cert:"Greenlight Device Cert",breez_greenlight_invite_code:"Greenlight Invite Code"}]]}),template:'\n
\n
Funding Sources
\n
\n
\n

Active Funding (Requires server restart)

\n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n '}),window.app.component("lnbits-extension-settings-form",{name:"lnbits-extension-settings-form",props:["options","adminkey","endpoint"],methods:{async updateSettings(){if(!this.settings)return this.$q.notify({message:"No settings to update",type:"negative"});try{const{data:e}=await LNbits.api.request("PUT",this.endpoint,this.adminkey,this.settings);this.settings=e}catch(e){LNbits.utils.notifyApiError(e)}},getSettings:async function(){try{const{data:e}=await LNbits.api.request("GET",this.endpoint,this.adminkey);this.settings=e}catch(e){LNbits.utils.notifyApiError(e)}},resetSettings:async function(){LNbits.utils.confirmDialog("Are you sure you want to reset the settings?").onOk((async()=>{try{await LNbits.api.request("DELETE",this.endpoint,this.adminkey),await this.getSettings()}catch(e){LNbits.utils.notifyApiError(e)}}))}},created:async function(){await this.getSettings()},template:'\n \n \n
\n Update\n Reset\n \n
\n
\n ',data:function(){return{settings:void 0}}}),window.app.component("lnbits-extension-settings-btn-dialog",{name:"lnbits-extension-settings-btn-dialog",props:["options","adminkey","endpoint"],template:'\n \n \n \n \n \n \n \n \n \n ',data:function(){return{show:!1}}}),window.app.component("lnbits-extension-rating",{name:"lnbits-extension-rating",props:["rating"],template:'\n
\n \n \n
\n '}),window.app.component("payment-list",{name:"payment-list",props:["update","wallet","mobileSimple","lazy"],mixins:[window.windowMixin],data:function(){return{denomination:LNBITS_DENOMINATION,payments:[],paymentsTable:{columns:[{name:"time",align:"left",label:this.$t("memo")+"/"+this.$t("date"),field:"date",sortable:!0},{name:"amount",align:"right",label:this.$t("amount")+" ("+LNBITS_DENOMINATION+")",field:"sat",sortable:!0}],pagination:{rowsPerPage:10,page:1,sortBy:"time",descending:!0,rowsNumber:10},search:null,loading:!1},exportTagName:"",exportPaymentTagList:[],paymentsCSV:{columns:[{name:"pending",align:"left",label:"Pending",field:"pending"},{name:"memo",align:"left",label:this.$t("memo"),field:"memo"},{name:"time",align:"left",label:this.$t("date"),field:"date",sortable:!0},{name:"amount",align:"right",label:this.$t("amount")+" ("+LNBITS_DENOMINATION+")",field:"sat",sortable:!0},{name:"fee",align:"right",label:this.$t("fee")+" (m"+LNBITS_DENOMINATION+")",field:"fee"},{name:"tag",align:"right",label:this.$t("tag"),field:"tag"},{name:"payment_hash",align:"right",label:this.$t("payment_hash"),field:"payment_hash"},{name:"payment_proof",align:"right",label:this.$t("payment_proof"),field:"payment_proof"},{name:"webhook",align:"right",label:this.$t("webhook"),field:"webhook"},{name:"fiat_currency",align:"right",label:"Fiat Currency",field:e=>e.extra.wallet_fiat_currency},{name:"fiat_amount",align:"right",label:"Fiat Amount",field:e=>e.extra.wallet_fiat_amount}],filter:null,loading:!1}}},computed:{filteredPayments:function(){var e=this.paymentsTable.search;return e&&""!==e?LNbits.utils.search(this.payments,e):this.payments},paymentsOmitter(){return this.$q.screen.lt.md&&this.mobileSimple?this.payments.length>0?[this.payments[0]]:[]:this.payments},pendingPaymentsExist:function(){return-1!==this.payments.findIndex((e=>e.pending))}},methods:{fetchPayments:function(e){const n=LNbits.utils.prepareFilterQuery(this.paymentsTable,e);return LNbits.api.getPayments(this.wallet,n).then((e=>{this.paymentsTable.loading=!1,this.paymentsTable.pagination.rowsNumber=e.data.total,this.payments=e.data.data.map((e=>LNbits.map.payment(e)))})).catch((e=>{this.paymentsTable.loading=!1,LNbits.utils.notifyApiError(e)}))},paymentTableRowKey:function(e){return e.payment_hash+e.amount},exportCSV(e=!1){const n=this.paymentsTable.pagination,t={sortby:n.sortBy??"time",direction:n.descending?"desc":"asc"},i=new URLSearchParams(t);LNbits.api.getPayments(this.wallet,i).then((n=>{let t=n.data.data.map(LNbits.map.payment),i=this.paymentsCSV.columns;if(e){this.exportPaymentTagList.length&&(t=t.filter((e=>this.exportPaymentTagList.includes(e.tag))));const e=Object.keys(t.reduce(((e,n)=>({...e,...n.details})),{})).map((e=>({name:e,align:"right",label:e.charAt(0).toUpperCase()+e.slice(1).replace(/([A-Z])/g," $1"),field:n=>n.details[e],format:e=>"object"==typeof e?JSON.stringify(e):e})));i=this.paymentsCSV.columns.concat(e)}LNbits.utils.exportCSV(i,t,this.wallet.name+"-payments")}))},addFilterTag:function(){if(!this.exportTagName)return;const e=this.exportTagName.trim();this.exportPaymentTagList=this.exportPaymentTagList.filter((n=>n!==e)),this.exportPaymentTagList.push(e),this.exportTagName=""},removeExportTag:function(e){this.exportPaymentTagList=this.exportPaymentTagList.filter((n=>n!==e))},formatCurrency:function(e,n){try{return LNbits.utils.formatCurrency(e,n)}catch(n){return console.error(n),`${e} ???`}}},watch:{lazy:function(e){!0===e&&this.fetchPayments()},update:function(){this.fetchPayments()}},created:function(){void 0===this.lazy&&this.fetchPayments()},template:'\n \n \n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n
\n \n
\n
\n
\n\n \n \n \n \n \n
\n \n \n
\n
\n \n \n \n \n \n \n
\n \n '}),window.app.component("payment-chart",{name:"payment-chart",props:["wallet"],mixins:[window.windowMixin],data:function(){return{paymentsChart:{show:!1,group:{value:"hour",label:"Hour"},groupOptions:[{value:"hour",label:"Hour"},{value:"day",label:"Day"},{value:"week",label:"Week"},{value:"month",label:"Month"},{value:"year",label:"Year"}],instance:null}}},methods:{showChart:function(){this.paymentsChart.show=!0,LNbits.api.request("GET","/api/v1/payments/history?group="+this.paymentsChart.group.value,this.wallet.adminkey).then((e=>{this.$nextTick((()=>{this.paymentsChart.instance&&this.paymentsChart.instance.destroy(),this.paymentsChart.instance=generateChart(this.$refs.canvas,e.data)}))})).catch((e=>{LNbits.utils.notifyApiError(e),this.paymentsChart.show=!1}))}},template:'\n \n \n \n \n \n \n\n \n \n \n
\n
Payments Chart
\n \n \n
\n \n
\n
\n
\n
\n '}),window.app.component(QrcodeVue),window.app.component("lnbits-fsat",{props:{amount:{type:Number,default:0}},template:"{{ fsat }}",computed:{fsat:function(){return LNbits.utils.formatSat(this.amount)}}}),window.app.component("lnbits-wallet-list",{props:["balance"],data:function(){return{user:null,activeWallet:null,balance:0,showForm:!1,walletName:"",LNBITS_DENOMINATION:LNBITS_DENOMINATION}},template:'\n \n \n \n \n \n \n \n \n \n {{ wallet.name }}\n {{ parseFloat(String(wallet.live_fsat).replaceAll(",", "")) / 100 }} {{ LNBITS_DENOMINATION }}\n {{ wallet.live_fsat }} {{ LNBITS_DENOMINATION }}\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n ',computed:{wallets:function(){var e=this.balance;return this.user.wallets.map((function(n){return n.live_fsat=e.length&&e[0]===n.id?LNbits.utils.formatSat(e[1]):n.fsat,n}))}},methods:{createWallet:function(){LNbits.api.createWallet(this.user.wallets[0],this.walletName)}},created:function(){window.user&&(this.user=LNbits.map.user(window.user)),window.wallet&&(this.activeWallet=LNbits.map.wallet(window.wallet)),document.addEventListener("updateWalletBalance",this.updateWalletBalance)}}),window.app.component("lnbits-extension-list",{data:function(){return{extensions:[],user:null}},template:'\n \n \n \n \n \n \n \n \n \n {{ extension.name }} \n \n \n \n \n \n
\n
\n ',computed:{userExtensions:function(){if(!this.user)return[];var e=window.location.pathname,n=this.user.extensions;return this.extensions.filter((function(e){return-1!==n.indexOf(e.code)})).map((function(n){return n.isActive=e.startsWith(n.url),n}))}},created:function(){window.extensions&&(this.extensions=window.extensions.map((function(e){return LNbits.map.extension(e)})).sort((function(e,n){return e.name.localeCompare(n.name)}))),window.user&&(this.user=LNbits.map.user(window.user))}}),window.app.component("lnbits-manage",{props:["showAdmin","showNode","showExtensions","showUsers"],methods:{isActive:function(e){return window.location.pathname===e}},data:function(){return{extensions:[],user:null}},template:'\n \n \n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n
\n ',created:function(){window.user&&(this.user=LNbits.map.user(window.user))}}),window.app.component("lnbits-payment-details",{props:["payment"],mixins:[window.windowMixin],data:function(){return{LNBITS_DENOMINATION:LNBITS_DENOMINATION}},template:'\n
\n\n
\n \n #{{ payment.tag }}\n \n
\n\n
\n :\n {{ payment.date }} ({{ payment.dateFrom }})\n
\n\n
\n :\n {{ payment.expirydate }} ({{ payment.expirydateFrom }})\n
\n\n
\n :\n {{ (payment.amount / 1000).toFixed(3) }} {{LNBITS_DENOMINATION}}\n
\n\n
\n :\n {{ (payment.fee / 1000).toFixed(3) }} {{LNBITS_DENOMINATION}}\n
\n\n
\n : {{ payment.payment_hash }}\n \n
\n\n
\n : {{ payment.memo }}\n
\n\n
\n : {{ payment.webhook }}: \n {{ webhookStatusText }}\n \n
\n\n
\n : {{ payment.preimage }}\n
\n\n
\n \n extra\n \n {{ entry.key }}:\n {{ entry.value }}\n
\n\n
\n Success action:\n \n
\n\n
\n ',computed:{hasPreimage(){return this.payment.preimage&&"0000000000000000000000000000000000000000000000000000000000000000"!==this.payment.preimage},hasExpiry(){return!!this.payment.expiry},hasSuccessAction(){return this.hasPreimage&&this.payment.extra&&this.payment.extra.success_action},webhookStatusColor(){return this.payment.webhook_status>=300||this.payment.webhook_status<0?"red-10":this.payment.webhook_status?"green-10":"cyan-7"},webhookStatusText(){return this.payment.webhook_status?this.payment.webhook_status:"not sent yet"},hasTag(){return this.payment.extra&&!!this.payment.extra.tag},extras(){if(!this.payment.extra)return[];let e=_.omit(this.payment.extra,["tag","success_action"]);return Object.keys(e).map((n=>({key:n,value:e[n]})))}}}),window.app.component("lnbits-lnurlpay-success-action",{props:["payment","success_action"],data(){return{decryptedValue:this.success_action.ciphertext}},template:'\n
\n

{{ success_action.message || success_action.description }}

\n \n {{ decryptedValue }}\n \n

\n {{ success_action.url }}\n

\n
\n ',mounted:function(){if("aes"!==this.success_action.tag)return null;decryptLnurlPayAES(this.success_action,this.payment.preimage).then((e=>{this.decryptedValue=e}))}}),window.app.component("lnbits-qrcode",{mixins:[window.windowMixin],components:{QrcodeVue:QrcodeVue},props:["value"],data:()=>({logo:LNBITS_QR_LOGO}),template:'\n
\n \n ...\n
\n '}),window.app.component("lnbits-notifications-btn",{mixins:[window.windowMixin],props:["pubkey"],data:()=>({isSupported:!1,isSubscribed:!1,isPermissionGranted:!1,isPermissionDenied:!1}),template:'\n \n Subscribe to notifications\n Unsubscribe from notifications\n \n Notifications are disabled,
please enable or reset permissions\n
\n Notifications are not supported\n \n ',methods:{urlB64ToUint8Array(e){const n=(e+"=".repeat((4-e.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),t=atob(n),i=new Uint8Array(t.length);for(let e=0;en!==e)),this.$q.localStorage.set("lnbits.webpush.subscribedUsers",JSON.stringify(n))},isUserSubscribed(e){return(JSON.parse(this.$q.localStorage.getItem("lnbits.webpush.subscribedUsers"))||[]).includes(e)},subscribe(){var e=this;this.isSupported&&!this.isPermissionDenied&&(Notification.requestPermission().then((e=>{this.isPermissionGranted="granted"===e,this.isPermissionDenied="denied"===e})).catch((function(e){console.log(e)})),navigator.serviceWorker.ready.then((n=>{navigator.serviceWorker.getRegistration().then((n=>{n.pushManager.getSubscription().then((function(t){if(null===t||!e.isUserSubscribed(e.g.user.id)){const t={applicationServerKey:e.urlB64ToUint8Array(e.pubkey),userVisibleOnly:!0};n.pushManager.subscribe(t).then((function(n){LNbits.api.request("POST","/api/v1/webpush",e.g.user.wallets[0].adminkey,{subscription:JSON.stringify(n)}).then((function(n){e.saveUserSubscribed(n.data.user),e.isSubscribed=!0})).catch((function(e){LNbits.utils.notifyApiError(e)}))}))}})).catch((function(e){console.log(e)}))}))})))},unsubscribe(){var e=this;navigator.serviceWorker.ready.then((n=>{n.pushManager.getSubscription().then((n=>{n&&LNbits.api.request("DELETE","/api/v1/webpush?endpoint="+btoa(n.endpoint),e.g.user.wallets[0].adminkey).then((function(){e.removeUserSubscribed(e.g.user.id),e.isSubscribed=!1})).catch((function(e){LNbits.utils.notifyApiError(e)}))}))})).catch((function(e){console.log(e)}))},checkSupported:function(){let e="https:"===window.location.protocol,n="serviceWorker"in navigator,t="Notification"in window,i="PushManager"in window;return this.isSupported=e&&n&&t&&i,this.isSupported||console.log("Notifications disabled because requirements are not met:",{HTTPS:e,"Service Worker API":n,"Notification API":t,"Push API":i}),this.isSupported},updateSubscriptionStatus:async function(){var e=this;await navigator.serviceWorker.ready.then((n=>{n.pushManager.getSubscription().then((n=>{e.isSubscribed=!!n&&e.isUserSubscribed(e.g.user.id)}))})).catch((function(e){console.log(e)}))}},created:function(){this.isPermissionDenied="denied"===Notification.permission,this.checkSupported()&&this.updateSubscriptionStatus()}}),window.app.component("lnbits-dynamic-fields",{mixins:[window.windowMixin],props:["options","value"],data:()=>({formData:null,rules:[e=>!!e||"Field is required"]}),template:'\n
\n
\n
\n

\n ()\n

\n \n \n
\n \n \n \n \n \n
\n \n \n \n \n \n \n \n \n \n
\n \n \n
\n
\n
\n
\n ',methods:{applyRules(e){return e?this.rules:[]},buildData(e,n={}){return e.reduce(((e,t)=>(t.options?.length?e[t.name]=this.buildData(t.options,n[t.name]):e[t.name]=n[t.name]??t.default,e)),{})},handleValueChanged(){this.$emit("input",this.formData)}},created:function(){this.formData=this.buildData(this.options,this.value)}}),window.app.component("lnbits-update-balance",{mixins:[window.windowMixin],props:["wallet_id","callback"],computed:{denomination:()=>LNBITS_DENOMINATION,admin(){return this.g.user.admin}},data:function(){return{credit:0}},methods:{updateBalance:function(e){LNbits.api.updateBalance(e,this.wallet_id).then((n=>{if("Success"!==n.data.status)throw new Error(n.data);this.callback({success:!0,credit:parseInt(e),wallet_id:this.wallet_id})})).then((n=>(e=parseInt(e),this.$q.notify({type:"positive",message:this.$t("wallet_topup_ok",{amount:e}),icon:null}),e))).catch((function(e){LNbits.utils.notifyApiError(e)}))}},template:'\n \n \n \n \n \n \n Topup Wallet\n \n '}),window.app.use(VueQrcodeReader),window.app.use(Quasar),window.app.use(window.i18n),window.app.mount("#vue");