From 921c7c2617d9fead5c34e32bd725442eea286cce Mon Sep 17 00:00:00 2001 From: Eduard Kuzmenko Date: Thu, 12 Jan 2023 02:21:56 +0400 Subject: [PATCH] Fix detaching chatlist placeholder Fix wrong sending status on login --- src/helpers/dialogsPlaceholder.ts | 8 +++----- src/lib/appManagers/appDialogsManager.ts | 15 +++++++++++--- src/lib/appManagers/appMessagesManager.ts | 25 +++++++++++++++-------- 3 files changed, 32 insertions(+), 16 deletions(-) diff --git a/src/helpers/dialogsPlaceholder.ts b/src/helpers/dialogsPlaceholder.ts index 0e50525d8..0463932b3 100644 --- a/src/helpers/dialogsPlaceholder.ts +++ b/src/helpers/dialogsPlaceholder.ts @@ -102,16 +102,14 @@ export default class DialogsPlaceholder { if(this.canvas.parentElement) { this.canvas.remove(); - if(this.onRemove) { - this.onRemove(); - this.onRemove = undefined; - } - if(this.blockScrollable) { this.blockScrollable.container.style.overflowY = ''; this.blockScrollable = undefined; } } + + this.onRemove?.(); + this.onRemove = undefined; } private updateCanvasSize(rect = this.getRectFrom()) { diff --git a/src/lib/appManagers/appDialogsManager.ts b/src/lib/appManagers/appDialogsManager.ts index 705622e28..a86902899 100644 --- a/src/lib/appManagers/appDialogsManager.ts +++ b/src/lib/appManagers/appDialogsManager.ts @@ -819,7 +819,9 @@ class Some { container: this.sortedList.list.parentElement, getRectFrom, onRemove: () => { - this.placeholder = undefined; + if(this.placeholder === placeholder) { + this.placeholder = undefined; + } }, blockScrollable: this.scrollable }); @@ -853,20 +855,25 @@ class Some { let placeholder = this.placeholder; try { const getConversationsResult = this.loadDialogsInner(side); + const a = await getConversationsResult; + if( !chatList.childElementCount && !placeholder && ( (!this.loadedDialogsAtLeastOnce && this.needPlaceholderAtFirstTime) || - !(await getConversationsResult).cached + !a.cached ) ) { + if(this.loadDialogsRenderPromise !== renderPromise) { + throw middlewareError; + } + placeholder = this.createPlaceholder(); cachedInfoPromise.resolve(false); } - const a = await getConversationsResult; const result = await a.result; // await pause(5000); if(this.loadDialogsRenderPromise !== renderPromise) { @@ -1063,6 +1070,7 @@ class Some { } public destroy() { + this.clear(); this.scrollable.destroy(); this.listenerSetter.removeAll(); } @@ -1908,6 +1916,7 @@ export class AppDialogsManager { elements.menu.remove(); this.xds[filter.id].destroy(); + delete this.xds[filter.id]; delete this.filtersRendered[filter.id]; this.onFiltersLengthChange(); diff --git a/src/lib/appManagers/appMessagesManager.ts b/src/lib/appManagers/appMessagesManager.ts index d9cf1caef..f692289f4 100644 --- a/src/lib/appManagers/appMessagesManager.ts +++ b/src/lib/appManagers/appMessagesManager.ts @@ -2012,6 +2012,12 @@ export class AppMessagesManager extends AppManager { noIdsDialogs.set(dialog.peerId, {dialog: dialog as Dialog}); this.log.error('noIdsDialogs', dialog, params); + } else if(dialog.top_message) { // * fix sending status + const topMessage = this.getMessageByPeer(dialog.peerId, dialog.top_message); + if(topMessage) { + this.setMessageUnreadByDialog(topMessage, dialog); + this.dialogsStorage.setDialogToState(dialog); + } } }); @@ -2736,6 +2742,16 @@ export class AppMessagesManager extends AppManager { return this.appMessagesIdsManager.generateTempMessageId(dialog?.top_message || 0); } + public setMessageUnreadByDialog(message: MyMessage, dialog: Dialog | ForumTopic = this.getDialogOnly(message.peerId)) { + if(dialog && message.mid) { + if(message.mid > dialog[message.pFlags.out ? + 'read_outbox_max_id' : + 'read_inbox_max_id']) { + message.pFlags.unread = true; + } + } + } + public saveMessage(message: Message, options: Partial<{ storage: MessagesStorage, isScheduled: true, @@ -2780,14 +2796,7 @@ export class AppMessagesManager extends AppManager { } } - const dialog = this.getDialogOnly(peerId); - if(dialog && mid) { - if(mid > dialog[message.pFlags.out ? - 'read_outbox_max_id' : - 'read_inbox_max_id']) { - message.pFlags.unread = true; - } - } + this.setMessageUnreadByDialog(message); // this.log(dT(), 'msg unread', mid, apiMessage.pFlags.out, dialog && dialog[apiMessage.pFlags.out ? 'read_outbox_max_id' : 'read_inbox_max_id']) const replyTo = message.reply_to;