diff --git a/src/components/appSelectPeers.ts b/src/components/appSelectPeers.ts index 112ee5d2..306cf66c 100644 --- a/src/components/appSelectPeers.ts +++ b/src/components/appSelectPeers.ts @@ -23,8 +23,9 @@ import replaceContent from "../helpers/dom/replaceContent"; import { filterUnique, indexOfAndSplice } from "../helpers/array"; import debounce from "../helpers/schedulers/debounce"; import windowSize from "../helpers/windowSize"; +import appPeersManager, { IsPeerType } from "../lib/appManagers/appPeersManager"; -type PeerType = 'contacts' | 'dialogs' | 'channelParticipants'; +type SelectSearchPeerType = 'contacts' | 'dialogs' | 'channelParticipants'; // TODO: правильная сортировка для addMembers, т.е. для peerType: 'contacts', потому что там идут сначала контакты - потом неконтакты, а должно всё сортироваться по имени @@ -59,12 +60,14 @@ export default class AppSelectPeers { private appendTo: HTMLElement; private onChange: (length: number) => void; - private peerType: PeerType[] = ['dialogs']; + private peerType: SelectSearchPeerType[] = ['dialogs']; private renderResultsFunc: (peerIds: PeerId[]) => void; private chatRightsAction: ChatRights; private multiSelect = true; private rippleEnabled = true; private avatarSize = 48; + private exceptSelf = false; + private filterPeerTypeBy: IsPeerType[]; private tempIds: {[k in keyof AppSelectPeers['loadedWhat']]: number} = {}; private peerId: PeerId; @@ -79,22 +82,24 @@ export default class AppSelectPeers { appendTo: AppSelectPeers['appendTo'], onChange?: AppSelectPeers['onChange'], peerType?: AppSelectPeers['peerType'], - peerId?: number, + peerId?: AppSelectPeers['peerId'], onFirstRender?: () => void, renderResultsFunc?: AppSelectPeers['renderResultsFunc'], chatRightsAction?: AppSelectPeers['chatRightsAction'], multiSelect?: AppSelectPeers['multiSelect'], - rippleEnabled?: boolean, + rippleEnabled?: AppSelectPeers['rippleEnabled'], avatarSize?: AppSelectPeers['avatarSize'], - placeholder?: LangPackKey, - selfPresence?: LangPackKey + placeholder?: AppSelectPeers['placeholder'], + selfPresence?: AppSelectPeers['selfPresence'], + exceptSelf?: AppSelectPeers['exceptSelf'], + filterPeerTypeBy?: AppSelectPeers['filterPeerTypeBy'] }) { safeAssign(this, options); this.container.classList.add('selector'); const f = (this.renderResultsFunc || this.renderResults).bind(this); - this.renderResultsFunc = (peerIds: PeerId[]) => { + this.renderResultsFunc = (peerIds) => { if(this.needSwitchList) { this.scrollable.splitUp.replaceWith(this.list); this.scrollable.setVirtualContainer(this.list); @@ -107,6 +112,19 @@ export default class AppSelectPeers { return notRendered; }); + if(this.filterPeerTypeBy) { + peerIds = peerIds.filter(peerId => { + if(peerId.isPeerId()) { + const peer = appPeersManager.getPeer(peerId); + if(!peer.deleted) { + return this.filterPeerTypeBy.find(method => appPeersManager[method](peerId)); + } + } + + return true; + }); + } + return f(peerIds); }; @@ -235,7 +253,11 @@ export default class AppSelectPeers { }; private renderSaved() { - if(!this.offsetIndex && this.folderId === 0 && this.peerType.includes('dialogs') && (!this.query || appUsersManager.testSelfSearch(this.query))) { + if(!this.exceptSelf && + !this.offsetIndex && + this.folderId === 0 && + this.peerType.includes('dialogs') && + (!this.query || appUsersManager.testSelfSearch(this.query))) { this.renderResultsFunc([rootScope.myId]); } } diff --git a/src/components/chat/input.ts b/src/components/chat/input.ts index 595c5774..eea78391 100644 --- a/src/components/chat/input.ts +++ b/src/components/chat/input.ts @@ -124,7 +124,7 @@ export default class ChatInput { private getWebPagePromise: Promise; private willSendWebPage: WebPage = null; - private forwarding: {[frompeerId: PeerId]: number[]}; + private forwarding: {[fromPeerId: PeerId]: number[]}; public replyToMsgId: number; public editMsgId: number; public editMessage: Message.message; diff --git a/src/components/chat/mentionsHelper.ts b/src/components/chat/mentionsHelper.ts index ade7f625..098f6f2a 100644 --- a/src/components/chat/mentionsHelper.ts +++ b/src/components/chat/mentionsHelper.ts @@ -21,7 +21,7 @@ export default class MentionsHelper extends AutocompletePeerHelper { controller, 'mentions-helper', (target) => { - const user = appUsersManager.getUser((target as HTMLElement).dataset.peerId); + const user = appUsersManager.getUser((target as HTMLElement).dataset.peerId.toUserId()); let str = '', entity: MessageEntity; if(user.username) { str = '@' + user.username; diff --git a/src/components/chat/selection.ts b/src/components/chat/selection.ts index 113fd2f6..37ab10b4 100644 --- a/src/components/chat/selection.ts +++ b/src/components/chat/selection.ts @@ -175,8 +175,8 @@ class AppSelection { const processElement = (element: HTMLElement, checkBetween = true) => { const mid = +element.dataset.mid; - const peerId = (element.dataset.peerId || '').toPeerId(); - if(!mid || !peerId) return; + if(!mid || !element.dataset.peerId) return; + const peerId = element.dataset.peerId.toPeerId(); if(!isInDOM(firstTarget)) { firstTarget = element; @@ -620,7 +620,7 @@ export class SearchSelection extends AppSelection { this.selectionForwardBtn = ButtonIcon(`forward ${BASE_CLASS}-forward`); attachClickEvent(this.selectionForwardBtn, () => { - const obj: {[frompeerId: PeerId]: number[]} = {}; + const obj: {[fromPeerId: PeerId]: number[]} = {}; for(const [fromPeerId, mids] of this.selectedMids) { obj[fromPeerId] = Array.from(mids); } @@ -895,7 +895,7 @@ export default class ChatSelection extends AppSelection { this.selectionForwardBtn = Button('btn-primary btn-transparent text-bold selection-container-forward', {icon: 'forward'}); this.selectionForwardBtn.append(i18n('Forward')); attachClickEvent(this.selectionForwardBtn, () => { - const obj: {[frompeerId: PeerId]: number[]} = {}; + const obj: {[fromPeerId: PeerId]: number[]} = {}; for(const [fromPeerId, mids] of this.selectedMids) { obj[fromPeerId] = Array.from(mids); } diff --git a/src/components/popups/forward.ts b/src/components/popups/forward.ts index a20a7ca2..a8437383 100644 --- a/src/components/popups/forward.ts +++ b/src/components/popups/forward.ts @@ -9,7 +9,7 @@ import PopupPickUser from "./pickUser"; export default class PopupForward extends PopupPickUser { constructor( - peerIdMids: {[frompeerId: PeerId]: number[]}, + peerIdMids: {[fromPeerId: PeerId]: number[]}, onSelect?: (peerId: PeerId) => Promise | void, onClose?: () => void, overrideOnSelect = false diff --git a/src/components/privacySection.ts b/src/components/privacySection.ts index 77369f4d..0de07789 100644 --- a/src/components/privacySection.ts +++ b/src/components/privacySection.ts @@ -6,7 +6,6 @@ import { randomLong } from "../helpers/random"; import { InputPrivacyKey, InputPrivacyRule } from "../layer"; -import appChatsManager from "../lib/appManagers/appChatsManager"; import appPrivacyManager, { PrivacyType } from "../lib/appManagers/appPrivacyManager"; import appUsersManager from "../lib/appManagers/appUsersManager"; import { i18n, join, LangPackKey, _i18n } from "../lib/langPack"; @@ -150,11 +149,11 @@ export default class PrivacySection { if(this.exceptions) { this.peerIds = {}; - (['allow', 'disallow'] as ('allow' | 'disallow')[]).forEach(k => { + ['allow' as const, 'disallow' as const].forEach(k => { const arr = []; const from = k === 'allow' ? details.allowPeers : details.disallowPeers; arr.push(...from.users.map(id => id.toPeerId())); - arr.push(...from.chats.map(id => id.toPeerId(false))); + arr.push(...from.chats.map(id => id.toPeerId(true))); this.peerIds[k] = arr; const s = this.exceptions.get(k).row.subtitle; s.innerHTML = ''; @@ -194,7 +193,7 @@ export default class PrivacySection { if(_peerIds) { const splitted = this.splitPeersByType(_peerIds); if(splitted.chats.length) { - rules.push({_: chatKey, chats: splitted.chats.map(peerId => peerId.toChatId())}); + rules.push({_: chatKey, chats: splitted.chats}); } if(splitted.users.length) { diff --git a/src/components/sidebarLeft/tabs/addMembers.ts b/src/components/sidebarLeft/tabs/addMembers.ts index 42219dbc..7a5d426c 100644 --- a/src/components/sidebarLeft/tabs/addMembers.ts +++ b/src/components/sidebarLeft/tabs/addMembers.ts @@ -65,13 +65,16 @@ export default class AppAddMembersTab extends SliderSuperTab { this.takeOut = options.takeOut; this.skippable = options.skippable; + const isPrivacy = this.peerType === 'privacy'; this.selector = new AppSelectPeers({ appendTo: this.content, onChange: this.skippable ? null : (length) => { this.nextBtn.classList.toggle('is-visible', !!length); }, - peerType: ['contacts'], - placeholder: options.placeholder + peerType: [isPrivacy ? 'dialogs' : 'contacts'], + placeholder: options.placeholder, + exceptSelf: isPrivacy, + filterPeerTypeBy: isPrivacy ? ['isAnyGroup', 'isUser'] : undefined }); if(options.selectedPeerIds) { diff --git a/src/lib/appManagers/appPeersManager.ts b/src/lib/appManagers/appPeersManager.ts index af5ed4f2..0873302d 100644 --- a/src/lib/appManagers/appPeersManager.ts +++ b/src/lib/appManagers/appPeersManager.ts @@ -308,6 +308,8 @@ export class AppPeersManager { } } +export type IsPeerType = 'isChannel' | 'isMegagroup' | 'isAnyGroup' | 'isBroadcast' | 'isBot' | 'isContact' | 'isUser' | 'isAnyChat'; + [ 'isChannel', 'isMegagroup', diff --git a/src/lib/appManagers/appUsersManager.ts b/src/lib/appManagers/appUsersManager.ts index c2405a83..4cb2b963 100644 --- a/src/lib/appManagers/appUsersManager.ts +++ b/src/lib/appManagers/appUsersManager.ts @@ -515,7 +515,7 @@ export class AppUsersManager { return 0; } - public getUser(id: any) { + public getUser(id: User | UserId) { if(isObject(id)) { return id; }