From 7f746738f5130480dfef72fb9609dbaa9b80c47b Mon Sep 17 00:00:00 2001 From: morethanwords Date: Fri, 16 Oct 2020 19:53:57 +0300 Subject: [PATCH] Fix chat leave Close deleted chat & channel --- src/components/dialogsContextMenu.ts | 10 ++-- src/components/sidebarLeft/tabs/newChannel.ts | 5 +- src/components/sidebarLeft/tabs/newGroup.ts | 5 +- src/lib/appManagers/appChatsManager.ts | 46 +++++++++++++------ src/lib/appManagers/appImManager.ts | 8 +++- src/lib/appManagers/appMessagesManager.ts | 11 ++--- 6 files changed, 53 insertions(+), 32 deletions(-) diff --git a/src/components/dialogsContextMenu.ts b/src/components/dialogsContextMenu.ts index 46fa4ace..f6569b88 100644 --- a/src/components/dialogsContextMenu.ts +++ b/src/components/dialogsContextMenu.ts @@ -56,12 +56,12 @@ export default class DialogsContextMenu { this.buttons.delete.addEventListener('click', () => { let firstName = appPeersManager.getPeerTitle(this.selectedID, false, true); - let callbackFlush = (justClear: boolean) => { + let callbackFlush = (justClear?: true) => { appMessagesManager.flushHistory(this.selectedID, justClear); }; let callbackLeave = () => { - appChatsManager.leaveChannel(-this.selectedID); + appChatsManager.leave(-this.selectedID); }; let title: string, description: string, buttons: PopupButton[]; @@ -96,7 +96,7 @@ export default class DialogsContextMenu { buttons = [{ text: 'DELETE FOR ME AND ' + firstName, isDanger: true, - callback: () => callbackFlush(false) + callback: () => callbackFlush() }, { text: 'DELETE JUST FOR ME', isDanger: true, @@ -112,7 +112,7 @@ export default class DialogsContextMenu { buttons = [{ text: 'DELETE SAVED MESSAGES', isDanger: true, - callback: () => callbackFlush(false) + callback: () => callbackFlush() }]; break; @@ -124,7 +124,7 @@ export default class DialogsContextMenu { buttons = [{ text: 'DELETE AND LEAVE ' + firstName, isDanger: true, - callback: () => callbackFlush(true) + callback: () => callbackLeave() }]; break; diff --git a/src/components/sidebarLeft/tabs/newChannel.ts b/src/components/sidebarLeft/tabs/newChannel.ts index 5927823f..58f5ca7a 100644 --- a/src/components/sidebarLeft/tabs/newChannel.ts +++ b/src/components/sidebarLeft/tabs/newChannel.ts @@ -1,4 +1,5 @@ import appSidebarLeft, { AppSidebarLeft } from ".."; +import { InputFile } from "../../../layer"; import appChatsManager from "../../../lib/appManagers/appChatsManager"; import PopupAvatar from "../../popupAvatar"; import { SliderTab } from "../../slider"; @@ -10,7 +11,7 @@ export default class AppNewChannelTab implements SliderTab { private channelDescriptionInput = this.container.querySelector('.new-channel-description') as HTMLInputElement; private nextBtn = this.container.querySelector('.btn-corner') as HTMLButtonElement; private backBtn = this.container.querySelector('.sidebar-close-button') as HTMLButtonElement; - private uploadAvatar: () => Promise = null; + private uploadAvatar: () => Promise = null; constructor() { this.container.querySelector('.avatar-edit').addEventListener('click', () => { @@ -35,7 +36,7 @@ export default class AppNewChannelTab implements SliderTab { this.nextBtn.disabled = true; appChatsManager.createChannel(title, about).then((channelID) => { if(this.uploadAvatar) { - this.uploadAvatar().then((inputFile: any) => { + this.uploadAvatar().then((inputFile) => { appChatsManager.editPhoto(channelID, inputFile); }); } diff --git a/src/components/sidebarLeft/tabs/newGroup.ts b/src/components/sidebarLeft/tabs/newGroup.ts index 6f700775..5c43893c 100644 --- a/src/components/sidebarLeft/tabs/newGroup.ts +++ b/src/components/sidebarLeft/tabs/newGroup.ts @@ -1,4 +1,5 @@ import appSidebarLeft, { AppSidebarLeft } from ".."; +import { InputFile } from "../../../layer"; import appChatsManager from "../../../lib/appManagers/appChatsManager"; import appDialogsManager from "../../../lib/appManagers/appDialogsManager"; import appUsersManager from "../../../lib/appManagers/appUsersManager"; @@ -14,7 +15,7 @@ export default class AppNewGroupTab implements SliderTab { private groupNameInput = this.container.querySelector('.new-group-name') as HTMLInputElement; private nextBtn = this.container.querySelector('.btn-corner') as HTMLButtonElement; private searchGroup = new SearchGroup(' ', 'contacts', true, 'new-group-members disable-hover', false); - private uploadAvatar: () => Promise = null; + private uploadAvatar: () => Promise = null; private userIDs: number[]; constructor() { @@ -35,7 +36,7 @@ export default class AppNewGroupTab implements SliderTab { this.nextBtn.disabled = true; appChatsManager.createChat(title, this.userIDs).then((chatID) => { if(this.uploadAvatar) { - this.uploadAvatar().then((inputFile: any) => { + this.uploadAvatar().then((inputFile) => { appChatsManager.editPhoto(chatID, inputFile); }); } diff --git a/src/lib/appManagers/appChatsManager.ts b/src/lib/appManagers/appChatsManager.ts index 6e5d4108..a75e7958 100644 --- a/src/lib/appManagers/appChatsManager.ts +++ b/src/lib/appManagers/appChatsManager.ts @@ -1,10 +1,11 @@ -import { ChatAdminRights, ChatBannedRights, ChatFull, ChatParticipants, InputChannel, InputChatPhoto, InputPeer, Updates } from "../../layer"; +import { ChatAdminRights, ChatBannedRights, ChatFull, ChatParticipants, InputChannel, InputChatPhoto, InputFile, InputPeer, Updates } from "../../layer"; import apiManager from '../mtproto/mtprotoworker'; import { RichTextProcessor } from "../richtextprocessor"; import $rootScope from "../rootScope"; import searchIndexManager from "../searchIndexManager"; import { copy, getAbbreviation, isObject, numberWithCommas, safeReplaceObject } from "../utils"; import apiUpdatesManager from "./apiUpdatesManager"; +import appMessagesManager from "./appMessagesManager"; import appProfileManager from "./appProfileManager"; import appUsersManager from "./appUsersManager"; @@ -296,13 +297,13 @@ export class AppChatsManager { }; } - public hasChat(id: number, allowMin?: any) { - let chat = this.chats[id] + public hasChat(id: number, allowMin?: true) { + const chat = this.chats[id] return isObject(chat) && (allowMin || !chat.pFlags.min); } public getChatPhoto(id: number) { - let chat = this.getChat(id); + const chat = this.getChat(id); if(this.cachedPhotoLocations[id] === undefined) { this.cachedPhotoLocations[id] = chat && chat.photo ? chat.photo : {empty: true}; @@ -312,7 +313,7 @@ export class AppChatsManager { } public getChatString(id: number) { - let chat = this.getChat(id); + const chat = this.getChat(id); if(this.isChannel(id)) { return (this.isMegagroup(id) ? 's' : 'c') + id + '_' + chat.access_hash; } @@ -328,8 +329,8 @@ export class AppChatsManager { } public wrapForFull(id: number, fullChat: any) { - let chatFull = copy(fullChat); - let chat = this.getChat(id); + const chatFull = copy(fullChat); + const chat = this.getChat(id); if(!chatFull.participants_count) { chatFull.participants_count = chat.participants_count; @@ -351,10 +352,10 @@ export class AppChatsManager { } public wrapParticipants(id: number, participants: any[]) { - let chat = this.getChat(id); - let myID = appUsersManager.getSelf().id; + const chat = this.getChat(id); + const myID = appUsersManager.getSelf().id; if(this.isChannel(id)) { - let isAdmin = chat.pFlags.creator; + const isAdmin = chat.pFlags.creator; participants.forEach((participant) => { participant.canLeave = myID == participant.user_id; participant.canKick = isAdmin && participant._ == 'channelParticipant'; @@ -363,7 +364,7 @@ export class AppChatsManager { participant.user = appUsersManager.getUser(participant.user_id); }); } else { - let isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin; + const isAdmin = chat.pFlags.creator || chat.pFlags.admins_enabled && chat.pFlags.admin; participants.forEach((participant) => { participant.canLeave = myID == participant.user_id; participant.canKick = !participant.canLeave && ( @@ -393,8 +394,8 @@ export class AppChatsManager { } public inviteToChannel(id: number, userIDs: number[]) { - let input = this.getChannelInput(id); - let usersInputs = userIDs.map(u => appUsersManager.getUserInput(u)); + const input = this.getChannelInput(id); + const usersInputs = userIDs.map(u => appUsersManager.getUserInput(u)); return apiManager.invokeApi('channels.inviteToChannel', { channel: input, @@ -415,7 +416,7 @@ export class AppChatsManager { }); } - public editPhoto(id: number, inputFile: any) { + public editPhoto(id: number, inputFile: InputFile) { const isChannel = this.isChannel(id); const inputChatPhoto: InputChatPhoto.inputChatUploadedPhoto = { @@ -500,6 +501,23 @@ export class AppChatsManager { channel: this.getChannelInput(id) }).then(this.onChatUpdated.bind(this, id)); } + + public deleteChatUser(id: number, userID: number) { + return apiManager.invokeApi('messages.deleteChatUser', { + chat_id: id, + user_id: appUsersManager.getUserInput(userID) + }).then(this.onChatUpdated.bind(this, id)); + } + + public leaveChat(id: number) { + return this.deleteChatUser(id, appUsersManager.getSelf().id).then(() => { + return appMessagesManager.flushHistory(-id); + }); + } + + public leave(id: number) { + return this.isChannel(id) ? this.leaveChannel(id) : this.leaveChat(id); + } } export default new AppChatsManager(); diff --git a/src/lib/appManagers/appImManager.ts b/src/lib/appManagers/appImManager.ts index 28f50bc1..5dfbeeb1 100644 --- a/src/lib/appManagers/appImManager.ts +++ b/src/lib/appManagers/appImManager.ts @@ -362,6 +362,12 @@ export class AppImManager { }); }); + $rootScope.$on('dialog_drop', (e) => { + if(e.detail.peerID == this.peerID) { + this.setPeer(0); + } + }); + $rootScope.$on('apiUpdate', (e) => { let update = e.detail; @@ -725,7 +731,7 @@ export class AppImManager { //appSidebarRight.toggleSidebar(false); document.body.classList.remove(RIGHT_COLUMN_ACTIVE_CLASSNAME); } - + this._selectTab(id, mediaSizes.isMobile); //document.body.classList.toggle(RIGHT_COLUMN_ACTIVE_CLASSNAME, id == 2); } diff --git a/src/lib/appManagers/appMessagesManager.ts b/src/lib/appManagers/appMessagesManager.ts index 17895aa2..90dfc7b6 100644 --- a/src/lib/appManagers/appMessagesManager.ts +++ b/src/lib/appManagers/appMessagesManager.ts @@ -2096,14 +2096,9 @@ export class AppMessagesManager { }); } - private doFlushHistory(inputPeer: any, justClear: boolean): Promise { - let flags = 0; - if(justClear) { - flags |= 1; - } - + private doFlushHistory(inputPeer: any, justClear?: true): Promise { return apiManager.invokeApi('messages.deleteHistory', { - flags: flags, + just_clear: justClear, peer: inputPeer, max_id: 0 }).then((affectedHistory) => { @@ -2124,7 +2119,7 @@ export class AppMessagesManager { }) } - public async flushHistory(peerID: number, justClear: boolean) { + public async flushHistory(peerID: number, justClear?: true) { if(appPeersManager.isChannel(peerID)) { let promise = this.getHistory(peerID, 0, 1);