diff --git a/static/components/chat-dialog/chat-dialog.html b/static/components/chat-dialog/chat-dialog.html index e163c25..5f15ec0 100644 --- a/static/components/chat-dialog/chat-dialog.html +++ b/static/components/chat-dialog/chat-dialog.html @@ -41,10 +41,16 @@ :name="message.sender" :text="[message.msg]" :sent="message.sender == 'Me'" - :bg-color="message.sender == 'Me' ? 'white' : 'light-green-2'" + :bg-color="message.json ? 'purple-2' : message.sender == 'Me' ? 'white' : 'light-green-2'" :stamp="message.timestamp" size="6" - /> + > diff --git a/static/components/chat-dialog/chat-dialog.js b/static/components/chat-dialog/chat-dialog.js index 6cc42d9..9d304c8 100644 --- a/static/components/chat-dialog/chat-dialog.js +++ b/static/components/chat-dialog/chat-dialog.js @@ -11,6 +11,7 @@ async function chatDialog(path) { dialog: false, isChat: true, loading: false, + messagesMap: new Map(), nostrMessages: [], newMessage: '', ordersTable: { @@ -63,14 +64,15 @@ async function chatDialog(path) { }, ordersList() { let orders = this.nostrMessages + .filter(o => o.json) .sort((a, b) => b.created_at - a.created_at) - .filter(o => isJson(o.msg)) .reduce((acc, cur) => { - const obj = JSON.parse(cur.msg) + const obj = cur.json const key = obj.id const curGroup = acc[key] ?? {created_at: cur.timestamp} return {...acc, [key]: {...curGroup, ...obj}} }, {}) + return Object.values(orders) } }, @@ -85,8 +87,8 @@ async function chatDialog(path) { }, async startPool() { this.loading = true - let messagesMap = new Map() - let sub = this.pool.sub(Array.from(this.relays), [ + let relays = Array.from(this.relays) + let filters = [ { kinds: [4], authors: [this.account.pubkey] @@ -95,45 +97,75 @@ async function chatDialog(path) { kinds: [4], '#p': [this.account.pubkey] } - ]) + ] + let events = await this.pool.list(relays, filters) - sub.on('eose', () => { - this.loading = false - this.nostrMessages = Array.from(messagesMap.values()) - }) + for (const event of events) { + await this.processMessage(event) + } + + this.nostrMessages = Array.from(this.messagesMap.values()) + this.loading = false + + let sub = this.pool.sub( + relays, + filters.map(f => ({...f, since: Date.now() / 1000})) + ) sub.on('event', async event => { - let mine = event.pubkey == this.account.pubkey - let sender = mine ? this.merchant : event.pubkey - - try { - let plaintext - if (this.account.privkey) { - plaintext = await NostrTools.nip04.decrypt( - this.account.privkey, - sender, - event.content - ) - } else if (this.account.useExtension && this.hasNip07) { - plaintext = await window.nostr.nip04.decrypt( - sender, - event.content - ) - } - if (plaintext) { - messagesMap.set(event.id, { - created_at: event.created_at, - msg: plaintext, - timestamp: timeFromNow(event.created_at * 1000), - sender: `${mine ? 'Me' : 'Merchant'}` - }) - this.nostrMessages = Array.from(messagesMap.values()) - } - } catch { - console.debug('Unable to decrypt message! Not for us...') - } + await this.processMessage(event) + this.nostrMessages = Array.from(this.messagesMap.values()) }) this.sub = sub }, + async processMessage(event) { + let mine = event.pubkey == this.account.pubkey + let sender = mine ? this.merchant : event.pubkey + + try { + let plaintext + if (this.account.privkey) { + plaintext = await NostrTools.nip04.decrypt( + this.account.privkey, + sender, + event.content + ) + } else if (this.account.useExtension && this.hasNip07) { + plaintext = await window.nostr.nip04.decrypt(sender, event.content) + } + if (plaintext) { + let {text, json} = this.filterJsonMsg(plaintext) + this.messagesMap.set(event.id, { + created_at: event.created_at, + msg: text, + timestamp: timeFromNow(event.created_at * 1000), + sender: `${mine ? 'Me' : 'Merchant'}`, + json + }) + } + return null + } catch { + console.debug('Unable to decrypt message! Not for us...') + return null + } + }, + filterJsonMsg(text) { + let json = null + + if (!isJson(text)) return {text, json} + + json = JSON.parse(text) + if (json.message) { + text = json.message + } else if (json.items) { + text = `Order placed!
OrderID: ${json.id}` + } else if (json.payment_options) { + text = `Invoice for order: ${json.id}
LN ⚡︎` + } + + return {text, json} + }, async sendMessage() { if (this.newMessage && this.newMessage.length < 1) return let event = {