From 2811f9f67f4e61ff824510fdcaec5fbeebd4b046 Mon Sep 17 00:00:00 2001 From: Phillip Lang Martinez Date: Sat, 29 Oct 2022 17:39:23 +0300 Subject: [PATCH 1/2] refactor getoldmessage logic --- .../plugins/core/components/ChatPage.js | 119 ++++-------------- .../plugins/utils/replace-messages-edited.js | 100 +++++++++++++++ 2 files changed, 121 insertions(+), 98 deletions(-) create mode 100644 qortal-ui-plugins/plugins/utils/replace-messages-edited.js diff --git a/qortal-ui-plugins/plugins/core/components/ChatPage.js b/qortal-ui-plugins/plugins/core/components/ChatPage.js index c79cf9fc..bc4e85b8 100644 --- a/qortal-ui-plugins/plugins/core/components/ChatPage.js +++ b/qortal-ui-plugins/plugins/core/components/ChatPage.js @@ -19,6 +19,7 @@ import '@polymer/paper-spinner/paper-spinner-lite.js' import '@material/mwc-button' import '@material/mwc-dialog' import '@material/mwc-icon' +import { replaceMessagesEdited } from '../../utils/replace-messages-edited.js'; const messagesCache = localForage.createInstance({ name: "messages-cache", @@ -451,100 +452,17 @@ class ChatPage extends LitElement { }); const decodeMsgs = getInitialMessages.map((eachMessage) => { - return this.decodeMessage(eachMessage) - - - - - }) - - const findNewMessages = decodeMsgs.map(async(msg)=> { - let msgItem = msg - try { - let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}` - if(!this.isReceipient){ - msgQuery = `&txGroupId=${msg.txGroupId}` - } - const response = await parentEpml.request('apiCall', { - type: 'api', - url: `/chat/messages?chatreference=${msg.reference}&reverse=true${msgQuery}`, - }); - - if(response && Array.isArray(response) && response.length !== 0){ - let responseItem = {...response[0]} - delete responseItem.timestamp - msgItem = { - ...msg, - ...responseItem, - editedTimestamp : response[0].timestamp - } - } - - } catch (error) { - console.log(error) - } - - return msgItem - }) - const updateMessages = await Promise.all(findNewMessages) - const findNewMessages2 = updateMessages.map(async(msg)=> { - let parsedMessageObj = msg - try { - parsedMessageObj = JSON.parse(msg.decodedMessage) - } catch (error) { - return msg - } - - - let msgItem = msg - try { - let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}` - if(!this.isReceipient){ - msgQuery = `&txGroupId=${msg.txGroupId}` - } - if(parsedMessageObj.repliedTo){ - const response = await parentEpml.request('apiCall', { - type: 'api', - url: `/chat/messages?chatreference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}`, - }); - - if(response && Array.isArray(response) && response.length !== 0){ - - msgItem = { - ...msg, - repliedToData : this.decodeMessage(response[0]) - } - } else { - - const response2 = await parentEpml.request('apiCall', { - type: 'api', - url: `/chat/messages?reference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}`, - }); - - if(response2 && Array.isArray(response2) && response2.length !== 0){ - - msgItem = { - ...msg, - repliedToData : this.decodeMessage(response2[0]) - } - } - } - - } - - - } catch (error) { - console.log(error) - } - - return msgItem + const updateMessages2 = await replaceMessagesEdited({ + decodedMessages: decodeMsgs, + parentEpml, + isReceipient: this.isReceipient, + decodeMessageFunc: this.decodeMessage, + _publicKey: this._publicKey }) - const updateMessages2 = await Promise.all(findNewMessages2) - this.messagesRendered = [...updateMessages2, ...this.messagesRendered].sort(function (a, b) { return a.timestamp - b.timestamp @@ -917,7 +835,6 @@ class ChatPage extends LitElement { const stringified = JSON.stringify(messageObject) - console.log({stringified}) const size = new Blob([stringified]).size; this.chatMessageSize = size @@ -1046,18 +963,25 @@ class ChatPage extends LitElement { * @param {Object} encodedMessageObj * */ - decodeMessage(encodedMessageObj) { + decodeMessage(encodedMessageObj, isReceipient, _publicKey ) { + let isReceipientVar + let _publicKeyVar + try { + isReceipientVar = this.isReceipient === undefined ? isReceipient : this.isReceipient; + _publicKeyVar = this._publicKey === undefined ? _publicKey : this._publicKey + } catch (error) { + isReceipientVar = isReceipient + _publicKeyVar = _publicKey + } + let decodedMessageObj = {} - if (this.isReceipient === true) { + if (isReceipientVar === true) { // direct chat - - 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) + if (encodedMessageObj.isEncrypted === true && _publicKeyVar.hasPubKey === true && encodedMessageObj.data) { + let decodedMessage = window.parent.decryptChatMessage(encodedMessageObj.data, window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey, _publicKeyVar.key, encodedMessageObj.reference) decodedMessageObj = { ...encodedMessageObj, decodedMessage } } else if (encodedMessageObj.isEncrypted === false && encodedMessageObj.data) { - let bytesArray = window.parent.Base58.decode(encodedMessageObj.data) let decodedMessage = new TextDecoder('utf-8').decode(bytesArray) decodedMessageObj = { ...encodedMessageObj, decodedMessage } @@ -1356,7 +1280,6 @@ class ChatPage extends LitElement { let _reference = new Uint8Array(64); window.crypto.getRandomValues(_reference); let reference = window.parent.Base58.encode(_reference); - const sendMessageRequest = async () => { if (this.isReceipient === true) { let chatResponse = await parentEpml.request('chat', { diff --git a/qortal-ui-plugins/plugins/utils/replace-messages-edited.js b/qortal-ui-plugins/plugins/utils/replace-messages-edited.js new file mode 100644 index 00000000..71579f80 --- /dev/null +++ b/qortal-ui-plugins/plugins/utils/replace-messages-edited.js @@ -0,0 +1,100 @@ +export const replaceMessagesEdited = async ({ + decodedMessages, + parentEpml, + isReceipient, + decodeMessageFunc, + _publicKey +}) => { + const findNewMessages = decodedMessages.map(async (msg) => { + let msgItem = msg + try { + let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}` + if (!isReceipient) { + msgQuery = `&txGroupId=${msg.txGroupId}` + } + const response = await parentEpml.request("apiCall", { + type: "api", + url: `/chat/messages?chatreference=${msg.reference}&reverse=true${msgQuery}`, + }) + + console.log({response}) + + if (response && Array.isArray(response) && response.length !== 0) { + let responseItem = { ...response[0] } + console.log('right before') + const decodeResponseItem = decodeMessageFunc(responseItem, isReceipient, _publicKey) + console.log({decodeResponseItem}) + delete decodeResponseItem.timestamp + msgItem = { + ...msg, + ...decodeResponseItem, + editedTimestamp: response[0].timestamp, + } + } + } catch (error) { + console.log(error) + } + + return msgItem + }) + const updateMessages = await Promise.all(findNewMessages) + const findNewMessages2 = updateMessages.map(async (msg) => { + let parsedMessageObj = msg + try { + parsedMessageObj = JSON.parse(msg.decodedMessage) + } catch (error) { + console.log('error', {parsedMessageObj}) + return msg + } + console.log('noerror') + let msgItem = msg + try { + let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}` + if (!isReceipient) { + msgQuery = `&txGroupId=${msg.txGroupId}` + } + + console.log({parsedMessageObj}) + if (parsedMessageObj.repliedTo) { + const response = await parentEpml.request("apiCall", { + type: "api", + url: `/chat/messages?chatreference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}`, + }) + console.log({response2: response}) + if ( + response && + Array.isArray(response) && + response.length !== 0 + ) { + msgItem = { + ...msg, + repliedToData: decodeMessageFunc(response[0], isReceipient, _publicKey), + } + } else { + const response2 = await parentEpml.request("apiCall", { + type: "api", + url: `/chat/messages?reference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}`, + }) + + if ( + response2 && + Array.isArray(response2) && + response2.length !== 0 + ) { + msgItem = { + ...msg, + repliedToData: decodeMessageFunc(response2[0]), + } + } + } + } + } catch (error) { + console.log(error) + } + + return msgItem + }) + const updateMessages2 = await Promise.all(findNewMessages2) + + return updateMessages2 +} From ce7eb44197a9691a4eb25e2452899615f5874545 Mon Sep 17 00:00:00 2001 From: Phillip Lang Martinez Date: Sat, 29 Oct 2022 18:25:55 +0300 Subject: [PATCH 2/2] refactor newMessage and initial --- .../plugins/core/components/ChatPage.js | 268 ++---------------- 1 file changed, 31 insertions(+), 237 deletions(-) diff --git a/qortal-ui-plugins/plugins/core/components/ChatPage.js b/qortal-ui-plugins/plugins/core/components/ChatPage.js index bc4e85b8..f0168fc7 100644 --- a/qortal-ui-plugins/plugins/core/components/ChatPage.js +++ b/qortal-ui-plugins/plugins/core/components/ChatPage.js @@ -456,14 +456,14 @@ class ChatPage extends LitElement { }) - const updateMessages2 = await replaceMessagesEdited({ + const replacedMessages = await replaceMessagesEdited({ decodedMessages: decodeMsgs, parentEpml, isReceipient: this.isReceipient, decodeMessageFunc: this.decodeMessage, _publicKey: this._publicKey }) - this.messagesRendered = [...updateMessages2, ...this.messagesRendered].sort(function (a, b) { + this.messagesRendered = [...replacedMessages, ...this.messagesRendered].sort(function (a, b) { return a.timestamp - b.timestamp }) @@ -479,100 +479,18 @@ class ChatPage extends LitElement { const decodeMsgs = getInitialMessages.map((eachMessage) => { - return this.decodeMessage(eachMessage) - - - - - }) - const findNewMessages = decodeMsgs.map(async(msg)=> { - - let msgItem = msg - try { - let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}` - if(!this.isReceipient){ - msgQuery = `&txGroupId=${msg.txGroupId}` - } - const response = await parentEpml.request('apiCall', { - type: 'api', - url: `/chat/messages?chatreference=${msg.reference}&reverse=true${msgQuery}`, - }); - - if(response && Array.isArray(response) && response.length !== 0){ - let responseItem = {...response[0]} - delete responseItem.timestamp - msgItem = { - ...msg, - ...responseItem, - editedTimestamp : response[0].timestamp - } - } - - } catch (error) { - console.log(error) - } - - return msgItem - }) - const updateMessages = await Promise.all(findNewMessages) - const findNewMessages2 = updateMessages.map(async(msg)=> { - - let parsedMessageObj = msg - try { - parsedMessageObj = JSON.parse(msg.decodedMessage) - } catch (error) { - return msg - } - - - let msgItem = msg - try { - let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}` - if(!this.isReceipient){ - msgQuery = `&txGroupId=${msg.txGroupId}` - } - if(parsedMessageObj.repliedTo){ - const response = await parentEpml.request('apiCall', { - type: 'api', - url: `/chat/messages?chatreference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}`, - }); - - if(response && Array.isArray(response) && response.length !== 0){ - - msgItem = { - ...msg, - repliedToData : this.decodeMessage(response[0]) - } - } else { - - const response2 = await parentEpml.request('apiCall', { - type: 'api', - url: `/chat/messages?reference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}`, - }); - - if(response2 && Array.isArray(response2) && response2.length !== 0){ - - msgItem = { - ...msg, - repliedToData : this.decodeMessage(response2[0]) - } - } - } - - } - - - } catch (error) { - console.log(error) - } - - return msgItem + const replacedMessages = await replaceMessagesEdited({ + decodedMessages: decodeMsgs, + parentEpml, + isReceipient: this.isReceipient, + decodeMessageFunc: this.decodeMessage, + _publicKey: this._publicKey }) - const updateMessages2 = await Promise.all(findNewMessages2) - this.messagesRendered = [...updateMessages2, ...this.messagesRendered].sort(function (a, b) { + + this.messagesRendered = [...replacedMessages, ...this.messagesRendered].sort(function (a, b) { return a.timestamp - b.timestamp }) @@ -586,40 +504,7 @@ class ChatPage extends LitElement { async processMessages(messages, isInitial) { const isReceipient = this.chatId.includes('direct') - const findNewMessages = messages.map(async(msg)=> { - - let msgItem = msg - try { - let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}` - if(!isReceipient){ - msgQuery = `&txGroupId=${msg.txGroupId}` - } - const response = await parentEpml.request('apiCall', { - type: 'api', - url: `/chat/messages?chatreference=${msg.reference}&reverse=true${msgQuery}`, - }); - - if(response && Array.isArray(response) && response.length !== 0){ - let responseItem = {...response[0]} - delete responseItem.timestamp - msgItem = { - ...msg, - ...responseItem, - editedTimestamp : response[0].timestamp - } - } - - } catch (error) { - console.log(error) - } - - return msgItem - }) - const updateMessages = await Promise.all(findNewMessages) - - if (isInitial) { - - const decodedMessages = updateMessages.map((eachMessage) => { + const decodedMessages = messages.map((eachMessage) => { if (eachMessage.isText === true) { this.messageSignature = eachMessage.signature @@ -631,66 +516,20 @@ class ChatPage extends LitElement { return _eachMessage } }) + + if (isInitial) { + - const findNewMessages2 = decodedMessages.map(async(msg)=> { - - let parsedMessageObj = msg - try { - parsedMessageObj = JSON.parse(msg.decodedMessage) - } catch (error) { - return msg - } - - - let msgItem = msg - try { - let msgQuery = `&involving=${msg.recipient}&involving=${msg.sender}` - if(!isReceipient){ - msgQuery = `&txGroupId=${msg.txGroupId}` - } - if(parsedMessageObj.repliedTo){ - const response = await parentEpml.request('apiCall', { - type: 'api', - url: `/chat/messages?chatreference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}`, - }); - - if(response && Array.isArray(response) && response.length !== 0){ - - msgItem = { - ...msg, - repliedToData : this.decodeMessage(response[0]) - } - } else { - - const response2 = await parentEpml.request('apiCall', { - type: 'api', - url: `/chat/messages?reference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}`, - }); - - if(response2 && Array.isArray(response2) && response2.length !== 0){ - - msgItem = { - ...msg, - repliedToData : this.decodeMessage(response2[0]) - } - } - } - - } - - - } catch (error) { - console.log(error) - } - - return msgItem + const replacedMessages = await replaceMessagesEdited({ + decodedMessages: decodedMessages, + parentEpml, + isReceipient: isReceipient, + decodeMessageFunc: this.decodeMessage, + _publicKey: this._publicKey }) - const updateMessages2 = await Promise.all(findNewMessages2) - - - this._messages = updateMessages2.sort(function (a, b) { + this._messages = replacedMessages.sort(function (a, b) { return a.timestamp - b.timestamp }) @@ -707,64 +546,19 @@ class ChatPage extends LitElement { this.isLoadingMessages = false setTimeout(() => this.downElementObserver(), 500) } else { + const replacedMessages = await replaceMessagesEdited({ + decodedMessages: decodedMessages, + parentEpml, + isReceipient: isReceipient, + decodeMessageFunc: this.decodeMessage, + _publicKey: this._publicKey + }) - 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 - - let msgQuery = `&involving=${_eachMessage.recipient}&involving=${_eachMessage.sender}` - if(!isReceipient){ - msgQuery = `&txGroupId=${_eachMessage.txGroupId}` - } - try { - if(parsedMessageObj.repliedTo){ - const response = await parentEpml.request('apiCall', { - type: 'api', - url: `/chat/messages?chatreference=${parsedMessageObj.repliedTo}&reverse=true${msgQuery}`, - }); - - 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${msgQuery}`, - }); - - if(response2 && Array.isArray(response2) && response2.length !== 0){ - - msgItem = { - ..._eachMessage, - repliedToData : this.decodeMessage(response2[0]) - } - } - } - - } - - - } catch (error) { - console.log(error) - } - - - this.renderNewMessage(msgItem) + const renderEachMessage = replacedMessages.map(async(msg)=> { + await this.renderNewMessage(msg) }) - await Promise.all(findNewMessages2) + await Promise.all(renderEachMessage) // this.newMessages = this.newMessages.concat(_newMessages)