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 = {