From 46dc5dccbdbe6c26bf3991d65323992256e1bdfd Mon Sep 17 00:00:00 2001 From: Eduard Kuzmenko Date: Tue, 26 Jul 2022 17:24:29 +0200 Subject: [PATCH] Fix default folder bugs --- src/components/horizontalMenu.ts | 3 +- .../sidebarLeft/tabs/chatFolders.ts | 28 ++++++-- .../sidebarLeft/tabs/includedChats.ts | 3 +- src/lib/appManagers/apiUpdatesManager.ts | 9 ++- src/lib/appManagers/appChatsManager.ts | 3 +- src/lib/appManagers/appDialogsManager.ts | 67 ++++++++++++------- src/lib/appManagers/appDraftsManager.ts | 3 +- src/lib/appManagers/appGroupCallsManager.ts | 4 +- src/lib/appManagers/appMessagesManager.ts | 41 ++++++------ .../appManagers/appNotificationsManager.ts | 5 +- src/lib/appManagers/appPeersManager.ts | 7 ++ src/lib/appManagers/appProfileManager.ts | 7 +- src/lib/appManagers/appReactionsManager.ts | 3 +- src/lib/appManagers/appUsersManager.ts | 7 +- src/lib/mediaPlayer.ts | 8 +-- src/lib/storages/dialogs.ts | 13 ++-- src/lib/storages/filters.ts | 25 ++++--- 17 files changed, 140 insertions(+), 96 deletions(-) diff --git a/src/components/horizontalMenu.ts b/src/components/horizontalMenu.ts index dc2a2d0c..88c7e029 100644 --- a/src/components/horizontalMenu.ts +++ b/src/components/horizontalMenu.ts @@ -40,7 +40,8 @@ export function horizontalMenu( const tabContent = content.children[id] as HTMLDivElement; if(onClick) { - const canChange = await onClick(id, tabContent, animate); + const result1 = onClick(id, tabContent, animate); + const canChange = result1 instanceof Promise ? await result1 : result1; if(canChange !== undefined && !canChange) { return; } diff --git a/src/components/sidebarLeft/tabs/chatFolders.ts b/src/components/sidebarLeft/tabs/chatFolders.ts index b7677186..43a2f9aa 100644 --- a/src/components/sidebarLeft/tabs/chatFolders.ts +++ b/src/components/sidebarLeft/tabs/chatFolders.ts @@ -21,6 +21,7 @@ import { attachClickEvent } from "../../../helpers/dom/clickEvent"; import positionElementByIndex from "../../../helpers/dom/positionElementByIndex"; import RLottiePlayer from "../../../lib/rlottie/rlottiePlayer"; import wrapEmojiText from "../../../lib/richTextProcessor/wrapEmojiText"; +import { FOLDER_ID_ALL, FOLDER_ID_ARCHIVE, REAL_FOLDERS } from "../../../lib/mtproto/mtproto_config"; export default class AppChatFoldersTab extends SliderSuperTab { private createFolderBtn: HTMLElement; @@ -79,9 +80,9 @@ export default class AppChatFoldersTab extends SliderSuperTab { let div: HTMLElement; if(!row) { row = new Row({ - title: wrapEmojiText(filter.title), + title: filter.id === FOLDER_ID_ALL ? i18n('FilterAllChats') : wrapEmojiText(filter.title), subtitle: description, - clickable: true + clickable: filter.id !== FOLDER_ID_ALL }); if(d.length) { @@ -92,7 +93,7 @@ export default class AppChatFoldersTab extends SliderSuperTab { if(dialogFilter._ === 'dialogFilter') { const filterId = filter.id; - if(!this.filtersRendered.hasOwnProperty(filter.id)) { + if(!this.filtersRendered.hasOwnProperty(filter.id) && filter.id !== FOLDER_ID_ALL) { attachClickEvent(row.container, async() => { this.slider.createTab(AppEditFolderTab).open(await this.managers.filtersStorage.getFilter(filterId)); }, {listenerSetter: this.listenerSetter}); @@ -148,8 +149,7 @@ export default class AppChatFoldersTab extends SliderSuperTab { this.scrollable.append(this.stickerContainer, caption, this.createFolderBtn, this.foldersSection.container, this.suggestedSection.container); attachClickEvent(this.createFolderBtn, async() => { - const appConfig = await this.managers.apiManager.getAppConfig(); - if(Object.keys(this.filtersRendered).length >= (rootScope.premium ? appConfig.dialog_filters_limit_premium : appConfig.dialog_filters_limit_default)) { + if(!(await this.canCreateFolder())) { toast('Sorry, you can\'t create more folders.'); } else { this.slider.createTab(AppEditFolderTab).open(); @@ -162,6 +162,10 @@ export default class AppChatFoldersTab extends SliderSuperTab { this.managers.filtersStorage.getDialogFilters().then(async(filters) => { for(const filter of filters) { + if(filter.id === FOLDER_ID_ARCHIVE) { + continue; + } + await this.renderFolder(filter, this.foldersSection.content); } @@ -230,6 +234,16 @@ export default class AppChatFoldersTab extends SliderSuperTab { }); } + private async canCreateFolder() { + const [appConfig, filters] = await Promise.all([ + this.managers.apiManager.getAppConfig(), + this.managers.filtersStorage.getDialogFilters() + ]); + + const filtersLength = filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).length; + return filtersLength < (rootScope.premium ? appConfig.dialog_filters_limit_premium : appConfig.dialog_filters_limit_default); + } + private getSuggestedFilters() { return this.managers.filtersStorage.getSuggestedDialogsFilters().then(async(suggestedFilters) => { this.suggestedSection.container.style.display = suggestedFilters.length ? '' : 'none'; @@ -241,10 +255,10 @@ export default class AppChatFoldersTab extends SliderSuperTab { div.append(button); this.suggestedSection.content.append(div); - attachClickEvent(button, (e) => { + attachClickEvent(button, async(e) => { cancelEvent(e); - if(Object.keys(this.filtersRendered).length >= 10) { + if(!(await this.canCreateFolder())) { toast('Sorry, you can\'t create more folders.'); return; } diff --git a/src/components/sidebarLeft/tabs/includedChats.ts b/src/components/sidebarLeft/tabs/includedChats.ts index 0cb1309c..2e05dbbf 100644 --- a/src/components/sidebarLeft/tabs/includedChats.ts +++ b/src/components/sidebarLeft/tabs/includedChats.ts @@ -19,6 +19,7 @@ import copy from "../../../helpers/object/copy"; import forEachReverse from "../../../helpers/array/forEachReverse"; import setInnerHTML from "../../../helpers/dom/setInnerHTML"; import wrapEmojiText from "../../../lib/richTextProcessor/wrapEmojiText"; +import { REAL_FOLDERS } from "../../../lib/mtproto/mtproto_config"; export default class AppIncludedChatsTab extends SliderSuperTab { private editFolderTab: AppEditFolderTab; @@ -107,7 +108,7 @@ export default class AppIncludedChatsTab extends SliderSuperTab { this.dialogsByFilters = new Map(); return this.managers.filtersStorage.getDialogFilters().then(async(filters) => { - await Promise.all(filters.map(async(filter) => { + await Promise.all(filters.filter((filter) => !REAL_FOLDERS.has(filter.id)).map(async(filter) => { const dialogs = await this.managers.dialogsStorage.getFolderDialogs(filter.id); const peerIds = dialogs.map((d) => d.peerId); this.dialogsByFilters.set(filter, new Set(peerIds)); diff --git a/src/lib/appManagers/apiUpdatesManager.ts b/src/lib/appManagers/apiUpdatesManager.ts index 2f0f93fe..626efdc7 100644 --- a/src/lib/appManagers/apiUpdatesManager.ts +++ b/src/lib/appManagers/apiUpdatesManager.ts @@ -17,7 +17,6 @@ import App from '../../config/app'; import filterUnique from '../../helpers/array/filterUnique'; import { AppManager } from './manager'; import parseMarkdown from '../richTextProcessor/parseMarkdown'; -import getPeerId from './utils/peers/getPeerId'; import ctx from '../../environment/ctx'; import EventListenerBase from '../../helpers/eventListenerBase'; import applyMixins from '../../helpers/applyMixins'; @@ -468,7 +467,7 @@ class ApiUpdatesManager { switch(update._) { case 'updateNewChannelMessage': case 'updateEditChannelMessage': - channelId = getPeerId(update.message.peer_id).toChatId(); + channelId = this.appPeersManager.getPeerId(update.message.peer_id).toChatId(); break; /* case 'updateDeleteChannelMessages': channelId = update.channel_id; @@ -509,11 +508,11 @@ class ApiUpdatesManager { update._ === 'updateNewChannelMessage' || update._ === 'updateEditChannelMessage') { const message = update.message as Message.message; - const toPeerId = getPeerId(message.peer_id); + const toPeerId = this.appPeersManager.getPeerId(message.peer_id); const fwdHeader: MessageFwdHeader.messageFwdHeader = message.fwd_from || {} as any; let reason: string; - if(message.from_id && !this.appUsersManager.hasUser(getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') || - fwdHeader.from_id && !this.appUsersManager.hasUser(getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') || + if(message.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(message.from_id), message.pFlags.post/* || channelId*/) && (reason = 'author') || + fwdHeader.from_id && !this.appUsersManager.hasUser(this.appPeersManager.getPeerId(fwdHeader.from_id), !!(fwdHeader.from_id as Peer.peerChannel).channel_id) && (reason = 'fwdAuthor') || (fwdHeader.from_id as Peer.peerChannel)?.channel_id && !this.appChatsManager.hasChat((fwdHeader.from_id as Peer.peerChannel).channel_id, true) && (reason = 'fwdChannel') || toPeerId.isUser() && !this.appUsersManager.hasUser(toPeerId) && (reason = 'toPeer User') || toPeerId.isAnyChat() && !this.appChatsManager.hasChat(toPeerId.toChatId()) && (reason = 'toPeer Chat')) { diff --git a/src/lib/appManagers/appChatsManager.ts b/src/lib/appManagers/appChatsManager.ts index 9de98768..e9e0156f 100644 --- a/src/lib/appManagers/appChatsManager.ts +++ b/src/lib/appManagers/appChatsManager.ts @@ -15,7 +15,6 @@ import safeReplaceObject from "../../helpers/object/safeReplaceObject"; import { ChannelParticipant, ChannelsCreateChannel, Chat, ChatAdminRights, ChatBannedRights, ChatInvite, ChatPhoto, InputChannel, InputChatPhoto, InputFile, InputPeer, SponsoredMessage, Update, Updates } from "../../layer"; import { isRestricted } from "../../helpers/restrictions"; import { AppManager } from "./manager"; -import getPeerId from "./utils/peers/getPeerId"; import hasRights from "./utils/chats/hasRights"; import getParticipantPeerId from "./utils/chats/getParticipantPeerId"; import { AppStoragesManager } from "./appStoragesManager"; @@ -48,7 +47,7 @@ export class AppChatsManager extends AppManager { }, updateChatDefaultBannedRights: (update) => { - const chatId = getPeerId(update.peer).toChatId(); + const chatId = this.appPeersManager.getPeerId(update.peer).toChatId(); const chat: Chat.chat = this.chats[chatId]; if(chat) { chat.default_banned_rights = update.default_banned_rights; diff --git a/src/lib/appManagers/appDialogsManager.ts b/src/lib/appManagers/appDialogsManager.ts index 18dc87ad..4c862ebf 100644 --- a/src/lib/appManagers/appDialogsManager.ts +++ b/src/lib/appManagers/appDialogsManager.ts @@ -82,6 +82,7 @@ import pause from "../../helpers/schedulers/pause"; import apiManagerProxy from "../mtproto/mtprotoworker"; import filterAsync from "../../helpers/array/filterAsync"; import forEachReverse from "../../helpers/array/forEachReverse"; +import indexOfAndSplice from "../../helpers/array/indexOfAndSplice"; export const DIALOG_LIST_ELEMENT_TAG = 'A'; @@ -168,7 +169,7 @@ class SortedDialogList extends SortedList { } public clear() { - this.list.innerHTML = ''; + this.list.textContent = ''; super.clear(); } } @@ -231,6 +232,7 @@ export class AppDialogsManager { private filtersNavigationItem: NavigationItem; private managers: AppManagers; + private selectTab: ReturnType; constructor() { const managers = this.managers = getProxiedManagers(); @@ -298,6 +300,7 @@ export class AppDialogsManager { } */ rootScope.addEventListener('state_cleared', () => { + const clearCurrent = REAL_FOLDERS.has(this.filterId); //setTimeout(() => apiManagerProxy.getState().then(async(state) => { this.loadedDialogsAtLeastOnce = false; @@ -310,8 +313,11 @@ export class AppDialogsManager { clearPromises.push(storage.clear()); } */ - this.sortedList.clear(); - this.onTabChange(); + if(clearCurrent) { + this.sortedList.clear(); + this.onTabChange(); + } + this.onStateLoaded(state); })//, 5000); }); @@ -325,13 +331,14 @@ export class AppDialogsManager { const foldersScrollable = new ScrollableX(this.folders.menuScrollContainer); bottomPart.prepend(this.folders.menuScrollContainer); - const selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent) => { + const selectTab = this.selectTab = horizontalMenu(this.folders.menu, this.folders.container, (id, tabContent, animate) => { /* if(id !== 0) { id += 1; } */ id = +tabContent.dataset.filterId || FOLDER_ID_ALL; + const wasFilterId = this.filterId; if(!IS_MOBILE_SAFARI) { if(id) { if(!this.filtersNavigationItem) { @@ -351,14 +358,18 @@ export class AppDialogsManager { } } - if(this.filterId === id) return; + if(wasFilterId === id) return; this.sortedLists[id].clear(); - return this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => { + const promise = this.setFilterIdAndChangeTab(id).then(({cached, renderPromise}) => { if(cached) { return renderPromise; } }); + + if(wasFilterId !== -1) { + return promise; + } }, () => { for(const folderId in this.sortedLists) { if(+folderId !== this.filterId) { @@ -420,8 +431,7 @@ export class AppDialogsManager { this.sortedList = this.sortedLists[this.filterId]; this.scroll = this.scrollables[this.filterId]; - //selectTab(0); - // (this.folders.menu.firstElementChild as HTMLElement).click(); + // selectTab(0, false); } public get chatList() { @@ -429,13 +439,13 @@ export class AppDialogsManager { } public setFilterId(filterId: number, localId: MyDialogFilter['localId']) { - this.indexKey = getDialogIndexKey(localId); this.filterId = filterId; + this.indexKey = getDialogIndexKey(REAL_FOLDERS.has(filterId) ? filterId as REAL_FOLDER_ID : localId); } public async setFilterIdAndChangeTab(filterId: number) { - this.indexKey = await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId); this.filterId = filterId; + this.indexKey = await this.managers.dialogsStorage.getDialogIndexKeyByFilterId(filterId); return this.onTabChange(); } @@ -579,19 +589,24 @@ export class AppDialogsManager { // set tab //(this.folders.menu.firstElementChild.children[Math.max(0, filter.id - 2)] as HTMLElement).click(); - (this.folders.menu.firstElementChild as HTMLElement).click(); - elements.container.remove(); elements.menu.remove(); delete this.sortedLists[filter.id]; delete this.scrollables[filter.id]; delete this.filtersRendered[filter.id]; - + this.onFiltersLengthChange(); + + if(this.filterId === filter.id) { + this.selectTab(0, false); + } }); rootScope.addEventListener('filter_order', async(order) => { + order = order.slice(); + indexOfAndSplice(order, FOLDER_ID_ARCHIVE); + const containerToAppend = this.folders.menu as HTMLElement; const r = await Promise.all(order.map(async(filterId) => { return { @@ -649,39 +664,41 @@ export class AppDialogsManager { private async onStateLoaded(state: State) { const filtersArr = state.filtersArr; const haveFilters = filtersArr.length > REAL_FOLDERS.size; - const filter = filtersArr.find((filter) => filter.id !== FOLDER_ID_ARCHIVE); + // const filter = filtersArr.find((filter) => filter.id !== FOLDER_ID_ARCHIVE); const addFilters = (filters: MyDialogFilter[]) => { - // forEachReverse(filters, (filter) => { - // this.addFilter(filter); - // }); for(const filter of filters) { this.addFilter(filter); } }; + let addFiltersPromise: Promise; if(haveFilters) { addFilters(filtersArr); } else { - this.managers.filtersStorage.getDialogFilters().then(addFilters); + addFiltersPromise = this.managers.filtersStorage.getDialogFilters().then(addFilters); } - (this.folders.menu.firstElementChild as HTMLElement).click(); - const loadDialogsPromise = this.onChatsScroll(); + await loadDialogsPromise; + this.loadDialogsRenderPromise = undefined; + + addFiltersPromise && await addFiltersPromise; + // this.folders.menu.children[0].classList.add('active'); + + this.filterId = -1; + this.selectTab(0, false); if(!this.initedListeners) { this.initListeners(); this.initedListeners = true; } - if(haveFilters && this.showFiltersPromise) { - await this.showFiltersPromise; - } + haveFilters && this.showFiltersPromise && await this.showFiltersPromise; this.managers.appNotificationsManager.getNotifyPeerTypeSettings(); - await (await loadDialogsPromise).renderPromise; + await (await loadDialogsPromise).renderPromise.catch(noop); this.managers.appMessagesManager.fillConversations(); } @@ -941,6 +958,8 @@ export class AppDialogsManager { return; } */ + this.log.warn('load', side); + if(this.loadDialogsPromise || this.loadDialogsRenderPromise/* || 1 === 1 */) return this.loadDialogsPromise; else if(this.scroll.loadedAll[side]) { return Promise.resolve({ diff --git a/src/lib/appManagers/appDraftsManager.ts b/src/lib/appManagers/appDraftsManager.ts index edc66809..e72b1d7c 100644 --- a/src/lib/appManagers/appDraftsManager.ts +++ b/src/lib/appManagers/appDraftsManager.ts @@ -16,7 +16,6 @@ import assumeType from "../../helpers/assumeType"; import isObject from "../../helpers/object/isObject"; import deepEqual from "../../helpers/object/deepEqual"; import { AppManager } from "./manager"; -import getPeerId from "./utils/peers/getPeerId"; import generateMessageId from "./utils/messageId/generateMessageId"; import getServerMessageId from "./utils/messageId/getServerMessageId"; @@ -29,7 +28,7 @@ export class AppDraftsManager extends AppManager { protected after() { this.apiUpdatesManager.addMultipleEventsListeners({ updateDraftMessage: (update) => { - const peerId = getPeerId(update.peer); + const peerId = this.appPeersManager.getPeerId(update.peer); this.saveDraft(peerId, update.threadId, update.draft, {notify: true}); } }); diff --git a/src/lib/appManagers/appGroupCallsManager.ts b/src/lib/appManagers/appGroupCallsManager.ts index 58999df8..2cf9415d 100644 --- a/src/lib/appManagers/appGroupCallsManager.ts +++ b/src/lib/appManagers/appGroupCallsManager.ts @@ -328,7 +328,7 @@ export class AppGroupCallsManager extends AppManager { } else { promise = this.apiManager.invokeApi('phone.joinGroupCall', { call: groupCallInput, - join_as: {_: 'inputPeerSelf'}, + join_as: this.appPeersManager.getInputPeerSelf(), muted: true, video_stopped: true, params: { @@ -349,7 +349,7 @@ export class AppGroupCallsManager extends AppManager { if(options.type === 'main') { const request: PhoneJoinGroupCall = { call: groupCallInput, - join_as: {_: 'inputPeerSelf'}, + join_as: this.appPeersManager.getInputPeerSelf(), params, muted: options.isMuted, video_stopped: !options.joinVideo diff --git a/src/lib/appManagers/appMessagesManager.ts b/src/lib/appManagers/appMessagesManager.ts index 1636fcaf..37cf77e1 100644 --- a/src/lib/appManagers/appMessagesManager.ts +++ b/src/lib/appManagers/appMessagesManager.ts @@ -45,7 +45,6 @@ import parseEntities from "../richTextProcessor/parseEntities"; import parseMarkdown from "../richTextProcessor/parseMarkdown"; import getServerMessageId from "./utils/messageId/getServerMessageId"; import generateMessageId from "./utils/messageId/generateMessageId"; -import getPeerId from "./utils/peers/getPeerId"; import filterMessagesByInputFilter from "./utils/messages/filterMessagesByInputFilter"; import ctx from "../../environment/ctx"; import { getEnvironment } from "../../environment/utils"; @@ -1925,7 +1924,7 @@ export class AppMessagesManager extends AppManager { this.dialogsStorage.saveDialog(dialog, undefined, true, saveGlobalOffset); if(!maxSeenIdIncremented && - !this.appPeersManager.isChannel(dialog.peerId || getPeerId(dialog.peer))) { + !this.appPeersManager.isChannel(dialog.peerId || this.appPeersManager.getPeerId(dialog.peer))) { this.incrementMaxSeenId(dialog.top_message); maxSeenIdIncremented = true; } @@ -2248,7 +2247,7 @@ export class AppMessagesManager extends AppManager { } public getMessagePeer(message: any): PeerId { - const toId = message.peer_id && getPeerId(message.peer_id) || NULL_PEER_ID; + const toId = message.peer_id && this.appPeersManager.getPeerId(message.peer_id) || NULL_PEER_ID; return toId; } @@ -2284,7 +2283,7 @@ export class AppMessagesManager extends AppManager { public reloadConversation(inputPeer: PeerId | InputPeer) { let promise: CancellablePromise; if(inputPeer !== undefined) { - const peerId = getPeerId(inputPeer); + const peerId = this.appPeersManager.getPeerId(inputPeer); let obj = this.reloadConversationsPeers.get(peerId); if(obj) { promise = obj.promise; @@ -2667,10 +2666,10 @@ export class AppMessagesManager extends AppManager { message.peerId = peerId; if(peerId === myId/* && !message.from_id && !message.fwd_from */) { - message.fromId = fwdHeader ? (fwdHeader.from_id ? getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId; + message.fromId = fwdHeader ? (fwdHeader.from_id ? this.appPeersManager.getPeerId(fwdHeader.from_id) : NULL_PEER_ID) : myId; } else { //message.fromId = message.pFlags.post || (!message.pFlags.out && !message.from_id) ? peerId : appPeersManager.getPeerId(message.from_id); - message.fromId = message.pFlags.post || !message.from_id ? peerId : getPeerId(message.from_id); + message.fromId = message.pFlags.post || !message.from_id ? peerId : this.appPeersManager.getPeerId(message.from_id); } if(fwdHeader) { @@ -2681,7 +2680,7 @@ export class AppMessagesManager extends AppManager { const peer = fwdHeader.saved_from_peer || fwdHeader.from_id; const msgId = fwdHeader.saved_from_msg_id || fwdHeader.channel_post; if(peer && msgId) { - const savedFromPeerId = getPeerId(peer); + const savedFromPeerId = this.appPeersManager.getPeerId(peer); const savedFromMid = generateMessageId(msgId); message.savedFrom = savedFromPeerId + '_' + savedFromMid; } @@ -2693,7 +2692,7 @@ export class AppMessagesManager extends AppManager { apiMessage.fwdPostID = fwdHeader.channel_post; } */ - message.fwdFromId = getPeerId(fwdHeader.from_id); + message.fwdFromId = this.appPeersManager.getPeerId(fwdHeader.from_id); if(!overwriting) { fwdHeader.date -= this.timeManager.getServerTimeOffset(); @@ -3241,7 +3240,7 @@ export class AppMessagesManager extends AppManager { }, messageReplyMarkup); */ if(messageReplyMarkup._ !== 'replyKeyboardHide') { - messageReplyMarkup.fromId = getPeerId(message.from_id); + messageReplyMarkup.fromId = this.appPeersManager.getPeerId(message.from_id); } historyStorage.replyMarkup = messageReplyMarkup; @@ -4029,7 +4028,7 @@ export class AppMessagesManager extends AppManager { if(message._ === 'messageService' && message.action._ === 'messageActionPaymentSent' && message.reply_to) { this.rootScope.dispatchEvent('payment_sent', { - peerId: message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId, + peerId: message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId, mid: message.reply_to_mid }); } @@ -4201,7 +4200,7 @@ export class AppMessagesManager extends AppManager { private onUpdateMessageReactions = (update: Update.updateMessageReactions) => { const {peer, msg_id, reactions} = update; const mid = generateMessageId(msg_id); - const peerId = getPeerId(peer); + const peerId = this.appPeersManager.getPeerId(peer); const message: MyMessage = this.getMessageByPeer(peerId, mid); if(message?._ !== 'message') { @@ -4214,7 +4213,7 @@ export class AppMessagesManager extends AppManager { const previousReactions = message.reactions; const previousRecentReactions = previousReactions?.recent_reactions; if( - getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && ( + this.appPeersManager.getPeerId(recentReaction.peer_id) !== this.appPeersManager.peerId && ( !previousRecentReactions || previousRecentReactions.length <= recentReactions.length ) && ( @@ -4244,7 +4243,7 @@ export class AppMessagesManager extends AppManager { private onUpdateDialogUnreadMark = (update: Update.updateDialogUnreadMark) => { //this.log('updateDialogUnreadMark', update); - const peerId = getPeerId((update.peer as DialogPeer.dialogPeer).peer); + const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer); const dialog = this.getDialogOnly(peerId); if(!dialog) { @@ -4332,7 +4331,7 @@ export class AppMessagesManager extends AppManager { const channelId = (update as Update.updateReadChannelInbox).channel_id; const maxId = generateMessageId((update as Update.updateReadChannelInbox).max_id || (update as Update.updateReadChannelDiscussionInbox).read_max_id); const threadId = generateMessageId((update as Update.updateReadChannelDiscussionInbox).top_msg_id); - const peerId = channelId ? channelId.toPeerId(true) : getPeerId((update as Update.updateReadHistoryInbox).peer); + const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updateReadHistoryInbox).peer); const isOut = update._ === 'updateReadHistoryOutbox' || update._ === 'updateReadChannelOutbox' || update._ === 'updateReadChannelDiscussionOutbox' ? true : undefined; @@ -4503,7 +4502,7 @@ export class AppMessagesManager extends AppManager { } this.apiManager.clearCache('messages.getSearchCounters', (params) => { - return getPeerId(params.peer) === peerId; + return this.appPeersManager.getPeerId(params.peer) === peerId; }); const threadKeys: Set = new Set(); @@ -4662,7 +4661,7 @@ export class AppMessagesManager extends AppManager { private onUpdatePinnedMessages = (update: Update.updatePinnedMessages | Update.updatePinnedChannelMessages) => { const channelId = update._ === 'updatePinnedChannelMessages' ? update.channel_id : undefined; - const peerId = channelId ? channelId.toPeerId(true) : getPeerId((update as Update.updatePinnedMessages).peer); + const peerId = channelId ? channelId.toPeerId(true) : this.appPeersManager.getPeerId((update as Update.updatePinnedMessages).peer); /* const storage = this.getSearchStorage(peerId, 'inputMessagesFilterPinned'); if(storage.count !== storage.history.length) { @@ -4718,7 +4717,7 @@ export class AppMessagesManager extends AppManager { private onUpdateNotifySettings = (update: Update.updateNotifySettings) => { const {peer, notify_settings} = update; if(peer._ === 'notifyPeer') { - const peerId = getPeerId((peer as NotifyPeer.notifyPeer).peer); + const peerId = this.appPeersManager.getPeerId((peer as NotifyPeer.notifyPeer).peer); const dialog = this.getDialogOnly(peerId); if(dialog) { @@ -4756,7 +4755,7 @@ export class AppMessagesManager extends AppManager { }; private onUpdateDeleteScheduledMessages = (update: Update.updateDeleteScheduledMessages) => { - const peerId = getPeerId(update.peer); + const peerId = this.appPeersManager.getPeerId(update.peer); const storage = this.scheduledMessagesStorage[peerId]; if(storage) { @@ -5032,12 +5031,12 @@ export class AppMessagesManager extends AppManager { const filteredReadParticipants = readParticipantsPeerIds.slice(); forEachReverse(filteredReadParticipants, (peerId, idx, arr) => { - if(messageReactionsList.reactions.some((reaction) => getPeerId(reaction.peer_id) === peerId)) { + if(messageReactionsList.reactions.some((reaction) => this.appPeersManager.getPeerId(reaction.peer_id) === peerId)) { arr.splice(idx, 1); } }); - let combined: {peerId: PeerId, reaction?: string}[] = messageReactionsList.reactions.map((reaction) => ({peerId: getPeerId(reaction.peer_id), reaction: reaction.reaction})); + let combined: {peerId: PeerId, reaction?: string}[] = messageReactionsList.reactions.map((reaction) => ({peerId: this.appPeersManager.getPeerId(reaction.peer_id), reaction: reaction.reaction})); combined = combined.concat(filteredReadParticipants.map((readPeerId) => ({peerId: readPeerId}))); return { @@ -5631,7 +5630,7 @@ export class AppMessagesManager extends AppManager { public fetchMessageReplyTo(message: MyMessage) { if(!message.reply_to_mid) return Promise.resolve(this.generateEmptyMessage(0)); - const replyToPeerId = message.reply_to.reply_to_peer_id ? getPeerId(message.reply_to.reply_to_peer_id) : message.peerId; + const replyToPeerId = message.reply_to.reply_to_peer_id ? this.appPeersManager.getPeerId(message.reply_to.reply_to_peer_id) : message.peerId; return this.wrapSingleMessage(replyToPeerId, message.reply_to_mid).then((originalMessage) => { if(!originalMessage) { // ! break the infinite loop message = this.getMessageByPeer(message.peerId, message.mid); // message can come from other thread diff --git a/src/lib/appManagers/appNotificationsManager.ts b/src/lib/appManagers/appNotificationsManager.ts index 31df2959..9e80cf4d 100644 --- a/src/lib/appManagers/appNotificationsManager.ts +++ b/src/lib/appManagers/appNotificationsManager.ts @@ -15,7 +15,6 @@ import { MUTE_UNTIL } from "../mtproto/mtproto_config"; import throttle from "../../helpers/schedulers/throttle"; import convertInputKeyToKey from "../../helpers/string/convertInputKeyToKey"; import { AppManager } from "./manager"; -import getPeerId from "./utils/peers/getPeerId"; import ctx from "../../environment/ctx"; import assumeType from "../../helpers/assumeType"; @@ -41,7 +40,7 @@ export class AppNotificationsManager extends AppManager { this.apiUpdatesManager.addMultipleEventsListeners({ updateNotifySettings: (update) => { - const peerId = update.peer._ === 'notifyPeer' && getPeerId(update.peer.peer); + const peerId = update.peer._ === 'notifyPeer' && this.appPeersManager.getPeerId(update.peer.peer); const key = update.peer._ !== 'notifyPeer' ? update.peer._ : undefined; this.savePeerSettings({ key, @@ -71,7 +70,7 @@ export class AppNotificationsManager extends AppManager { let peerId: PeerId; if(peer._ === 'inputNotifyPeer') { - peerId = key = getPeerId(peer.peer); + peerId = key = this.appPeersManager.getPeerId(peer.peer); obj = obj[key]; } diff --git a/src/lib/appManagers/appPeersManager.ts b/src/lib/appManagers/appPeersManager.ts index 4b26dd03..c44fc865 100644 --- a/src/lib/appManagers/appPeersManager.ts +++ b/src/lib/appManagers/appPeersManager.ts @@ -87,6 +87,10 @@ export class AppPeersManager extends AppManager { : this.appChatsManager.getChat(peerId.toChatId()); } + public getPeerId(...args: Parameters) { + return getPeerId(...args) || this.peerId; + } + public getDialogPeer(peerId: PeerId): DialogPeer { return { _: 'dialogPeer', @@ -207,6 +211,9 @@ export class AppPeersManager extends AppManager { return this.appUsersManager.getUserInputPeer(userId); } + /** + * ! use it only in safe places like requests + */ public getInputPeerSelf(): InputPeer.inputPeerSelf { return {_: 'inputPeerSelf'}; } diff --git a/src/lib/appManagers/appProfileManager.ts b/src/lib/appManagers/appProfileManager.ts index a66edbc2..ec3ddb60 100644 --- a/src/lib/appManagers/appProfileManager.ts +++ b/src/lib/appManagers/appProfileManager.ts @@ -15,7 +15,6 @@ import { ChannelParticipantsFilter, ChannelsChannelParticipants, ChannelParticip import SearchIndex from "../searchIndex"; import { AppManager } from "./manager"; import getServerMessageId from "./utils/messageId/getServerMessageId"; -import getPeerId from "./utils/peers/getPeerId"; import getPhotoInput from "./utils/photos/getPhotoInput"; import getParticipantPeerId from "./utils/chats/getParticipantPeerId"; import ctx from "../../environment/ctx"; @@ -632,12 +631,12 @@ export class AppProfileManager extends AppManager { private onUpdateUserTyping = (update: Update.updateUserTyping | Update.updateChatUserTyping | Update.updateChannelUserTyping) => { const fromId = (update as Update.updateUserTyping).user_id ? (update as Update.updateUserTyping).user_id.toPeerId() : - getPeerId((update as Update.updateChatUserTyping).from_id); + this.appPeersManager.getPeerId((update as Update.updateChatUserTyping).from_id); if(this.appPeersManager.peerId === fromId || update.action._ === 'speakingInGroupCallAction') { return; } - const peerId = getPeerId(update); + const peerId = this.appPeersManager.getPeerId(update); const typings = this.typingsInPeer[peerId] ?? (this.typingsInPeer[peerId] = []); let typing = typings.find((t) => t.userId === fromId); @@ -706,7 +705,7 @@ export class AppProfileManager extends AppManager { }; private onUpdatePeerBlocked = (update: Update.updatePeerBlocked) => { - const peerId = getPeerId(update.peer_id); + const peerId = this.appPeersManager.getPeerId(update.peer_id); if(this.appPeersManager.isUser(peerId)) { const userId = peerId.toUserId(); const userFull = this.usersFull[userId]; diff --git a/src/lib/appManagers/appReactionsManager.ts b/src/lib/appManagers/appReactionsManager.ts index e5397822..55f8aeed 100644 --- a/src/lib/appManagers/appReactionsManager.ts +++ b/src/lib/appManagers/appReactionsManager.ts @@ -13,7 +13,6 @@ import { AvailableReaction, Message, MessagePeerReaction, MessagesAvailableReact import { ReferenceContext } from "../mtproto/referenceDatabase"; import { AppManager } from "./manager"; import getServerMessageId from "./utils/messageId/getServerMessageId"; -import getPeerId from "./utils/peers/getPeerId"; const SAVE_DOC_KEYS = [ 'static_icon' as const, @@ -243,7 +242,7 @@ export class AppReactionsManager extends AppManager { } */ if(reactions.recent_reactions) { - findAndSplice(reactions.recent_reactions, (recentReaction) => getPeerId(recentReaction.peer_id) === myPeerId); + findAndSplice(reactions.recent_reactions, (recentReaction) => this.appPeersManager.getPeerId(recentReaction.peer_id) === myPeerId); } if(!reactions.results.length) { diff --git a/src/lib/appManagers/appUsersManager.ts b/src/lib/appManagers/appUsersManager.ts index 03aeef79..780706f8 100644 --- a/src/lib/appManagers/appUsersManager.ts +++ b/src/lib/appManagers/appUsersManager.ts @@ -650,9 +650,10 @@ export class AppUsersManager extends AppManager { public getUserInputPeer(id: UserId): InputPeer.inputPeerSelf | InputPeer.inputPeerUser { const user = this.getUser(id); - if(user.pFlags && user.pFlags.self) { - return {_: 'inputPeerSelf'}; - } + // ! do not use it, there are places that don't support it. need explicit peer id + // if(user.pFlags?.self) { + // return {_: 'inputPeerSelf'}; + // } return { _: 'inputPeerUser', diff --git a/src/lib/mediaPlayer.ts b/src/lib/mediaPlayer.ts index ce562bf8..0b4b0be0 100644 --- a/src/lib/mediaPlayer.ts +++ b/src/lib/mediaPlayer.ts @@ -118,7 +118,7 @@ export default class VideoPlayer extends ControlsHover { const fullScreenButton = wrapper.querySelector('.fullscreen') as HTMLElement; const timeElapsed = wrapper.querySelector('#time-elapsed'); timeDuration = wrapper.querySelector('#time-duration') as HTMLElement; - timeDuration.innerHTML = toHHMMSS(video.duration | 0); + timeDuration.textContent = toHHMMSS(video.duration | 0); const volumeSelector = new VolumeSelector(listenerSetter); @@ -223,7 +223,7 @@ export default class VideoPlayer extends ControlsHover { addFullScreenListener(wrapper, this.onFullScreen.bind(this, fullScreenButton), listenerSetter); listenerSetter.add(video)('timeupdate', () => { - timeElapsed.innerHTML = toHHMMSS(video.currentTime | 0); + timeElapsed.textContent = toHHMMSS(video.currentTime | 0); }); listenerSetter.add(video)('play', () => { @@ -254,10 +254,10 @@ export default class VideoPlayer extends ControlsHover { }); if(video.duration || initDuration) { - timeDuration.innerHTML = toHHMMSS(Math.round(video.duration || initDuration)); + timeDuration.textContent = toHHMMSS(Math.round(video.duration || initDuration)); } else { onMediaLoad(video).then(() => { - timeDuration.innerHTML = toHHMMSS(Math.round(video.duration)); + timeDuration.textContent = toHHMMSS(Math.round(video.duration)); }); } } diff --git a/src/lib/storages/dialogs.ts b/src/lib/storages/dialogs.ts index 2b4d9a87..c7f75569 100644 --- a/src/lib/storages/dialogs.ts +++ b/src/lib/storages/dialogs.ts @@ -25,7 +25,6 @@ import indexOfAndSplice from "../../helpers/array/indexOfAndSplice"; import insertInDescendSortedArray from "../../helpers/array/insertInDescendSortedArray"; import safeReplaceObject from "../../helpers/object/safeReplaceObject"; import getServerMessageId from "../appManagers/utils/messageId/getServerMessageId"; -import getPeerId from "../appManagers/utils/peers/getPeerId"; import generateMessageId from "../appManagers/utils/messageId/generateMessageId"; import { AppManager } from "../appManagers/manager"; import getDialogIndexKey from "../appManagers/utils/dialogs/getDialogIndexKey"; @@ -787,7 +786,7 @@ export default class DialogsStorage extends AppManager { const updatedDialogs: {[peerId: PeerId]: Dialog} = {}; (dialogsResult.dialogs as Dialog[]).forEach((dialog) => { - const peerId = getPeerId(dialog.peer); + const peerId = this.appPeersManager.getPeerId(dialog.peer); let topMessage = dialog.top_message; const topPendingMessage = this.appMessagesManager.pendingTopMsgs[peerId]; @@ -838,7 +837,7 @@ export default class DialogsStorage extends AppManager { * Won't save migrated from peer, forbidden peers, left and kicked */ public saveDialog(dialog: Dialog, folderId = dialog.folder_id ?? FOLDER_ID_ALL, ignoreOffsetDate?: boolean, saveGlobalOffset?: boolean) { - const peerId = getPeerId(dialog.peer); + const peerId = this.appPeersManager.getPeerId(dialog.peer); if(!peerId) { console.error('saveConversation no peerId???', dialog, folderId); return; @@ -902,7 +901,7 @@ export default class DialogsStorage extends AppManager { if(!channelId && peerId.isAnyChat()) { const chat = this.appChatsManager.getChat(peerId.toChatId()); if(chat && chat.migrated_to && chat.pFlags.deactivated) { - const migratedToPeer = getPeerId(chat.migrated_to); + const migratedToPeer = this.appPeersManager.getPeerId(chat.migrated_to); this.appMessagesManager.migratedFromTo[peerId] = migratedToPeer; this.appMessagesManager.migratedToFrom[migratedToPeer] = peerId; dialog.migratedTo = migratedToPeer; @@ -1109,7 +1108,7 @@ export default class DialogsStorage extends AppManager { peers.forEach((folderPeer) => { const {folder_id, peer} = folderPeer; - const peerId = getPeerId(peer); + const peerId = this.appPeersManager.getPeerId(peer); const dialog = this.dropDialog(peerId)[0]; if(dialog) { if(dialog.pFlags?.pinned) { @@ -1128,7 +1127,7 @@ export default class DialogsStorage extends AppManager { private onUpdateDialogPinned = (update: Update.updateDialogPinned) => { const folderId = update.folder_id ?? FOLDER_ID_ALL; //this.log('updateDialogPinned', update); - const peerId = getPeerId((update.peer as DialogPeer.dialogPeer).peer); + const peerId = this.appPeersManager.getPeerId((update.peer as DialogPeer.dialogPeer).peer); const dialog = this.getDialogOnly(peerId); // этот код внизу никогда не сработает, в папках за пиннед отвечает updateDialogFilter @@ -1217,6 +1216,6 @@ export default class DialogsStorage extends AppManager { //this.log('before order:', this.dialogsStorage[0].map((d) => d.peerId)); - handleOrder(update.order.map((peer) => getPeerId((peer as DialogPeer.dialogPeer).peer))); + handleOrder(update.order.map((peer) => this.appPeersManager.getPeerId((peer as DialogPeer.dialogPeer).peer))); }; } diff --git a/src/lib/storages/filters.ts b/src/lib/storages/filters.ts index fb62e168..871326be 100644 --- a/src/lib/storages/filters.ts +++ b/src/lib/storages/filters.ts @@ -8,7 +8,6 @@ import type { DialogFilter, Update } from "../../layer"; import type { Dialog } from '../appManagers/appMessagesManager'; import forEachReverse from "../../helpers/array/forEachReverse"; import copy from "../../helpers/object/copy"; -import getPeerId from "../appManagers/utils/peers/getPeerId"; import { AppManager } from "../appManagers/manager"; import findAndSplice from "../../helpers/array/findAndSplice"; import assumeType from "../../helpers/assumeType"; @@ -95,7 +94,6 @@ export default class FiltersStorage extends AppManager { return this.appStateManager.getState().then((state) => { const filtersArr = this.prependFilters(state.filtersArr); filtersArr.map((filter) => { - delete filter.localId; this.saveDialogFilter(filter, false, true); }); }); @@ -117,6 +115,11 @@ export default class FiltersStorage extends AppManager { findAndSplice(filters, (filter) => (filter as MyDialogFilter).id === FOLDER_ID_ARCHIVE); filters.splice(/* 1 */filters[0] === allChatsFilter ? 1 : 0, 0, archiveFilter); + this.localId = START_LOCAL_ID; + filters.forEach((filter) => { + delete filter.localId; + }); + return filters; } @@ -174,14 +177,19 @@ export default class FiltersStorage extends AppManager { private onUpdateDialogFilterOrder = (update: Update.updateDialogFilterOrder) => { //console.log('updateDialogFilterOrder', update); + const order = update.order.slice(); + if(!order.includes(FOLDER_ID_ARCHIVE)) { + order.splice(order[0] === FOLDER_ID_ALL ? 1 : 0, 0, FOLDER_ID_ARCHIVE); + } + this.localId = START_LOCAL_ID; - update.order.forEach((filterId, idx) => { + order.forEach((filterId) => { const filter = this.filters[filterId]; delete filter.localId; this.setLocalId(filter); }); - this.rootScope.dispatchEvent('filter_order', update.order); + this.rootScope.dispatchEvent('filter_order', order); this.pushToState(); }; @@ -415,7 +423,7 @@ export default class FiltersStorage extends AppManager { // const missingPeerIds: PeerId[] = []; const reloadDialogs = peers.filter((inputPeer) => { - const peerId = getPeerId(inputPeer); + const peerId = this.appPeersManager.getPeerId(inputPeer); const isAlreadyReloaded = this.reloadedPeerIds.has(peerId); const dialog = this.appMessagesManager.getDialogOnly(peerId); // if(isAlreadyReloaded && !dialog) { @@ -435,7 +443,7 @@ export default class FiltersStorage extends AppManager { } const reloadPromises = reloadDialogs.map((inputPeer) => { - const peerId = getPeerId(inputPeer); + const peerId = this.appPeersManager.getPeerId(inputPeer); const promise = this.appMessagesManager.reloadConversation(inputPeer) .then((dialog) => { this.reloadedPeerIds.add(peerId); @@ -465,7 +473,8 @@ export default class FiltersStorage extends AppManager { } const filters = await this.apiManager.invokeApiSingle('messages.getDialogFilters'); - return this.prependFilters(filters).map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean); + const prepended = this.prependFilters(filters); + return prepended.map((filter) => this.saveDialogFilter(filter, overwrite)).filter(Boolean); } public getSuggestedDialogsFilters() { @@ -483,7 +492,7 @@ export default class FiltersStorage extends AppManager { if(!REAL_FOLDERS.has(filter.id)) { convertment.forEach(([from, to]) => { assumeType(filter); - filter[to] = filter[from].map((peer) => getPeerId(peer)); + filter[to] = filter[from].map((peer) => this.appPeersManager.getPeerId(peer)); }); this.filterIncludedPinnedPeers(filter);