mirror of
https://github.com/lnbits/lnbits-legend.git
synced 2025-02-25 15:10:41 +01:00
* feat: add shortcuts for insert_query and update_query into `Database` example: await db.insert("table_name", base_model) * remove where from argument * chore: code clean-up * extension manager * lnbits-qrcode components * parse date from dict * refactor: make `settings` a fixture * chore: remove verbose key names * fix: time column * fix: cast balance to `int` * extension toggle vue3 * vue3 @input migration * fix: payment extra and payment hash * fix dynamic fields and ext db migration * remove shadow on cards in dark theme * screwed up and made more css pushes to this branch * attempt to make chip component in settings dynamic fields * dynamic chips * qrscanner * clean init admin settings * make get_user better * add dbversion model * remove update_payment_status/extra/details * traces for value and assertion errors * refactor services * add PaymentFiatAmount * return Payment on api endpoints * rename to get_user_from_account * refactor: just refactor (#2740) * rc5 * Fix db cache (#2741) * [refactor] split services.py (#2742) * refactor: spit `core.py` (#2743) * refactor: make QR more customizable * fix: print.html * fix: qrcode options * fix: white shadow on dark theme * fix: datetime wasnt parsed in dict_to_model * add timezone for conversion * only parse timestamp for sqlite, postgres does it * log internal payment success * fix: export wallet to phone QR * Adding a customisable border theme, like gradient (#2746) * fixed mobile scan btn * fix test websocket * fix get_payments tests * dict_to_model skip none values * preimage none instead of defaulting to 0000... * fixup test real invoice tests * fixed pheonixd for wss * fix nodemanager test settings * fix lnbits funding * only insert extension when they dont exist --------- Co-authored-by: Vlad Stan <stan.v.vlad@gmail.com> Co-authored-by: Tiago Vasconcelos <talvasconcelos@gmail.com> Co-authored-by: Arc <ben@arc.wales> Co-authored-by: Arc <33088785+arcbtc@users.noreply.github.com>
219 lines
7.3 KiB
JavaScript
219 lines
7.3 KiB
JavaScript
window.app = Vue.createApp({
|
|
el: '#vue',
|
|
mixins: [window.windowMixin],
|
|
data: function () {
|
|
return {
|
|
user: null,
|
|
hasUsername: false,
|
|
showUserId: false,
|
|
reactionOptions: [
|
|
'None',
|
|
'confettiBothSides',
|
|
'confettiFireworks',
|
|
'confettiStars'
|
|
],
|
|
borderOptions: ['retro-border', 'hard-border', 'no-border'],
|
|
tab: 'user',
|
|
credentialsData: {
|
|
show: false,
|
|
oldPassword: null,
|
|
newPassword: null,
|
|
newPasswordRepeat: null,
|
|
username: null,
|
|
pubkey: null
|
|
}
|
|
}
|
|
},
|
|
methods: {
|
|
activeLanguage: function (lang) {
|
|
return window.i18n.global.locale === lang
|
|
},
|
|
changeLanguage: function (newValue) {
|
|
window.i18n.global.locale = newValue
|
|
this.$q.localStorage.set('lnbits.lang', newValue)
|
|
},
|
|
toggleDarkMode: function () {
|
|
this.$q.dark.toggle()
|
|
this.$q.localStorage.set('lnbits.darkMode', this.$q.dark.isActive)
|
|
if (!this.$q.dark.isActive && this.gradientChoice) {
|
|
this.toggleGradient()
|
|
}
|
|
},
|
|
applyGradient: function () {
|
|
darkBgColor = this.$q.localStorage.getItem('lnbits.darkBgColor')
|
|
primaryColor = this.$q.localStorage.getItem('lnbits.primaryColor')
|
|
if (this.gradientChoice) {
|
|
if (!this.$q.dark.isActive) {
|
|
this.toggleDarkMode()
|
|
}
|
|
const gradientStyle = `linear-gradient(to bottom right, ${LNbits.utils.hexDarken(String(primaryColor), -70)}, #0a0a0a)`
|
|
document.body.style.setProperty(
|
|
'background-image',
|
|
gradientStyle,
|
|
'important'
|
|
)
|
|
const gradientStyleCards = `background-color: ${LNbits.utils.hexAlpha(String(darkBgColor), 0.4)} !important`
|
|
const style = document.createElement('style')
|
|
style.innerHTML =
|
|
`body[data-theme="${this.$q.localStorage.getItem('lnbits.theme')}"] .q-card:not(.q-dialog .q-card, .lnbits__dialog-card, .q-dialog-plugin--dark), body.body${this.$q.dark.isActive ? '--dark' : ''} .q-header, body.body${this.$q.dark.isActive ? '--dark' : ''} .q-drawer { ${gradientStyleCards} }` +
|
|
`body[data-theme="${this.$q.localStorage.getItem('lnbits.theme')}"].body--dark{background: ${LNbits.utils.hexDarken(String(primaryColor), -88)} !important; }` +
|
|
`[data-theme="${this.$q.localStorage.getItem('lnbits.theme')}"] .q-card--dark{background: ${String(darkBgColor)} !important;} }`
|
|
document.head.appendChild(style)
|
|
this.$q.localStorage.set('lnbits.gradientBg', true)
|
|
} else {
|
|
this.$q.localStorage.set('lnbits.gradientBg', false)
|
|
}
|
|
},
|
|
applyBorder: function () {
|
|
slef = this
|
|
if (this.borderChoice) {
|
|
this.$q.localStorage.setItem('lnbits.border', this.borderChoice)
|
|
}
|
|
let borderStyle = this.$q.localStorage.getItem('lnbits.border')
|
|
this.borderChoice = borderStyle
|
|
let borderStyleCSS
|
|
if (borderStyle == 'hard-border') {
|
|
borderStyleCSS = `box-shadow: 0 0 0 1px rgba(0,0,0,.12), 0 0 0 1px #ffffff47; border: none;`
|
|
}
|
|
if (borderStyle == 'no-border') {
|
|
borderStyleCSS = `box-shadow: none; border: none;`
|
|
}
|
|
if (borderStyle == 'retro-border') {
|
|
borderStyleCSS = `border: none; border-color: rgba(255, 255, 255, 0.28); box-shadow: 0 1px 5px rgba(255, 255, 255, 0.2), 0 2px 2px rgba(255, 255, 255, 0.14), 0 3px 1px -2px rgba(255, 255, 255, 0.12);`
|
|
}
|
|
let style = document.createElement('style')
|
|
style.innerHTML = `body[data-theme="${this.$q.localStorage.getItem('lnbits.theme')}"] .q-card.q-card--dark, .q-date--dark { ${borderStyleCSS} }`
|
|
document.head.appendChild(style)
|
|
},
|
|
toggleGradient: function () {
|
|
this.gradientChoice = !this.gradientChoice
|
|
this.applyGradient()
|
|
if (!this.gradientChoice) {
|
|
window.location.reload()
|
|
}
|
|
this.gradientChoice = this.$q.localStorage.getItem('lnbits.gradientBg')
|
|
},
|
|
reactionChoiceFunc: function () {
|
|
this.$q.localStorage.set('lnbits.reactions', this.reactionChoice)
|
|
},
|
|
changeColor: function (newValue) {
|
|
document.body.setAttribute('data-theme', newValue)
|
|
this.$q.localStorage.set('lnbits.theme', newValue)
|
|
this.setColors()
|
|
if (this.$q.localStorage.getItem('lnbits.gradientBg')) {
|
|
this.applyGradient()
|
|
}
|
|
},
|
|
updateAccount: async function () {
|
|
try {
|
|
const {data} = await LNbits.api.request(
|
|
'PUT',
|
|
'/api/v1/auth/update',
|
|
null,
|
|
{
|
|
user_id: this.user.id,
|
|
username: this.user.username,
|
|
email: this.user.email,
|
|
extra: this.user.extra
|
|
}
|
|
)
|
|
this.user = data
|
|
this.hasUsername = !!data.username
|
|
Quasar.Notify.create({
|
|
type: 'positive',
|
|
message: 'Account updated.'
|
|
})
|
|
} catch (e) {
|
|
LNbits.utils.notifyApiError(e)
|
|
}
|
|
},
|
|
disableUpdatePassword: function () {
|
|
return (
|
|
!this.credentialsData.newPassword ||
|
|
!this.credentialsData.newPasswordRepeat ||
|
|
this.credentialsData.newPassword !==
|
|
this.credentialsData.newPasswordRepeat
|
|
)
|
|
},
|
|
updatePassword: async function () {
|
|
if (!this.credentialsData.username) {
|
|
Quasar.Notify.create({
|
|
type: 'warning',
|
|
message: 'Please set a username.'
|
|
})
|
|
return
|
|
}
|
|
try {
|
|
const {data} = await LNbits.api.request(
|
|
'PUT',
|
|
'/api/v1/auth/password',
|
|
null,
|
|
{
|
|
user_id: this.user.id,
|
|
username: this.credentialsData.username,
|
|
password_old: this.credentialsData.oldPassword,
|
|
password: this.credentialsData.newPassword,
|
|
password_repeat: this.credentialsData.newPasswordRepeat
|
|
}
|
|
)
|
|
this.user = data
|
|
this.hasUsername = !!data.username
|
|
this.credentialsData.show = false
|
|
Quasar.Notify.create({
|
|
type: 'positive',
|
|
message: 'Password updated.'
|
|
})
|
|
} catch (e) {
|
|
LNbits.utils.notifyApiError(e)
|
|
}
|
|
},
|
|
updatePubkey: async function () {
|
|
try {
|
|
const {data} = await LNbits.api.request(
|
|
'PUT',
|
|
'/api/v1/auth/pubkey',
|
|
null,
|
|
{
|
|
user_id: this.user.id,
|
|
pubkey: this.credentialsData.pubkey
|
|
}
|
|
)
|
|
this.user = data
|
|
this.hasUsername = !!data.username
|
|
this.credentialsData.show = false
|
|
this.$q.notify({
|
|
type: 'positive',
|
|
message: 'Public key updated.'
|
|
})
|
|
} catch (e) {
|
|
LNbits.utils.notifyApiError(e)
|
|
}
|
|
},
|
|
showUpdateCredentials: function () {
|
|
this.credentialsData = {
|
|
show: true,
|
|
oldPassword: null,
|
|
username: this.user.username,
|
|
pubkey: this.user.pubkey,
|
|
newPassword: null,
|
|
newPasswordRepeat: null
|
|
}
|
|
}
|
|
},
|
|
created: async function () {
|
|
try {
|
|
const {data} = await LNbits.api.getAuthenticatedUser()
|
|
this.user = data
|
|
this.hasUsername = !!data.username
|
|
if (!this.user.extra) this.user.extra = {}
|
|
} catch (e) {
|
|
LNbits.utils.notifyApiError(e)
|
|
}
|
|
if (this.$q.localStorage.getItem('lnbits.gradientBg')) {
|
|
this.applyGradient()
|
|
}
|
|
if (this.$q.localStorage.getItem('lnbits.border')) {
|
|
this.applyBorder()
|
|
}
|
|
}
|
|
})
|