forked from Qortal/qortal-ui
fix newest messages and dynamic old
This commit is contained in:
parent
48bf6b3099
commit
63d65c6773
@ -55,7 +55,7 @@ const parentEpml = new Epml({ type: 'WINDOW', source: window.parent })
|
|||||||
|
|
||||||
export const queue = new RequestQueue();
|
export const queue = new RequestQueue();
|
||||||
|
|
||||||
export const chatLimit = 40
|
export const chatLimit = 10
|
||||||
class ChatPage extends LitElement {
|
class ChatPage extends LitElement {
|
||||||
static get properties() {
|
static get properties() {
|
||||||
return {
|
return {
|
||||||
@ -2152,13 +2152,7 @@ class ChatPage extends LitElement {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((message.timestamp - this.messagesRendered[0].timestamp) > 86400000) {
|
|
||||||
let errorMsg = get("chatpage.cchange66")
|
|
||||||
parentEpml.request('showSnackBar', `${errorMsg}`)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((message.timestamp - this.messagesRendered[0].timestamp) < 86400000) {
|
|
||||||
const findOriginalMessage = this.shadowRoot.querySelector('chat-scroller').shadowRoot.getElementById(clickedOnMessage.signature)
|
const findOriginalMessage = this.shadowRoot.querySelector('chat-scroller').shadowRoot.getElementById(clickedOnMessage.signature)
|
||||||
if (findOriginalMessage) {
|
if (findOriginalMessage) {
|
||||||
const messageClientRect = findOriginalMessage.getBoundingClientRect()
|
const messageClientRect = findOriginalMessage.getBoundingClientRect()
|
||||||
@ -2169,15 +2163,25 @@ class ChatPage extends LitElement {
|
|||||||
top: messageClientRect.top,
|
top: messageClientRect.top,
|
||||||
offsetHeight: findOriginalMessage.offsetHeight
|
offsetHeight: findOriginalMessage.offsetHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
|
await this.getOldMessageDynamic(0, clickedOnMessage.timestamp, message)
|
||||||
|
await new Promise((res)=> {
|
||||||
|
setTimeout(()=> {
|
||||||
|
res()
|
||||||
|
},1000)
|
||||||
|
})
|
||||||
|
await this.getUpdateCompleteMessages()
|
||||||
|
|
||||||
|
const marginElements = Array.from(this.shadowRoot.querySelector('chat-scroller').shadowRoot.querySelectorAll('message-template'))
|
||||||
|
const findMessage = marginElements.find((item) => item.messageObj.signature === message.signature)
|
||||||
|
if (findMessage) {
|
||||||
|
findMessage.scrollIntoView({ behavior: 'auto', block: 'center' })
|
||||||
}
|
}
|
||||||
await this.getOldMessageDynamic(0, this.messagesRendered[0].timestamp, message.timestamp - 7200000)
|
|
||||||
const findMessage = this.shadowRoot.querySelector('chat-scroller').shadowRoot.getElementById(message.signature)
|
|
||||||
if (findMessage) {
|
if (findMessage) {
|
||||||
this.isLoadingGoToRepliedMessage = {
|
this.isLoadingGoToRepliedMessage = {
|
||||||
...this.isLoadingGoToRepliedMessage,
|
...this.isLoadingGoToRepliedMessage,
|
||||||
loading: false
|
loading: false
|
||||||
}
|
}
|
||||||
findMessage.scrollIntoView({ block: 'center' })
|
|
||||||
const findElement = findMessage.shadowRoot.querySelector('.message-parent')
|
const findElement = findMessage.shadowRoot.querySelector('.message-parent')
|
||||||
if (findElement) {
|
if (findElement) {
|
||||||
findElement.classList.add('blink-bg')
|
findElement.classList.add('blink-bg')
|
||||||
@ -2553,6 +2557,13 @@ class ChatPage extends LitElement {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async getUpdateCompleteMessages() {
|
||||||
|
await super.getUpdateComplete()
|
||||||
|
const marginElements = Array.from(this.shadowRoot.querySelector('chat-scroller').shadowRoot.querySelectorAll('message-template'))
|
||||||
|
await Promise.all(marginElements.map(el => el.updateComplete))
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
async getUpdateCompleteTextEditor() {
|
async getUpdateCompleteTextEditor() {
|
||||||
await super.getUpdateComplete()
|
await super.getUpdateComplete()
|
||||||
const marginElements = Array.from(this.shadowRoot.querySelectorAll('chat-text-editor'))
|
const marginElements = Array.from(this.shadowRoot.querySelectorAll('chat-text-editor'))
|
||||||
@ -2571,14 +2582,22 @@ class ChatPage extends LitElement {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
async getOldMessageDynamic(limit, before, after) {
|
async getOldMessageDynamic(limit, timestampClickedOnMessage, messageToGoTo) {
|
||||||
|
const findMsg = await parentEpml.request("apiCall", {
|
||||||
|
type: "api",
|
||||||
|
url: `/chat/message/${messageToGoTo.signature}?encoding=BASE64`,
|
||||||
|
})
|
||||||
|
if(!findMsg) return null
|
||||||
if (this.isReceipient) {
|
if (this.isReceipient) {
|
||||||
const getInitialMessages = await parentEpml.request('apiCall', {
|
const getInitialMessagesBefore = await parentEpml.request('apiCall', {
|
||||||
type: 'api',
|
type: 'api',
|
||||||
url: `/chat/messages?involving=${window.parent.reduxStore.getState().app.selectedAddress.address}&involving=${this._chatId}&limit=${limit}&reverse=true&before=${before}&after=${after}&haschatreference=false&encoding=BASE64`
|
url: `/chat/messages?involving=${window.parent.reduxStore.getState().app.selectedAddress.address}&involving=${this._chatId}&limit=${20}&reverse=true&before=${findMsg.timestamp}&haschatreference=false&encoding=BASE64`
|
||||||
})
|
})
|
||||||
|
const getInitialMessagesAfter = await parentEpml.request('apiCall', {
|
||||||
|
type: 'api',
|
||||||
|
url: `/chat/messages?involving=${window.parent.reduxStore.getState().app.selectedAddress.address}&involving=${this._chatId}&limit=${20}&reverse=true&after=${findMsg.timestamp - 100}&haschatreference=false&encoding=BASE64`
|
||||||
|
})
|
||||||
|
const getInitialMessages = [...getInitialMessagesBefore, ...getInitialMessagesAfter]
|
||||||
let decodeMsgs = []
|
let decodeMsgs = []
|
||||||
await new Promise((res, rej) => {
|
await new Promise((res, rej) => {
|
||||||
this.webWorkerDecodeMessages.postMessage({messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey });
|
this.webWorkerDecodeMessages.postMessage({messages: getInitialMessages, isReceipient: this.isReceipient, _publicKey: this._publicKey, privateKey: window.parent.reduxStore.getState().app.selectedAddress.keyPair.privateKey });
|
||||||
@ -2606,7 +2625,7 @@ class ChatPage extends LitElement {
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
let list = [...decodeMsgs, ...this.messagesRendered.slice(0,80)]
|
let list = [...decodeMsgs]
|
||||||
|
|
||||||
await new Promise((res, rej) => {
|
await new Promise((res, rej) => {
|
||||||
|
|
||||||
@ -2621,21 +2640,23 @@ class ChatPage extends LitElement {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
this.messagesRendered = list
|
this.messagesRendered = {
|
||||||
|
messages: list,
|
||||||
|
type: 'inBetween',
|
||||||
|
}
|
||||||
|
|
||||||
this.isLoadingOldMessages = false
|
this.isLoadingOldMessages = false
|
||||||
await this.getUpdateComplete()
|
|
||||||
const viewElement = this.shadowRoot.querySelector('chat-scroller').shadowRoot.getElementById('viewElement')
|
|
||||||
|
|
||||||
if (viewElement) {
|
|
||||||
viewElement.scrollTop = 200
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
const getInitialMessages = await parentEpml.request('apiCall', {
|
const getInitialMessagesBefore = await parentEpml.request('apiCall', {
|
||||||
type: 'api',
|
type: 'api',
|
||||||
url: `/chat/messages?txGroupId=${Number(this._chatId)}&limit=${limit}&reverse=true&before=${before}&after=${after}&haschatreference=false&encoding=BASE64`
|
url: `/chat/messages?txGroupId=${Number(this._chatId)}&limit=${20}&reverse=true&before=${findMsg.timestamp}&haschatreference=false&encoding=BASE64`
|
||||||
})
|
})
|
||||||
|
const getInitialMessagesAfter = await parentEpml.request('apiCall', {
|
||||||
|
type: 'api',
|
||||||
|
url: `/chat/messages?txGroupId=${Number(this._chatId)}&limit=${20}&reverse=true&after=${findMsg.timestamp - 100}&haschatreference=false&encoding=BASE64`
|
||||||
|
})
|
||||||
|
const getInitialMessages = [...getInitialMessagesBefore, ...getInitialMessagesAfter]
|
||||||
|
|
||||||
let decodeMsgs = []
|
let decodeMsgs = []
|
||||||
await new Promise((res, rej) => {
|
await new Promise((res, rej) => {
|
||||||
@ -2664,7 +2685,7 @@ class ChatPage extends LitElement {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
let list = [...decodeMsgs, ...this.messagesRendered.slice(0,80)]
|
let list = [...decodeMsgs]
|
||||||
|
|
||||||
await new Promise((res, rej) => {
|
await new Promise((res, rej) => {
|
||||||
|
|
||||||
@ -2679,16 +2700,15 @@ class ChatPage extends LitElement {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
this.messagesRendered = list
|
this.messagesRendered = {
|
||||||
|
messages: list,
|
||||||
|
type: 'inBetween',
|
||||||
|
signature: messageToGoTo.signature
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
this.isLoadingOldMessages = false
|
this.isLoadingOldMessages = false
|
||||||
await this.getUpdateComplete()
|
|
||||||
const viewElement = this.shadowRoot.querySelector('chat-scroller').shadowRoot.getElementById('viewElement')
|
|
||||||
|
|
||||||
if (viewElement) {
|
|
||||||
viewElement.scrollTop = 200
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3067,22 +3087,22 @@ viewElement.scrollTop = originalScrollTop + heightDifference;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
let list = [...this.messagesRendered]
|
// let list = [...this.messagesRendered]
|
||||||
|
|
||||||
await new Promise((res, rej) => {
|
// await new Promise((res, rej) => {
|
||||||
|
|
||||||
this.webWorkerSortMessages.postMessage({list});
|
// this.webWorkerSortMessages.postMessage({list});
|
||||||
|
|
||||||
this.webWorkerSortMessages.onmessage = e => {
|
// this.webWorkerSortMessages.onmessage = e => {
|
||||||
console.log('e',e)
|
// console.log('e',e)
|
||||||
|
|
||||||
list = e.data
|
// list = e.data
|
||||||
res()
|
// res()
|
||||||
|
|
||||||
}
|
// }
|
||||||
})
|
// })
|
||||||
|
|
||||||
this.messagesRendered = list
|
// this.messagesRendered = list
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3124,15 +3144,19 @@ viewElement.scrollTop = originalScrollTop + heightDifference;
|
|||||||
|
|
||||||
async renderNewMessage(newMessage) {
|
async renderNewMessage(newMessage) {
|
||||||
if (newMessage.chatReference) {
|
if (newMessage.chatReference) {
|
||||||
const findOriginalMessageIndex = this.messagesRendered.findIndex(msg => msg.signature === newMessage.chatReference || (msg.chatReference && msg.chatReference === newMessage.chatReference))
|
// const findOriginalMessageIndex = this.messagesRendered.findIndex(msg => msg.signature === newMessage.chatReference || (msg.chatReference && msg.chatReference === newMessage.chatReference))
|
||||||
if (findOriginalMessageIndex !== -1 && this.messagesRendered[findOriginalMessageIndex].sender === newMessage.sender) {
|
// if (findOriginalMessageIndex !== -1 && this.messagesRendered[findOriginalMessageIndex].sender === newMessage.sender) {
|
||||||
const newMessagesRendered = [...this.messagesRendered]
|
// const newMessagesRendered = [...this.messagesRendered]
|
||||||
newMessagesRendered[findOriginalMessageIndex] = {
|
// newMessagesRendered[findOriginalMessageIndex] = {
|
||||||
...newMessage, timestamp: newMessagesRendered[findOriginalMessageIndex].timestamp, senderName: newMessagesRendered[findOriginalMessageIndex].senderName,
|
// ...newMessage, timestamp: newMessagesRendered[findOriginalMessageIndex].timestamp, senderName: newMessagesRendered[findOriginalMessageIndex].senderName,
|
||||||
sender: newMessagesRendered[findOriginalMessageIndex].sender, editedTimestamp: newMessage.timestamp
|
// sender: newMessagesRendered[findOriginalMessageIndex].sender, editedTimestamp: newMessage.timestamp
|
||||||
}
|
// }
|
||||||
this.messagesRendered = newMessagesRendered
|
// this.messagesRendered = newMessagesRendered
|
||||||
await this.getUpdateComplete()
|
// await this.getUpdateComplete()
|
||||||
|
// }
|
||||||
|
this.messagesRendered = {
|
||||||
|
messages: [newMessage],
|
||||||
|
type: 'update',
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -3141,14 +3165,22 @@ viewElement.scrollTop = originalScrollTop + heightDifference;
|
|||||||
|
|
||||||
if (newMessage.sender === this.selectedAddress.address) {
|
if (newMessage.sender === this.selectedAddress.address) {
|
||||||
|
|
||||||
this.messagesRendered = [...this.messagesRendered, newMessage]
|
|
||||||
|
this.messagesRendered = {
|
||||||
|
messages: [newMessage],
|
||||||
|
type: 'new',
|
||||||
|
}
|
||||||
await this.getUpdateComplete()
|
await this.getUpdateComplete()
|
||||||
|
|
||||||
viewElement.scrollTop = viewElement.scrollHeight
|
viewElement.scrollTop = viewElement.scrollHeight
|
||||||
} else if (this.isUserDown) {
|
} else if (this.isUserDown) {
|
||||||
|
|
||||||
|
this.messagesRendered = {
|
||||||
|
messages: [newMessage],
|
||||||
|
type: 'new',
|
||||||
|
}
|
||||||
// Append the message and scroll to the bottom if user is down the page
|
// Append the message and scroll to the bottom if user is down the page
|
||||||
this.messagesRendered = [...this.messagesRendered, newMessage]
|
// this.messagesRendered = [...this.messagesRendered, newMessage]
|
||||||
await this.getUpdateComplete()
|
await this.getUpdateComplete()
|
||||||
|
|
||||||
viewElement.scrollTop = viewElement.scrollHeight
|
viewElement.scrollTop = viewElement.scrollHeight
|
||||||
|
@ -253,6 +253,7 @@ class ChatScroller extends LitElement {
|
|||||||
}
|
}
|
||||||
this.oldMessages = []
|
this.oldMessages = []
|
||||||
this._upObserverhandler = this._upObserverhandler.bind(this)
|
this._upObserverhandler = this._upObserverhandler.bind(this)
|
||||||
|
this.newListMessages = this.newListMessages.bind(this)
|
||||||
this._downObserverHandler = this._downObserverHandler.bind(this)
|
this._downObserverHandler = this._downObserverHandler.bind(this)
|
||||||
this.__bottomObserverForFetchingMessagesHandler = this.__bottomObserverForFetchingMessagesHandler.bind(this)
|
this.__bottomObserverForFetchingMessagesHandler = this.__bottomObserverForFetchingMessagesHandler.bind(this)
|
||||||
this.myAddress = window.parent.reduxStore.getState().app.selectedAddress.address
|
this.myAddress = window.parent.reduxStore.getState().app.selectedAddress.address
|
||||||
@ -290,6 +291,30 @@ class ChatScroller extends LitElement {
|
|||||||
this.requestUpdate();
|
this.requestUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async newListMessages(newMessages, signature) {
|
||||||
|
console.log('sup')
|
||||||
|
let data = []
|
||||||
|
newMessages.forEach(newMessage => {
|
||||||
|
const lastGroupedMessage = data[data.length - 1];
|
||||||
|
|
||||||
|
if (this.shouldGroupWithLastMessage(newMessage, lastGroupedMessage)) {
|
||||||
|
lastGroupedMessage.messages.push(newMessage);
|
||||||
|
} else {
|
||||||
|
data.push({
|
||||||
|
messages: [newMessage],
|
||||||
|
...newMessage
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
this.messagesToRender = data
|
||||||
|
this.requestUpdate()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
async addNewMessages(newMessages, type) {
|
async addNewMessages(newMessages, type) {
|
||||||
console.log('sup')
|
console.log('sup')
|
||||||
newMessages.forEach(newMessage => {
|
newMessages.forEach(newMessage => {
|
||||||
@ -351,14 +376,6 @@ class ChatScroller extends LitElement {
|
|||||||
|
|
||||||
this.requestUpdate();
|
this.requestUpdate();
|
||||||
this.setIsLoadingMessages(false)
|
this.setIsLoadingMessages(false)
|
||||||
// await this.getUpdateComplete();
|
|
||||||
// setTimeout(()=> {
|
|
||||||
// this.viewElement.scrollTop = this.viewElement.scrollHeight + 50;
|
|
||||||
// this.setIsLoadingMessages(false)
|
|
||||||
// },50)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async replaceMessagesWithUpdate(updatedMessages) {
|
async replaceMessagesWithUpdate(updatedMessages) {
|
||||||
@ -372,11 +389,25 @@ class ChatScroller extends LitElement {
|
|||||||
this.requestUpdate();
|
this.requestUpdate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async replaceMessagesWithUpdateByArray(updatedMessagesArray) {
|
||||||
|
console.log({updatedMessagesArray}, this.messagesToRender)
|
||||||
|
for (let group of this.messagesToRender) {
|
||||||
|
for (let i = 0; i < group.messages.length; i++) {
|
||||||
|
const update = updatedMessagesArray.find(updatedMessage => ((updatedMessage.chatReference === group.messages[i].signature) || (updatedMessage.chatReference === group.messages[i].originalSignature)));
|
||||||
|
if (update) {
|
||||||
|
Object.assign(group.messages[i], update);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.requestUpdate();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async updated(changedProperties) {
|
async updated(changedProperties) {
|
||||||
if (changedProperties && changedProperties.has('messages')) {
|
if (changedProperties && changedProperties.has('messages')) {
|
||||||
console.log('this.messages', this.messages)
|
|
||||||
if (this.messages.type === 'initial') {
|
if (this.messages.type === 'initial') {
|
||||||
this.addNewMessages(this.messages.messages, 'initial')
|
this.addNewMessages(this.messages.messages, 'initial')
|
||||||
|
|
||||||
@ -384,6 +415,8 @@ class ChatScroller extends LitElement {
|
|||||||
|
|
||||||
} else if (this.messages.type === 'new') this.addNewMessages(this.messages.messages)
|
} else if (this.messages.type === 'new') this.addNewMessages(this.messages.messages)
|
||||||
else if (this.messages.type === 'old') this.prependOldMessages(this.messages.messages)
|
else if (this.messages.type === 'old') this.prependOldMessages(this.messages.messages)
|
||||||
|
else if (this.messages.type === 'inBetween') this.newListMessages(this.messages.messages, this.messages.signature)
|
||||||
|
else if (this.messages.type === 'update') this.replaceMessagesWithUpdateByArray(this.messages.messages)
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -430,7 +463,6 @@ class ChatScroller extends LitElement {
|
|||||||
|
|
||||||
let formattedMessages = this.messagesToRender
|
let formattedMessages = this.messagesToRender
|
||||||
|
|
||||||
console.log('this.messagesToRender', this.messagesToRender)
|
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
${this.isLoadingMessages ? html`
|
${this.isLoadingMessages ? html`
|
||||||
|
Loading…
x
Reference in New Issue
Block a user