feat: basic market-config component
This commit is contained in:
parent
e41ede5216
commit
6c02e58f84
4 changed files with 124 additions and 3 deletions
55
static/components/market-config/market-config.html
Normal file
55
static/components/market-config/market-config.html
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
<q-card>
|
||||
<div class="q-pa-md">
|
||||
<div class="q-gutter-y-md">
|
||||
<q-tabs v-model="tab" active-color="primary" align="justify">
|
||||
<q-tab name="merchants" label="Merchants" @update="val => tab = val.name"></q-tab>
|
||||
<q-tab name="relays" label="Relays" @update="val => tab = val.name"></q-tab>
|
||||
<q-tab name="marketplace" label="Look And Feel" @update="val => tab = val.name"></q-tab>
|
||||
|
||||
</q-tabs>
|
||||
<q-tab-panels v-model="tab">
|
||||
<q-tab-panel name="merchants">
|
||||
<div>
|
||||
<q-input filled v-model="inputPubkey" @keydown.enter="addPubkey(null)" type="text" label="Pubkey/Npub"
|
||||
hint="Add merchants">
|
||||
<q-btn @click="addPubkey(null)" dense flat icon="add"></q-btn>
|
||||
</q-input>
|
||||
<q-list class="q-mt-md">
|
||||
<q-item v-for="pub in Array.from(pubkeys)" :key="pub">
|
||||
|
||||
<q-item-section avatar>
|
||||
<q-avatar>
|
||||
<img v-if="profiles.get(pub) && profiles.get(pub)?.picture" :src="profiles.get(pub).picture" />
|
||||
<img v-else src="/nostrmarket/static/images/blank-avatar.webp" />
|
||||
</q-avatar>
|
||||
</q-item-section>
|
||||
<q-item-section>
|
||||
<q-item-label v-if="profiles.get(pub) && profiles.get(pub)?.name">{{ profiles.get(pub).name
|
||||
}}</q-item-label>
|
||||
<q-item-label v-else>{{ `${pub.slice(0, 5)}...${pub.slice(-5)}`
|
||||
}}</q-item-label>
|
||||
<q-tooltip>{{ pub }}</q-tooltip>
|
||||
</q-item-section>
|
||||
<q-item-section side>
|
||||
<q-btn class="gt-xs" size="12px" flat dense round icon="delete" @click="removePubkey(pub)" />
|
||||
</q-item-section>
|
||||
|
||||
</q-item>
|
||||
</q-list>
|
||||
</div>
|
||||
</q-tab-panel>
|
||||
<q-tab-panel name="relays">
|
||||
<div>
|
||||
Relays
|
||||
</div>
|
||||
</q-tab-panel>
|
||||
<q-tab-panel name="marketplace">
|
||||
<div>
|
||||
Marketplace
|
||||
</div>
|
||||
</q-tab-panel>
|
||||
</q-tab-panels>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</q-card>
|
||||
61
static/components/market-config/market-config.js
Normal file
61
static/components/market-config/market-config.js
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
async function marketConfig(path) {
|
||||
const template = await loadTemplateAsync(path)
|
||||
Vue.component('market-config', {
|
||||
name: 'market-config',
|
||||
props: ['adminkey',],
|
||||
template,
|
||||
|
||||
data: function () {
|
||||
return {
|
||||
tab: 'merchants',
|
||||
pubkeys: new Set(),
|
||||
profiles: new Map(),
|
||||
inputPubkey: null,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
async addPubkey(pubkey) {
|
||||
if (!pubkey) {
|
||||
pubkey = String(this.inputPubkey).trim()
|
||||
}
|
||||
let regExp = /^#([0-9a-f]{3}){1,2}$/i
|
||||
if (pubkey.startsWith('n')) {
|
||||
try {
|
||||
let { type, data } = NostrTools.nip19.decode(pubkey)
|
||||
if (type === 'npub') pubkey = data
|
||||
else if (type === 'nprofile') {
|
||||
pubkey = data.pubkey
|
||||
givenRelays = data.relays
|
||||
}
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
}
|
||||
} else if (regExp.test(pubkey)) {
|
||||
pubkey = pubkey
|
||||
}
|
||||
this.pubkeys.add(pubkey)
|
||||
this.inputPubkey = null
|
||||
this.$q.localStorage.set(
|
||||
`diagonAlley.merchants`,
|
||||
Array.from(this.pubkeys)
|
||||
)
|
||||
// this.initNostr()// todo: emit
|
||||
},
|
||||
removePubkey(pubkey) {
|
||||
// Needs a hack for Vue reactivity
|
||||
let pubkeys = this.pubkeys
|
||||
pubkeys.delete(pubkey)
|
||||
this.profiles.delete(pubkey)
|
||||
this.pubkeys = new Set(Array.from(pubkeys))
|
||||
this.$q.localStorage.set(
|
||||
`diagonAlley.merchants`,
|
||||
Array.from(this.pubkeys)
|
||||
)
|
||||
// this.initNostr() // todo: emit
|
||||
},
|
||||
},
|
||||
created: async function () {
|
||||
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
@ -30,7 +30,8 @@ const market = async () => {
|
|||
customerStall('static/components/customer-stall/customer-stall.html'),
|
||||
productDetail('static/components/product-detail/product-detail.html'),
|
||||
shoppingCart('static/components/shopping-cart/shopping-cart.html'),
|
||||
chatDialog('static/components/chat-dialog/chat-dialog.html')
|
||||
chatDialog('static/components/chat-dialog/chat-dialog.html'),
|
||||
marketConfig('static/components/market-config/market-config.html')
|
||||
])
|
||||
|
||||
new Vue({
|
||||
|
|
@ -47,6 +48,7 @@ const market = async () => {
|
|||
key: null
|
||||
}
|
||||
},
|
||||
showMarketConfig: false,
|
||||
searchNostr: false,
|
||||
drawer: true,
|
||||
pubkeys: new Set(),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue