From a7ef3f01ca83a009ac4ef8661e6240a0aadda95d Mon Sep 17 00:00:00 2001 From: Phillip Lang Martinez Date: Wed, 26 Oct 2022 10:55:59 +0300 Subject: [PATCH] update msg formats --- .../plugins/core/components/ChatModals.js | 10 +- .../plugins/core/components/ChatPage.js | 150 ++++++++++++------ .../plugins/core/components/ChatScroller.js | 6 +- .../core/components/ChatWelcomePage.js | 10 +- .../plugins/core/components/NameMenu.js | 10 +- .../core/messaging/q-chat/q-chat.src.js | 10 +- 6 files changed, 141 insertions(+), 55 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/components/ChatModals.js b/qortal-ui-plugins/plugins/core/components/ChatModals.js index ab772335..b7370ef3 100644 --- a/qortal-ui-plugins/plugins/core/components/ChatModals.js +++ b/qortal-ui-plugins/plugins/core/components/ChatModals.js @@ -175,7 +175,13 @@ class ChatModals extends LitElement { }; const sendMessageRequest = async (isEncrypted, _publicKey) => { - + const messageObject = { + messageText, + images: [''], + repliedTo: '', + version: 1 + } + const stringifyMessageObject = JSON.stringify(messageObject) let chatResponse = await parentEpml.request('chat', { type: 18, nonce: this.selectedAddress.nonce, @@ -184,7 +190,7 @@ class ChatModals extends LitElement { recipient: recipient, recipientPublicKey: _publicKey, hasChatReference: 0, - message: messageText, + message: stringifyMessageObject, lastReference: reference, proofOfWorkNonce: 0, isEncrypted: isEncrypted, diff --git a/qortal-ui-plugins/plugins/core/components/ChatPage.js b/qortal-ui-plugins/plugins/core/components/ChatPage.js index 0ce9de05..36046bf9 100644 --- a/qortal-ui-plugins/plugins/core/components/ChatPage.js +++ b/qortal-ui-plugins/plugins/core/components/ChatPage.js @@ -221,7 +221,7 @@ class ChatPage extends LitElement {

${this.repliedToMessageObj.senderName ? this.repliedToMessageObj.senderName : this.repliedToMessageObj.sender}

-

${this.repliedToMessageObj.decodedMessage}

+

${this.repliedToMessageObj.message}

${translate("chatpage.cchange25")}

-

${this.editedMessageObj.decodedMessage}

+

${this.editedMessageObj.message}

{ @@ -475,7 +474,7 @@ class ChatPage extends LitElement { } else { const getInitialMessages = await parentEpml.request('apiCall', { type: 'api', - url: `/chat/messages?txGroupId=${Number(this._chatId)}&limit=20&reverse=true&before=${scrollElement.messageObj.timestamp}`, + url: `/chat/messages?txGroupId=${Number(this._chatId)}&limit=20&reverse=true&before=${scrollElement.messageObj.timestamp}&haschatreference=false`, }); @@ -504,7 +503,7 @@ class ChatPage extends LitElement { async processMessages(messages, isInitial) { const findNewMessages = messages.map(async(msg)=> { - console.log({msg}) + let msgItem = msg try { const response = await parentEpml.request('apiCall', { @@ -521,7 +520,7 @@ class ChatPage extends LitElement { editedTimestamp : response[0].timestamp } } - console.log({response}) + } catch (error) { console.log(error) } @@ -547,7 +546,7 @@ class ChatPage extends LitElement { const findNewMessages2 = decodedMessages.map(async(msg)=> { - console.log({msg}) + let parsedMessageObj = msg try { parsedMessageObj = JSON.parse(msg.decodedMessage) @@ -622,15 +621,58 @@ class ChatPage extends LitElement { setTimeout(() => this.downElementObserver(), 500) } else { - messages.forEach((eachMessage) => { - - const _eachMessage = this.decodeMessage(eachMessage) - - - this.renderNewMessage(_eachMessage) + + const findNewMessages2 = messages.map(async(msg)=> { + const _eachMessage = this.decodeMessage(msg) + let parsedMessageObj = _eachMessage + try { + parsedMessageObj = JSON.parse(_eachMessage.decodedMessage) + } catch (error) { + return msg + } + + + let msgItem = _eachMessage + try { + if(parsedMessageObj.repliedTo){ + const response = await parentEpml.request('apiCall', { + type: 'api', + url: `/chat/messages?chatreference=${parsedMessageObj.repliedTo}&reverse=true&involving=${_eachMessage.recipient}&involving=${_eachMessage.sender}`, + }); + + if(response && Array.isArray(response) && response.length !== 0){ + + msgItem = { + ..._eachMessage, + repliedToData : this.decodeMessage(response[0]) + } + } else { + const response2 = await parentEpml.request('apiCall', { + type: 'api', + url: `/chat/messages?reference=${parsedMessageObj.repliedTo}&reverse=true&involving=${_eachMessage.recipient}&involving=${_eachMessage.sender}`, + }); + if(response2 && Array.isArray(response2) && response2.length !== 0){ + + msgItem = { + ..._eachMessage, + repliedToData : this.decodeMessage(response2[0]) + } + } + } + + } + + + } catch (error) { + console.log(error) + } + + + this.renderNewMessage(msgItem) }) + await Promise.all(findNewMessages2) // this.newMessages = this.newMessages.concat(_newMessages) @@ -654,11 +696,9 @@ class ChatPage extends LitElement { // set edited message in chat editor setEditedMessageObj(messageObj) { - console.log(messageObj, "Edited Message Object Here") this.editedMessageObj = {...messageObj}; this.repliedToMessageObj = null; this.requestUpdate(); - console.log(this.editedMessageObj); } closeEditMessageContainer() { @@ -725,7 +765,17 @@ class ChatPage extends LitElement { } async renderNewMessage(newMessage) { + if(newMessage.chatReference){ + const findOriginalMessageIndex = this.messagesRendered.findIndex(msg=> msg.reference === newMessage.chatReference || (msg.chatReference && msg.chatReference === newMessage.chatReference) ) + if(findOriginalMessageIndex !== -1){ + const newMessagesRendered = [...this.messagesRendered] + newMessagesRendered[findOriginalMessageIndex] = {...newMessage, timestamp: newMessagesRendered[findOriginalMessageIndex].timestamp, editedTimestamp: newMessage.timestamp } + this.messagesRendered = newMessagesRendered + await this.getUpdateComplete(); + } + return + } const viewElement = this.shadowRoot.querySelector('chat-scroller').shadowRoot.getElementById('viewElement'); if (newMessage.sender === this.selectedAddress.address) { @@ -761,11 +811,11 @@ class ChatPage extends LitElement { if (this.isReceipient === true) { // direct chat - if (encodedMessageObj.isEncrypted === true && this._publicKey.hasPubKey === true) { + if (encodedMessageObj.isEncrypted === true && this._publicKey.hasPubKey === true && encodedMessageObj.data) { let decodedMessage = window.parent.decryptChatMessage(encodedMessageObj.data, window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey, this._publicKey.key, encodedMessageObj.reference) decodedMessageObj = { ...encodedMessageObj, decodedMessage } - } else if (encodedMessageObj.isEncrypted === false) { + } else if (encodedMessageObj.isEncrypted === false && encodedMessageObj.data) { let bytesArray = window.parent.Base58.decode(encodedMessageObj.data) let decodedMessage = new TextDecoder('utf-8').decode(bytesArray) @@ -821,7 +871,6 @@ class ChatPage extends LitElement { // Message Event directSocket.onmessage = async (e) => { - if (initial === 0) { const isReceipient = this.chatId.includes('direct') @@ -835,13 +884,13 @@ class ChatPage extends LitElement { const lastMessage = cachedData[cachedData.length - 1] const newMessages = await parentEpml.request('apiCall', { type: 'api', - url: `/chat/messages?involving=${window.parent.reduxStore.getState().app.selectedAddress.address}&involving=${cid}&limit=20&reverse=true&after=${lastMessage.timestamp}`, + url: `/chat/messages?involving=${window.parent.reduxStore.getState().app.selectedAddress.address}&involving=${cid}&limit=20&reverse=true&after=${lastMessage.timestamp}&haschatreference=false`, }); getInitialMessages = [...cachedData, ...newMessages] } else { getInitialMessages = await parentEpml.request('apiCall', { type: 'api', - url: `/chat/messages?involving=${window.parent.reduxStore.getState().app.selectedAddress.address}&involving=${cid}&limit=20&reverse=true`, + url: `/chat/messages?involving=${window.parent.reduxStore.getState().app.selectedAddress.address}&involving=${cid}&limit=20&reverse=true&haschatreference=false`, }); @@ -852,8 +901,10 @@ class ChatPage extends LitElement { initial = initial + 1 } else { - - this.processMessages(JSON.parse(e.data), false) + if(e.data){ + this.processMessages(JSON.parse(e.data), false) + } + } } @@ -921,14 +972,14 @@ class ChatPage extends LitElement { const newMessages = await parentEpml.request('apiCall', { type: 'api', - url: `/chat/messages?txGroupId=${groupId}&limit=20&reverse=true&after=${lastMessage.timestamp}`, + url: `/chat/messages?txGroupId=${groupId}&limit=20&reverse=true&after=${lastMessage.timestamp}&haschatreference=false`, }); getInitialMessages = [...cachedData, ...newMessages] } else { getInitialMessages = await parentEpml.request('apiCall', { type: 'api', - url: `/chat/messages?txGroupId=${groupId}&limit=20&reverse=true`, + url: `/chat/messages?txGroupId=${groupId}&limit=20&reverse=true&haschatreference=false`, }); @@ -939,8 +990,10 @@ class ChatPage extends LitElement { initial = initial + 1 } else { - - this.processMessages(JSON.parse(e.data), false) + if(e.data){ + this.processMessages(JSON.parse(e.data), false) + } + } } @@ -991,12 +1044,11 @@ class ChatPage extends LitElement { this.isLoading = true; this.chatEditor.disable(); const messageText = this.mirrorChatInput.value; - // Format and Sanitize Message const sanitizedMessage = messageText.replace(/ /gi, ' ').replace(//gi, '\n'); const trimmedMessage = sanitizedMessage.trim(); - console.log('is replied', this.repliedToMessageObj) + if (/^\s*$/.test(trimmedMessage)) { this.isLoading = false; @@ -1014,7 +1066,7 @@ class ChatPage extends LitElement { } typeMessage = 'reply' const messageObject = { - messageText, + messageText: trimmedMessage, images: [''], repliedTo: chatReference, version: 1 @@ -1022,23 +1074,31 @@ class ChatPage extends LitElement { const stringifyMessageObject = JSON.stringify(messageObject) this.sendMessage(stringifyMessageObject, typeMessage ); } else if (this.editedMessageObj) { - let chatReference = this.repliedToMessageObj.reference + typeMessage = 'edit' + let chatReference = this.editedMessageObj.reference - if(this.repliedToMessageObj.chatReference){ - chatReference = this.repliedToMessageObj.chatReference + if(this.editedMessageObj.chatReference){ + chatReference = this.editedMessageObj.chatReference } - typeMessage = 'reply' + + let message = "" + try { + const parsedMessageObj = JSON.parse(this.editedMessageObj.decodedMessage) + message = parsedMessageObj + + } catch (error) { + message = this.messageObj.decodedMessage + } const messageObject = { - messageText, - images: [''], - repliedTo: chatReference, - version: 1 + ...message, + messageText: trimmedMessage, + } const stringifyMessageObject = JSON.stringify(messageObject) this.sendMessage(stringifyMessageObject, typeMessage, chatReference); } else { const messageObject = { - messageText, + messageText: trimmedMessage, images: [''], repliedTo: '', version: 1 @@ -1049,7 +1109,7 @@ class ChatPage extends LitElement { } async sendMessage(messageText, typeMessage, chatReference) { - console.log({messageText}, 'hello') + this.isLoading = true; let _reference = new Uint8Array(64); @@ -1074,7 +1134,7 @@ class ChatPage extends LitElement { isText: 1 } }); - console.log({chatResponse}) + _computePow(chatResponse) } else { let groupResponse = await parentEpml.request('chat', { diff --git a/qortal-ui-plugins/plugins/core/components/ChatScroller.js b/qortal-ui-plugins/plugins/core/components/ChatScroller.js index db991014..3db65871 100644 --- a/qortal-ui-plugins/plugins/core/components/ChatScroller.js +++ b/qortal-ui-plugins/plugins/core/components/ChatScroller.js @@ -44,7 +44,6 @@ class ChatScroller extends LitElement { render() { - console.log({messages: this.messages}) return html`
    @@ -219,7 +218,10 @@ class MessageTemplate extends LitElement { const nodeUrl = myNode.protocol + '://' + myNode.domain + ':' + myNode.port const avatarUrl = `${nodeUrl}/arbitrary/THUMBNAIL/${this.messageObj.senderName}/qortal_avatar?async=true&apiKey=${myNode.apiKey}` avatarImg = html`` + } else { + avatarImg = html`` } + if (this.messageObj.sender === this.myAddress) { nameMenu = html`${this.messageObj.senderName ? this.messageObj.senderName : this.messageObj.sender}` @@ -265,7 +267,7 @@ class MessageTemplate extends LitElement { .showBlockUserModal=${() => this.showBlockUserModal()} .showBlockIconFunc=${(props) => this.showBlockIconFunc(props)} .showBlockAddressIcon=${this.showBlockAddressIcon} - .originalMessage=${this.messageObj} + .originalMessage=${{...this.messageObj, message}} .setRepliedToMessageObj=${this.setRepliedToMessageObj} .setEditedMessageObj=${this.setEditedMessageObj} .focusChatEditor=${this.focusChatEditor} diff --git a/qortal-ui-plugins/plugins/core/components/ChatWelcomePage.js b/qortal-ui-plugins/plugins/core/components/ChatWelcomePage.js index 782db47f..14735c00 100644 --- a/qortal-ui-plugins/plugins/core/components/ChatWelcomePage.js +++ b/qortal-ui-plugins/plugins/core/components/ChatWelcomePage.js @@ -402,7 +402,13 @@ class ChatWelcomePage extends LitElement { }; const sendMessageRequest = async (isEncrypted, _publicKey) => { - + const messageObject = { + messageText, + images: [''], + repliedTo: '', + version: 1 + } + const stringifyMessageObject = JSON.stringify(messageObject) let chatResponse = await parentEpml.request('chat', { type: 18, nonce: this.selectedAddress.nonce, @@ -411,7 +417,7 @@ class ChatWelcomePage extends LitElement { recipient: recipient, recipientPublicKey: _publicKey, hasChatReference: 0, - message: messageText, + message: stringifyMessageObject, lastReference: reference, proofOfWorkNonce: 0, isEncrypted: isEncrypted, diff --git a/qortal-ui-plugins/plugins/core/components/NameMenu.js b/qortal-ui-plugins/plugins/core/components/NameMenu.js index 17c39a88..9b1a9635 100644 --- a/qortal-ui-plugins/plugins/core/components/NameMenu.js +++ b/qortal-ui-plugins/plugins/core/components/NameMenu.js @@ -521,7 +521,13 @@ class NameMenu extends LitElement { }; const sendMessageRequest = async (isEncrypted, _publicKey) => { - + const messageObject = { + messageText, + images: [''], + repliedTo: '', + version: 1 + } + const stringifyMessageObject = JSON.stringify(messageObject) let chatResponse = await parentEpml.request('chat', { type: 18, nonce: this.selectedAddress.nonce, @@ -530,7 +536,7 @@ class NameMenu extends LitElement { recipient: recipient, recipientPublicKey: _publicKey, hasChatReference: 0, - message: messageText, + message: stringifyMessageObject, lastReference: reference, proofOfWorkNonce: 0, isEncrypted: isEncrypted, diff --git a/qortal-ui-plugins/plugins/core/messaging/q-chat/q-chat.src.js b/qortal-ui-plugins/plugins/core/messaging/q-chat/q-chat.src.js index 0eddc863..5de97d52 100644 --- a/qortal-ui-plugins/plugins/core/messaging/q-chat/q-chat.src.js +++ b/qortal-ui-plugins/plugins/core/messaging/q-chat/q-chat.src.js @@ -811,7 +811,13 @@ class Chat extends LitElement { }; const sendMessageRequest = async (isEncrypted, _publicKey) => { - + const messageObject = { + messageText, + images: [''], + repliedTo: '', + version: 1 + } + const stringifyMessageObject = JSON.stringify(messageObject) let chatResponse = await parentEpml.request('chat', { type: 18, nonce: this.selectedAddress.nonce, @@ -820,7 +826,7 @@ class Chat extends LitElement { recipient: recipient, recipientPublicKey: _publicKey, hasChatReference: 0, - message: messageText, + message: stringifyMessageObject, lastReference: reference, proofOfWorkNonce: 0, isEncrypted: isEncrypted,