Browse Source

Fix reordering chat list

Fix dialogFolder on messages.getPinnedDialogs
master
Eduard Kuzmenko 4 years ago
parent
commit
717710c5de
  1. 40
      src/lib/appManagers/appDialogsManager.ts
  2. 94
      src/lib/appManagers/appMessagesManager.ts

40
src/lib/appManagers/appDialogsManager.ts

@ -511,7 +511,7 @@ export class AppDialogsManager {
if(this.getDialogDom(dialog.peerID)) { if(this.getDialogDom(dialog.peerID)) {
this.setLastMessage(dialog); this.setLastMessage(dialog);
this.setDialogPosition(dialog); this.reorderDialogs();
} }
} }
@ -763,8 +763,8 @@ export class AppDialogsManager {
const rect = this.scroll.container.getBoundingClientRect(); const rect = this.scroll.container.getBoundingClientRect();
const children = Array.from(this.scroll.splitUp.children) as HTMLElement[]; const children = Array.from(this.scroll.splitUp.children) as HTMLElement[];
const firstElement = findUpTag(document.elementFromPoint(rect.x, rect.y + 1), 'LI') as HTMLElement; const firstElement = findUpTag(document.elementFromPoint(Math.ceil(rect.x), Math.ceil(rect.y + 1)), 'LI') as HTMLElement;
const lastElement = findUpTag(document.elementFromPoint(rect.x, rect.y + rect.height - 1), 'LI') as HTMLElement; const lastElement = findUpTag(document.elementFromPoint(Math.ceil(rect.x), Math.floor(rect.y + rect.height - 1)), 'LI') as HTMLElement;
//alert('got element:' + rect.y); //alert('got element:' + rect.y);
@ -889,25 +889,39 @@ export class AppDialogsManager {
} }
} }
private setDialogPosition(dialog: Dialog) { private reorderDialogs() {
const dom = this.getDialogDom(dialog.peerID); //const perf = performance.now();
if(!dom) {
return;
}
let pos = appMessagesManager.dialogsStorage.getDialog(dialog.peerID, this.filterID)[1]; let offset = 0;
if(this.topOffsetIndex) { if(this.topOffsetIndex) {
const element = this.chatList.firstElementChild; const element = this.chatList.firstElementChild;
if(element) { if(element) {
const peerID = +element.getAttribute('data-peerID'); const peerID = +element.getAttribute('data-peerID');
const firstDialog = appMessagesManager.getDialogByPeerID(peerID); const firstDialog = appMessagesManager.getDialogByPeerID(peerID);
pos -= firstDialog[1]; offset = firstDialog[1];
} }
} }
if(positionElementByIndex(dom.listEl, this.chatList, pos)) { const dialogs = appMessagesManager.dialogsStorage.getFolder(this.filterID);
this.log.debug('setDialogPosition:', dialog, dom, pos); const currentOrder = (Array.from(this.chatList.children) as HTMLElement[]).map(el => +el.getAttribute('data-peerID'));
}
dialogs.forEach((dialog, index) => {
const dom = this.getDialogDom(dialog.peerID);
if(!dom) {
return;
}
const currentIndex = currentOrder[dialog.peerID];
const needIndex = index - offset;
if(currentIndex != needIndex) {
if(positionElementByIndex(dom.listEl, this.chatList, needIndex)) {
this.log.debug('setDialogPosition:', dialog, dom, needIndex);
}
}
});
//this.log('Reorder time:', performance.now() - perf);
} }
public setLastMessage(dialog: any, lastMessage?: any, dom?: DialogDom, highlightWord?: string) { public setLastMessage(dialog: any, lastMessage?: any, dom?: DialogDom, highlightWord?: string) {

94
src/lib/appManagers/appMessagesManager.ts

@ -2405,6 +2405,13 @@ export class AppMessagesManager {
public applyConversations(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) { public applyConversations(dialogsResult: MessagesPeerDialogs.messagesPeerDialogs) {
// * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages // * В эту функцию попадут только те диалоги, в которых есть read_inbox_max_id и read_outbox_max_id, в отличие от тех, что будут в getTopMessages
// ! fix 'dialogFolder', maybe there is better way to do it, this only can happen by 'messages.getPinnedDialogs' by folder_id: 0
dialogsResult.dialogs.forEachReverse((dialog, idx) => {
if(dialog._ == 'dialogFolder') {
dialogsResult.dialogs.splice(idx, 1);
}
});
appUsersManager.saveApiUsers(dialogsResult.users); appUsersManager.saveApiUsers(dialogsResult.users);
appChatsManager.saveApiChats(dialogsResult.chats); appChatsManager.saveApiChats(dialogsResult.chats);
this.saveMessages(dialogsResult.messages); this.saveMessages(dialogsResult.messages);
@ -2412,7 +2419,6 @@ export class AppMessagesManager {
//this.log('applyConversation', dialogsResult); //this.log('applyConversation', dialogsResult);
const updatedDialogs: {[peerID: number]: Dialog} = {}; const updatedDialogs: {[peerID: number]: Dialog} = {};
let hasUpdated = false;
(dialogsResult.dialogs as Dialog[]).forEach((dialog) => { (dialogsResult.dialogs as Dialog[]).forEach((dialog) => {
const peerID = appPeersManager.getPeerID(dialog.peer); const peerID = appPeersManager.getPeerID(dialog.peer);
let topMessage = dialog.top_message; let topMessage = dialog.top_message;
@ -2444,8 +2450,9 @@ export class AppMessagesManager {
/* if(wasDialogBefore) { /* if(wasDialogBefore) {
rootScope.$broadcast('dialog_top', dialog); rootScope.$broadcast('dialog_top', dialog);
} else { */ } else { */
updatedDialogs[peerID] = dialog; //if(wasDialogBefore?.top_message != topMessage) {
hasUpdated = true; updatedDialogs[peerID] = dialog;
//}
//} //}
} else { } else {
const dropped = this.dialogsStorage.dropDialog(peerID); const dropped = this.dialogsStorage.dropDialog(peerID);
@ -2464,7 +2471,7 @@ export class AppMessagesManager {
} }
}); });
if(hasUpdated) { if(Object.keys(updatedDialogs).length) {
rootScope.broadcast('dialogs_multiupdate', updatedDialogs); rootScope.broadcast('dialogs_multiupdate', updatedDialogs);
} }
} }
@ -3328,16 +3335,55 @@ export class AppMessagesManager {
case 'updatePinnedDialogs': { case 'updatePinnedDialogs': {
const folderID = update.folder_id ?? 0; const folderID = update.folder_id ?? 0;
const handleOrder = (order: number[]) => {
this.dialogsStorage.pinnedOrders[folderID].length = 0;
let willHandle = false;
order.reverse(); // index must be higher
order.forEach((peerID) => {
newPinned[peerID] = true;
const foundDialog = this.getDialogByPeerID(peerID);
if(!foundDialog.length) {
this.newDialogsToHandle[peerID] = {reload: true};
willHandle = true;
return;
}
const dialog = foundDialog[0];
dialog.pFlags.pinned = true;
this.dialogsStorage.generateIndexForDialog(dialog);
this.newDialogsToHandle[peerID] = dialog;
willHandle = true;
});
this.dialogsStorage.getFolder(folderID).forEach(dialog => {
const peerID = dialog.peerID;
if(dialog.pFlags.pinned && !newPinned[peerID]) {
this.newDialogsToHandle[peerID] = {reload: true};
willHandle = true;
}
});
if(willHandle) {
this.scheduleHandleNewDialogs();
}
};
this.log('updatePinnedDialogs', update); this.log('updatePinnedDialogs', update);
const newPinned: {[peerID: number]: true} = {}; const newPinned: {[peerID: number]: true} = {};
if(!update.order) { if(!update.order) {
apiManager.invokeApi('messages.getPinnedDialogs', { apiManager.invokeApi('messages.getPinnedDialogs', {
folder_id: folderID folder_id: folderID
}).then((dialogsResult) => { }).then((dialogsResult) => {
dialogsResult.dialogs.reverse(); // * for test reordering and rendering
// dialogsResult.dialogs.reverse();
this.applyConversations(dialogsResult); this.applyConversations(dialogsResult);
dialogsResult.dialogs.forEach((dialog) => { handleOrder(dialogsResult.dialogs.map(d => d.peerID));
/* dialogsResult.dialogs.forEach((dialog) => {
newPinned[dialog.peerID] = true; newPinned[dialog.peerID] = true;
}); });
@ -3347,7 +3393,7 @@ export class AppMessagesManager {
this.newDialogsToHandle[peerID] = {reload: true}; this.newDialogsToHandle[peerID] = {reload: true};
this.scheduleHandleNewDialogs(); this.scheduleHandleNewDialogs();
} }
}); }); */
}); });
break; break;
@ -3355,39 +3401,7 @@ export class AppMessagesManager {
//this.log('before order:', this.dialogsStorage[0].map(d => d.peerID)); //this.log('before order:', this.dialogsStorage[0].map(d => d.peerID));
this.dialogsStorage.pinnedOrders[folderID].length = 0; handleOrder(update.order.map(peer => appPeersManager.getPeerID((peer as DialogPeer.dialogPeer).peer)));
let willHandle = false;
update.order.reverse(); // index must be higher
update.order.forEach((peer: any) => {
const peerID = appPeersManager.getPeerID(peer.peer);
newPinned[peerID] = true;
const foundDialog = this.getDialogByPeerID(peerID);
if(!foundDialog.length) {
this.newDialogsToHandle[peerID] = {reload: true};
willHandle = true;
return;
}
const dialog = foundDialog[0];
dialog.pFlags.pinned = true;
this.dialogsStorage.generateIndexForDialog(dialog);
this.newDialogsToHandle[peerID] = dialog;
willHandle = true;
});
this.dialogsStorage.getFolder(folderID).forEach(dialog => {
const peerID = dialog.peerID;
if(dialog.pFlags.pinned && !newPinned[peerID]) {
this.newDialogsToHandle[peerID] = {reload: true};
willHandle = true;
}
});
if(willHandle) {
this.scheduleHandleNewDialogs();
}
break; break;
} }

Loading…
Cancel
Save