Telegram Web K with changes to work inside I2P
https://web.telegram.i2p/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
249 lines
8.4 KiB
249 lines
8.4 KiB
/* |
|
* https://github.com/morethanwords/tweb |
|
* Copyright (C) 2019-2021 Eduard Kuzmenko |
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE |
|
*/ |
|
|
|
import type {Dialog} from '../lib/appManagers/appMessagesManager'; |
|
import type {ForumTopic} from '../layer'; |
|
import appDialogsManager, {DIALOG_LIST_ELEMENT_TAG} from '../lib/appManagers/appDialogsManager'; |
|
import rootScope from '../lib/rootScope'; |
|
import {ButtonMenuItemOptionsVerifiable, ButtonMenuSync} from './buttonMenu'; |
|
import PopupDeleteDialog from './popups/deleteDialog'; |
|
import {i18n, LangPackKey, _i18n} from '../lib/langPack'; |
|
import findUpTag from '../helpers/dom/findUpTag'; |
|
import {toastNew} from './toast'; |
|
import PopupMute from './popups/mute'; |
|
import {AppManagers} from '../lib/appManagers/managers'; |
|
import {GENERAL_TOPIC_ID} from '../lib/mtproto/mtproto_config'; |
|
import showLimitPopup from './popups/limit'; |
|
import createContextMenu from '../helpers/dom/createContextMenu'; |
|
import PopupElement from './popups'; |
|
import cancelEvent from '../helpers/dom/cancelEvent'; |
|
import IS_SHARED_WORKER_SUPPORTED from '../environment/sharedWorkerSupport'; |
|
|
|
export default class DialogsContextMenu { |
|
private buttons: ButtonMenuItemOptionsVerifiable[]; |
|
|
|
private peerId: PeerId; |
|
private filterId: number; |
|
private threadId: number; |
|
private dialog: Dialog | ForumTopic.forumTopic; |
|
private canManageTopics: boolean; |
|
private li: HTMLElement; |
|
|
|
constructor(private managers: AppManagers) { |
|
|
|
} |
|
|
|
public attach(element: HTMLElement) { |
|
createContextMenu({ |
|
listenTo: element, |
|
buttons: this.getButtons(), |
|
appendTo: document.getElementById('page-chats'), |
|
onOpen: async(li) => { |
|
this.li = li; |
|
li.classList.add('menu-open'); |
|
this.peerId = li.dataset.peerId.toPeerId(); |
|
this.threadId = +li.dataset.threadId || undefined; |
|
this.dialog = await this.managers.dialogsStorage.getDialogOrTopic(this.peerId, this.threadId); |
|
this.filterId = this.threadId ? undefined : appDialogsManager.filterId; |
|
this.canManageTopics = this.threadId ? await this.managers.appChatsManager.hasRights(this.peerId.toChatId(), 'manage_topics') : undefined; |
|
}, |
|
onBeforeOpen: async() => { |
|
// delete button |
|
const langPackKey: LangPackKey = this.threadId ? 'Delete' : await this.managers.appPeersManager.getDeleteButtonText(this.peerId); |
|
const lastButton = this.buttons[this.buttons.length - 1]; |
|
if(lastButton?.element) { |
|
lastButton.element.lastChild.replaceWith(i18n(langPackKey)); |
|
} |
|
}, |
|
onClose: () => { |
|
this.li.classList.remove('menu-open'); |
|
this.li = this.peerId = this.dialog = this.filterId = this.threadId = this.canManageTopics = undefined; |
|
}, |
|
findElement: (e) => { |
|
return findUpTag(e.target, DIALOG_LIST_ELEMENT_TAG); |
|
} |
|
}); |
|
} |
|
|
|
private getButtons() { |
|
return this.buttons ??= [{ |
|
icon: 'newtab', |
|
text: 'OpenInNewTab', |
|
onClick: (e) => { |
|
appDialogsManager.openDialogInNewTab(this.li); |
|
cancelEvent(e); |
|
}, |
|
verify: () => IS_SHARED_WORKER_SUPPORTED |
|
}, { |
|
icon: 'unread', |
|
text: 'MarkAsUnread', |
|
onClick: this.onUnreadClick, |
|
verify: async() => !this.threadId && !(await this.managers.appMessagesManager.isDialogUnread(this.dialog)) |
|
}, { |
|
icon: 'readchats', |
|
text: 'MarkAsRead', |
|
onClick: this.onUnreadClick, |
|
verify: () => this.managers.appMessagesManager.isDialogUnread(this.dialog) |
|
}, { |
|
icon: 'pin', |
|
text: 'ChatList.Context.Pin', |
|
onClick: this.onPinClick, |
|
verify: async() => { |
|
if(this.threadId && !this.canManageTopics) { |
|
return false; |
|
} |
|
|
|
const isPinned = this.filterId !== undefined && this.filterId > 1 ? |
|
(await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) : |
|
!!this.dialog.pFlags?.pinned; |
|
return !isPinned; |
|
} |
|
}, { |
|
icon: 'unpin', |
|
text: 'ChatList.Context.Unpin', |
|
onClick: this.onPinClick, |
|
verify: async() => { |
|
if(this.threadId && !this.canManageTopics) { |
|
return false; |
|
} |
|
|
|
const isPinned = this.filterId !== undefined && this.filterId > 1 ? |
|
(await this.managers.appMessagesManager.getFilter(this.filterId)).pinnedPeerIds.includes(this.dialog.peerId) : |
|
!!this.dialog.pFlags?.pinned; |
|
return isPinned; |
|
} |
|
}, { |
|
icon: 'mute', |
|
text: 'ChatList.Context.Mute', |
|
onClick: this.onMuteClick, |
|
verify: async() => { |
|
return this.peerId !== rootScope.myId && !(await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId})); |
|
} |
|
}, { |
|
icon: 'unmute', |
|
text: 'ChatList.Context.Unmute', |
|
onClick: this.onUnmuteClick, |
|
verify: async() => { |
|
return this.peerId !== rootScope.myId && (await this.managers.appNotificationsManager.isPeerLocalMuted({peerId: this.dialog.peerId, threadId: this.threadId})); |
|
} |
|
}, { |
|
icon: 'archive', |
|
text: 'Archive', |
|
onClick: this.onArchiveClick, |
|
verify: () => this.filterId === 0 && this.peerId !== rootScope.myId |
|
}, { |
|
icon: 'unarchive', |
|
text: 'Unarchive', |
|
onClick: this.onArchiveClick, |
|
verify: () => this.filterId === 1 && this.peerId !== rootScope.myId |
|
}, { |
|
icon: 'hide', |
|
text: 'Hide', |
|
onClick: this.onHideTopicClick, |
|
verify: () => { |
|
return this.canManageTopics && (this.dialog as ForumTopic.forumTopic).id === GENERAL_TOPIC_ID; |
|
} |
|
}, { |
|
icon: 'lock', |
|
text: 'CloseTopic', |
|
onClick: this.onToggleTopicClick, |
|
verify: () => { |
|
return this.canManageTopics && !(this.dialog as ForumTopic.forumTopic).pFlags.closed; |
|
} |
|
}, { |
|
icon: 'lockoff', |
|
text: 'RestartTopic', |
|
onClick: this.onToggleTopicClick, |
|
verify: () => { |
|
return this.canManageTopics && !!(this.dialog as ForumTopic.forumTopic).pFlags.closed; |
|
} |
|
}, { |
|
icon: 'delete danger', |
|
text: 'Delete', |
|
onClick: this.onDeleteClick, |
|
verify: () => { |
|
if(this.threadId) { |
|
if(!this.canManageTopics) { |
|
return false; |
|
} |
|
|
|
return (this.dialog as ForumTopic.forumTopic).id !== GENERAL_TOPIC_ID; |
|
} |
|
|
|
return true; |
|
} |
|
}]; |
|
} |
|
|
|
private onArchiveClick = async() => { |
|
const dialog = await this.managers.appMessagesManager.getDialogOnly(this.peerId); |
|
if(dialog) { |
|
this.managers.appMessagesManager.editPeerFolders([dialog.peerId], +!dialog.folder_id); |
|
} |
|
}; |
|
|
|
private onHideTopicClick = () => { |
|
this.managers.appChatsManager.editForumTopic({ |
|
chatId: this.peerId.toChatId(), |
|
topicId: this.threadId, |
|
hidden: true |
|
}); |
|
}; |
|
|
|
private onToggleTopicClick = () => { |
|
this.managers.appChatsManager.editForumTopic({ |
|
chatId: this.peerId.toChatId(), |
|
topicId: this.threadId, |
|
closed: !(this.dialog as ForumTopic.forumTopic).pFlags.closed |
|
}); |
|
}; |
|
|
|
private onPinClick = () => { |
|
const {peerId, filterId, threadId} = this; |
|
this.managers.appMessagesManager.toggleDialogPin({ |
|
peerId, |
|
filterId, |
|
topicId: threadId |
|
}).catch(async(err: ApiError) => { |
|
if(err.type === 'PINNED_DIALOGS_TOO_MUCH' || err.type === 'PINNED_TOO_MUCH') { |
|
if(threadId) { |
|
this.managers.apiManager.getLimit('topicPin').then((limit) => { |
|
toastNew({langPackKey: 'LimitReachedPinnedTopics', langPackArguments: [limit]}); |
|
}); |
|
} else if(filterId >= 1) { |
|
toastNew({langPackKey: 'PinFolderLimitReached'}); |
|
} else { |
|
showLimitPopup('pin'); |
|
} |
|
} |
|
}); |
|
}; |
|
|
|
private onUnmuteClick = () => { |
|
this.managers.appMessagesManager.togglePeerMute({peerId: this.peerId, mute: false, threadId: this.threadId}); |
|
}; |
|
|
|
private onMuteClick = () => { |
|
PopupElement.createPopup(PopupMute, this.peerId, this.threadId); |
|
}; |
|
|
|
private onUnreadClick = async() => { |
|
const {peerId, dialog} = this; |
|
if(dialog.unread_count) { |
|
if(!this.threadId) { |
|
this.managers.appMessagesManager.markDialogUnread(peerId, true); |
|
} else { |
|
this.managers.appMessagesManager.readHistory(peerId, dialog.top_message, this.threadId); |
|
} |
|
} else if(!this.threadId) { |
|
this.managers.appMessagesManager.markDialogUnread(peerId); |
|
} |
|
}; |
|
|
|
private onDeleteClick = () => { |
|
PopupElement.createPopup(PopupDeleteDialog, this.peerId, undefined, undefined, this.threadId); |
|
}; |
|
}
|
|
|