Fix chat infinity loading down side
This commit is contained in:
parent
7990424dc0
commit
b9d6f916a4
@ -37,7 +37,7 @@ import Chat from "./chat";
|
|||||||
import ListenerSetter from "../../helpers/listenerSetter";
|
import ListenerSetter from "../../helpers/listenerSetter";
|
||||||
import PollElement from "../poll";
|
import PollElement from "../poll";
|
||||||
import AudioElement from "../audio";
|
import AudioElement from "../audio";
|
||||||
import { MessageReplies, MessageReplyHeader } from "../../layer";
|
import { MessageEntity, MessageReplies, MessageReplyHeader } from "../../layer";
|
||||||
|
|
||||||
const IGNORE_ACTIONS = ['messageActionHistoryClear'];
|
const IGNORE_ACTIONS = ['messageActionHistoryClear'];
|
||||||
|
|
||||||
@ -752,7 +752,7 @@ export default class ChatBubbles {
|
|||||||
if(!this.peerId || /* TEST_SCROLL || */ this.chat.setPeerPromise || (top && this.getHistoryTopPromise) || (!top && this.getHistoryBottomPromise)) return;
|
if(!this.peerId || /* TEST_SCROLL || */ this.chat.setPeerPromise || (top && this.getHistoryTopPromise) || (!top && this.getHistoryBottomPromise)) return;
|
||||||
|
|
||||||
// warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)
|
// warning, если иды только отрицательные то вниз не попадёт (хотя мб и так не попадёт)
|
||||||
let history = Object.keys(this.bubbles).map(id => +id).filter(id => id > 0).sort((a, b) => a - b);
|
const history = Object.keys(this.bubbles).map(id => +id).sort((a, b) => a - b);
|
||||||
if(!history.length) return;
|
if(!history.length) return;
|
||||||
|
|
||||||
if(top && !this.scrolledAll) {
|
if(top && !this.scrolledAll) {
|
||||||
@ -1100,15 +1100,15 @@ export default class ChatBubbles {
|
|||||||
const samePeer = this.peerId == peerId;
|
const samePeer = this.peerId == peerId;
|
||||||
|
|
||||||
const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);
|
const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);
|
||||||
let topMessage = lastMsgId <= 0 ? lastMsgId : historyStorage.maxId ?? 0;
|
let topMessage = this.chat.type === 'pinned' ? this.appMessagesManager.pinnedMessages[peerId].maxId : historyStorage.maxId ?? 0;
|
||||||
const isTarget = lastMsgId !== undefined;
|
const isTarget = lastMsgId !== undefined;
|
||||||
|
|
||||||
if(!isTarget && historyStorage.maxId) {
|
if(!isTarget && topMessage) {
|
||||||
const isUnread = this.appMessagesManager.isHistoryUnread(peerId, this.chat.threadId);
|
const isUnread = this.appMessagesManager.isHistoryUnread(peerId, this.chat.threadId);
|
||||||
if(/* dialog.unread_count */isUnread && !samePeer) {
|
if(/* dialog.unread_count */isUnread && !samePeer) {
|
||||||
lastMsgId = historyStorage.readMaxId;
|
lastMsgId = historyStorage.readMaxId;
|
||||||
} else {
|
} else {
|
||||||
lastMsgId = historyStorage.maxId;
|
lastMsgId = topMessage;
|
||||||
//lastMsgID = topMessage;
|
//lastMsgID = topMessage;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1122,7 +1122,7 @@ export default class ChatBubbles {
|
|||||||
this.scrollable.scrollIntoView(mounted.bubble);
|
this.scrollable.scrollIntoView(mounted.bubble);
|
||||||
this.highlightBubble(mounted.bubble);
|
this.highlightBubble(mounted.bubble);
|
||||||
this.chat.setListenerResult('setPeer', lastMsgId, false);
|
this.chat.setListenerResult('setPeer', lastMsgId, false);
|
||||||
} else if(historyStorage.maxId && !isJump) {
|
} else if(topMessage && !isJump) {
|
||||||
//this.log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);
|
//this.log('will scroll down', this.scroll.scrollTop, this.scroll.scrollHeight);
|
||||||
this.scroll.scrollTop = this.scroll.scrollHeight;
|
this.scroll.scrollTop = this.scroll.scrollHeight;
|
||||||
this.chat.setListenerResult('setPeer', lastMsgId, true);
|
this.chat.setListenerResult('setPeer', lastMsgId, true);
|
||||||
@ -1143,7 +1143,7 @@ export default class ChatBubbles {
|
|||||||
this.log('setPeer peerId:', this.peerId, historyStorage, lastMsgId, topMessage);
|
this.log('setPeer peerId:', this.peerId, historyStorage, lastMsgId, topMessage);
|
||||||
|
|
||||||
// add last message, bc in getHistory will load < max_id
|
// add last message, bc in getHistory will load < max_id
|
||||||
const additionMsgId = isJump || (this.chat.type !== 'chat' && this.chat.type !== 'discussion') ? 0 : topMessage;
|
const additionMsgId = isJump || this.chat.type === 'scheduled' ? 0 : topMessage;
|
||||||
|
|
||||||
/* this.setPeerPromise = null;
|
/* this.setPeerPromise = null;
|
||||||
this.preloader.detach();
|
this.preloader.detach();
|
||||||
@ -1219,7 +1219,7 @@ export default class ChatBubbles {
|
|||||||
this.lazyLoadQueue.unlock();
|
this.lazyLoadQueue.unlock();
|
||||||
|
|
||||||
//if(dialog && lastMsgID && lastMsgID != topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {
|
//if(dialog && lastMsgID && lastMsgID != topMessage && (this.bubbles[lastMsgID] || this.firstUnreadBubble)) {
|
||||||
if(historyStorage.maxId && (isTarget || isJump)) {
|
if(topMessage && (isTarget || isJump)) {
|
||||||
if(this.scrollable.scrollLocked) {
|
if(this.scrollable.scrollLocked) {
|
||||||
clearTimeout(this.scrollable.scrollLocked);
|
clearTimeout(this.scrollable.scrollLocked);
|
||||||
this.scrollable.scrollLocked = 0;
|
this.scrollable.scrollLocked = 0;
|
||||||
@ -1260,8 +1260,8 @@ export default class ChatBubbles {
|
|||||||
this.log('scrolledAllDown:', this.scrolledAllDown);
|
this.log('scrolledAllDown:', this.scrolledAllDown);
|
||||||
|
|
||||||
//if(!this.unreaded.length && dialog) { // lol
|
//if(!this.unreaded.length && dialog) { // lol
|
||||||
if(this.scrolledAllDown && historyStorage.maxId) { // lol
|
if(this.scrolledAllDown && topMessage) { // lol
|
||||||
this.appMessagesManager.readHistory(peerId, historyStorage.maxId);
|
this.appMessagesManager.readHistory(peerId, topMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(this.chat.type === 'chat') {
|
if(this.chat.type === 'chat') {
|
||||||
@ -1545,7 +1545,7 @@ export default class ChatBubbles {
|
|||||||
|
|
||||||
let messageMedia = message.media;
|
let messageMedia = message.media;
|
||||||
|
|
||||||
let messageMessage: string, totalEntities: any[];
|
let messageMessage: string, totalEntities: MessageEntity[];
|
||||||
if(messageMedia?.document && !['video', 'gif'].includes(messageMedia.document.type)) {
|
if(messageMedia?.document && !['video', 'gif'].includes(messageMedia.document.type)) {
|
||||||
// * just filter these cases for documents caption
|
// * just filter these cases for documents caption
|
||||||
} else if(message.grouped_id && albumMustBeRenderedFull) {
|
} else if(message.grouped_id && albumMustBeRenderedFull) {
|
||||||
@ -1567,7 +1567,7 @@ export default class ChatBubbles {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if(totalEntities && !messageMedia) {
|
if(totalEntities && !messageMedia) {
|
||||||
let emojiEntities = totalEntities.filter((e: any) => e._ == 'messageEntityEmoji');
|
let emojiEntities = totalEntities.filter((e) => e._ == 'messageEntityEmoji');
|
||||||
let strLength = messageMessage.length;
|
let strLength = messageMessage.length;
|
||||||
let emojiStrLength = emojiEntities.reduce((acc: number, curr: any) => acc + curr.length, 0);
|
let emojiStrLength = emojiEntities.reduce((acc: number, curr: any) => acc + curr.length, 0);
|
||||||
|
|
||||||
@ -2436,24 +2436,28 @@ export default class ChatBubbles {
|
|||||||
|
|
||||||
if(!reverse) { // if not jump
|
if(!reverse) { // if not jump
|
||||||
loadCount = 0;
|
loadCount = 0;
|
||||||
maxId += 1;
|
maxId = this.appMessagesManager.incrementMessageId(maxId, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let additionMsgIds: number[];
|
let additionMsgIds: number[];
|
||||||
if(additionMsgId && !isBackLimit) {
|
if(additionMsgId && !isBackLimit) {
|
||||||
const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);
|
if(this.chat.type === 'pinned') {
|
||||||
if(historyStorage.history.length < loadCount) {
|
additionMsgIds = [additionMsgId];
|
||||||
additionMsgIds = historyStorage.history.slice();
|
} else {
|
||||||
|
const historyStorage = this.appMessagesManager.getHistoryStorage(peerId, this.chat.threadId);
|
||||||
|
if(historyStorage.history.length < loadCount) {
|
||||||
|
additionMsgIds = historyStorage.history.slice();
|
||||||
|
|
||||||
// * filter last album, because we don't know is this the last item
|
// * filter last album, because we don't know is this the last item
|
||||||
for(let i = additionMsgIds.length - 1; i >= 0; --i) {
|
for(let i = additionMsgIds.length - 1; i >= 0; --i) {
|
||||||
const message = this.chat.getMessage(additionMsgIds[i]);
|
const message = this.chat.getMessage(additionMsgIds[i]);
|
||||||
if(message.grouped_id) additionMsgIds.splice(i, 1);
|
if(message.grouped_id) additionMsgIds.splice(i, 1);
|
||||||
else break;
|
else break;
|
||||||
|
}
|
||||||
|
|
||||||
|
maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;
|
||||||
}
|
}
|
||||||
|
|
||||||
maxId = additionMsgIds[additionMsgIds.length - 1] || maxId;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -904,13 +904,7 @@ export default class AppSharedMediaTab implements SliderTab {
|
|||||||
setText(appPeersManager.getPeerUsername(peerId), this.profileElements.username);
|
setText(appPeersManager.getPeerUsername(peerId), this.profileElements.username);
|
||||||
}
|
}
|
||||||
|
|
||||||
let dialog = appMessagesManager.getDialogByPeerId(peerId)[0];
|
this.profileElements.notificationsCheckbox.checked = !appMessagesManager.isPeerMuted(peerId);
|
||||||
if(dialog) {
|
|
||||||
let muted = false;
|
|
||||||
if(dialog.notify_settings && dialog.notify_settings.mute_until) {
|
|
||||||
muted = new Date(dialog.notify_settings.mute_until * 1000) > new Date();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
window.requestAnimationFrame(() => {
|
window.requestAnimationFrame(() => {
|
||||||
this.profileElements.notificationsRow.style.display = 'none';
|
this.profileElements.notificationsRow.style.display = 'none';
|
||||||
|
@ -385,10 +385,20 @@ export class AppChatsManager {
|
|||||||
|
|
||||||
public getChatMembersString(id: number) {
|
public getChatMembersString(id: number) {
|
||||||
const chat = this.getChat(id);
|
const chat = this.getChat(id);
|
||||||
|
const chatFull = appProfileManager.chatsFull[id];
|
||||||
|
let count: number;
|
||||||
|
if(chatFull) {
|
||||||
|
if(chatFull._ === 'channelFull') {
|
||||||
|
count = chatFull.participants_count;
|
||||||
|
} else {
|
||||||
|
count = (chatFull.participants as ChatParticipants.chatParticipants).participants?.length;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
count = chat.participants_count || chat.participants?.participants.length;
|
||||||
|
}
|
||||||
|
|
||||||
const isChannel = this.isBroadcast(id);
|
const isChannel = this.isBroadcast(id);
|
||||||
const participants_count = chat.participants_count || chat.participants?.participants.length || 1;
|
return numberWithCommas(count || 1) + ' ' + (isChannel ? 'followers' : 'members');
|
||||||
return numberWithCommas(participants_count) + ' ' + (isChannel ? 'followers' : 'members');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public wrapForFull(id: number, fullChat: any) {
|
public wrapForFull(id: number, fullChat: any) {
|
||||||
|
@ -86,6 +86,9 @@ export type MessagesStorage = {
|
|||||||
[mid: string]: any
|
[mid: string]: any
|
||||||
};
|
};
|
||||||
export class AppMessagesManager {
|
export class AppMessagesManager {
|
||||||
|
public static MESSAGE_ID_INCREMENT = 0x10000;
|
||||||
|
public static MESSAGE_ID_OFFSET = 0xFFFFFFFF;
|
||||||
|
|
||||||
public messagesStorageByPeerId: {[peerId: string]: MessagesStorage} = {};
|
public messagesStorageByPeerId: {[peerId: string]: MessagesStorage} = {};
|
||||||
public groupedMessagesStorage: {[groupId: string]: MessagesStorage} = {}; // will be used for albums
|
public groupedMessagesStorage: {[groupId: string]: MessagesStorage} = {}; // will be used for albums
|
||||||
public scheduledMessagesStorage: {[peerId: string]: MessagesStorage} = {};
|
public scheduledMessagesStorage: {[peerId: string]: MessagesStorage} = {};
|
||||||
@ -1905,35 +1908,39 @@ export class AppMessagesManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public generateMessageId(messageId: number, temp = false) {
|
public generateMessageId(messageId: number, temp = false) {
|
||||||
const q = 0xFFFFFFFF;
|
const q = AppMessagesManager.MESSAGE_ID_OFFSET;
|
||||||
const num = temp ? ++this.tempNum : 0;
|
const num = temp ? ++this.tempNum : 0;
|
||||||
if(messageId >= q) {
|
if(messageId >= q) {
|
||||||
if(temp) {
|
if(temp) {
|
||||||
return messageId + (num & 0xFFFF);
|
return messageId + (num & (AppMessagesManager.MESSAGE_ID_INCREMENT - 1));
|
||||||
}
|
}
|
||||||
|
|
||||||
return messageId;
|
return messageId;
|
||||||
}
|
}
|
||||||
|
|
||||||
return q + (messageId * 0x10000 + (num & 0xFFFF));
|
return q + (messageId * AppMessagesManager.MESSAGE_ID_INCREMENT + (num & (AppMessagesManager.MESSAGE_ID_INCREMENT - 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* * will ignore outgoing offset
|
* * will ignore outgoing offset
|
||||||
*/
|
*/
|
||||||
public getLocalMessageId(messageId: number) {
|
public getLocalMessageId(messageId: number) {
|
||||||
const q = 0xFFFFFFFF;
|
const q = AppMessagesManager.MESSAGE_ID_OFFSET;
|
||||||
if(messageId <= q) {
|
if(messageId <= q) {
|
||||||
return messageId;
|
return messageId;
|
||||||
}
|
}
|
||||||
|
|
||||||
const l = 0xFFFF;
|
const l = AppMessagesManager.MESSAGE_ID_INCREMENT - 1;
|
||||||
const used = messageId & l;
|
const used = messageId & l;
|
||||||
if(used !== l) {
|
if(used !== l) {
|
||||||
messageId -= used + 1;
|
messageId -= used + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return (messageId - q) / 0x10000;
|
return (messageId - q) / AppMessagesManager.MESSAGE_ID_INCREMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public incrementMessageId(messageId: number, increment: number) {
|
||||||
|
return this.generateMessageId(this.getLocalMessageId(messageId) + increment);
|
||||||
}
|
}
|
||||||
|
|
||||||
public saveMessages(messages: any[], options: Partial<{
|
public saveMessages(messages: any[], options: Partial<{
|
||||||
@ -3870,6 +3877,11 @@ export class AppMessagesManager {
|
|||||||
delete message.pFlags.pinned;
|
delete message.pFlags.pinned;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* const info = this.pinnedMessages[peerId];
|
||||||
|
if(info) {
|
||||||
|
info.count += messages.length * (werePinned ? 1 : -1);
|
||||||
|
} */
|
||||||
|
|
||||||
delete this.pinnedMessages[peerId];
|
delete this.pinnedMessages[peerId];
|
||||||
appStateManager.getState().then(state => {
|
appStateManager.getState().then(state => {
|
||||||
@ -4273,7 +4285,7 @@ export class AppMessagesManager {
|
|||||||
historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;
|
historyStorage.count = (historyResult as MessagesMessages.messagesMessagesSlice).count || historyResult.messages.length;
|
||||||
|
|
||||||
if(!maxId && historyResult.messages.length) {
|
if(!maxId && historyResult.messages.length) {
|
||||||
maxId = (historyResult.messages[0] as MyMessage).mid + 1;
|
maxId = this.incrementMessageId((historyResult.messages[0] as MyMessage).mid, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
let offset = 0;
|
let offset = 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user