diff --git a/src/components/chat/bubbles.ts b/src/components/chat/bubbles.ts index 3b94087b..c2a3a6d1 100644 --- a/src/components/chat/bubbles.ts +++ b/src/components/chat/bubbles.ts @@ -1559,7 +1559,7 @@ export default class ChatBubbles { messageDiv.innerHTML = richText; } - const timeSpan = MessageRender.setTime(message, bubble, bubbleContainer, messageDiv); + const timeSpan = MessageRender.setTime(this.chat, message, bubble, bubbleContainer, messageDiv); bubbleContainer.prepend(messageDiv); //bubble.prepend(timeSpan, messageDiv); // that's bad diff --git a/src/components/chat/messageRender.ts b/src/components/chat/messageRender.ts index a550584f..8105970d 100644 --- a/src/components/chat/messageRender.ts +++ b/src/components/chat/messageRender.ts @@ -1,7 +1,7 @@ import { getFullDate } from "../../helpers/date"; import { formatNumber } from "../../helpers/number"; -import appImManager from "../../lib/appManagers/appImManager"; import RichTextProcessor from "../../lib/richtextprocessor"; +import Chat from "./chat"; type Message = any; @@ -10,7 +10,7 @@ export namespace MessageRender { }; */ - export const setTime = (message: Message, bubble: HTMLElement, bubbleContainer: HTMLElement, messageDiv: HTMLElement) => { + export const setTime = (chat: Chat, message: Message, bubble: HTMLElement, bubbleContainer: HTMLElement, messageDiv: HTMLElement) => { const date = new Date(message.date * 1000); let time = ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2); @@ -40,7 +40,7 @@ export namespace MessageRender { time = 'edited ' + time; } - if(appImManager.chat.type != 'pinned' && message.pFlags.pinned) { + if(chat.type != 'pinned' && message.pFlags.pinned) { bubble.classList.add('is-pinned'); time = '' + time; } diff --git a/src/components/chat/topbar.ts b/src/components/chat/topbar.ts index 90167fc1..61f55790 100644 --- a/src/components/chat/topbar.ts +++ b/src/components/chat/topbar.ts @@ -17,6 +17,7 @@ import ChatSearch from "./search"; import { ButtonMenuItemOptions } from "../buttonMenu"; import ListenerSetter from "../../helpers/listenerSetter"; import appStateManager from "../../lib/appManagers/appStateManager"; +import PopupDeleteDialog from "../popups/deleteDialog"; export default class ChatTopbar { container: HTMLDivElement; @@ -100,6 +101,9 @@ export default class ChatTopbar { this.menuButtons.forEach(button => { button.element.classList.toggle('hide', !button.verify()); }); + + // delete button + this.menuButtons[this.menuButtons.length - 1].element.firstChild.nodeValue = this.appPeersManager.getDeleteButtonText(this.peerId); }); } @@ -185,7 +189,7 @@ export default class ChatTopbar { onClick: () => { this.chat.selection.toggleSelection(true, true); }, - verify: () => !this.chat.selection.isSelecting + verify: () => !this.chat.selection.isSelecting && !!Object.keys(this.chat.bubbles.bubbles).length }, { icon: 'select', text: 'Clear Selection', @@ -195,9 +199,11 @@ export default class ChatTopbar { verify: () => this.chat.selection.isSelecting }, { icon: 'delete danger', - text: 'Delete and Leave', - onClick: () => {}, - verify: () => true + text: 'Delete', + onClick: () => { + new PopupDeleteDialog(this.peerId); + }, + verify: () => !!this.appMessagesManager.getDialogByPeerId(this.peerId)[0] }]; this.btnPinned = ButtonIcon('pinlist'); diff --git a/src/components/dialogsContextMenu.ts b/src/components/dialogsContextMenu.ts index fb2bf5fe..5a95ed95 100644 --- a/src/components/dialogsContextMenu.ts +++ b/src/components/dialogsContextMenu.ts @@ -8,13 +8,13 @@ import { positionMenu, openBtnMenu } from "./misc"; import { PopupButton } from "./popups"; import PopupPeer from "./popups/peer"; import ButtonMenu, { ButtonMenuItemOptions } from "./buttonMenu"; +import PopupDeleteDialog from "./popups/deleteDialog"; export default class DialogsContextMenu { private element: HTMLElement; private buttons: (ButtonMenuItemOptions & {verify: () => boolean})[]; private selectedId: number; - private peerType: 'channel' | 'chat' | 'megagroup' | 'group' | 'saved'; private filterId: number; private dialog: Dialog; @@ -117,96 +117,7 @@ export default class DialogsContextMenu { }; private onDeleteClick = () => { - let firstName = appPeersManager.getPeerTitle(this.selectedId, false, true); - - let callbackFlush = (justClear?: true) => { - appMessagesManager.flushHistory(this.selectedId, justClear); - }; - - let callbackLeave = () => { - appChatsManager.leave(-this.selectedId); - }; - - let title: string, description: string, buttons: PopupButton[]; - switch(this.peerType) { - case 'channel': { - title = 'Leave Channel?'; - description = `Are you sure you want to leave this channel?`; - buttons = [{ - text: 'LEAVE ' + firstName, - isDanger: true, - callback: callbackLeave - }]; - - break; - } - - case 'megagroup': { - title = 'Leave Group?'; - description = `Are you sure you want to leave this group?`; - buttons = [{ - text: 'LEAVE ' + firstName, - isDanger: true, - callback: callbackLeave - }]; - - break; - } - - case 'chat': { - title = 'Delete Chat?'; - description = `Are you sure you want to delete chat with ${firstName}?`; - buttons = [{ - text: 'DELETE FOR ME AND ' + firstName, - isDanger: true, - callback: () => callbackFlush() - }, { - text: 'DELETE JUST FOR ME', - isDanger: true, - callback: () => callbackFlush(true) - }]; - - break; - } - - case 'saved': { - title = 'Delete Saved Messages?'; - description = `Are you sure you want to delete all your saved messages?`; - buttons = [{ - text: 'DELETE SAVED MESSAGES', - isDanger: true, - callback: () => callbackFlush() - }]; - - break; - } - - case 'group': { - title = 'Delete and leave Group?'; - description = `Are you sure you want to delete all message history and leave ${firstName}?`; - buttons = [{ - text: 'DELETE AND LEAVE ' + firstName, - isDanger: true, - callback: () => callbackLeave() - }]; - - break; - } - } - - buttons.push({ - text: 'CANCEL', - isCancel: true - }); - - let popup = new PopupPeer('popup-delete-chat', { - peerId: this.selectedId, - title: title, - description: description, - buttons: buttons - }); - - popup.show(); + new PopupDeleteDialog(this.selectedId); }; onContextMenu = (e: MouseEvent | Touch) => { @@ -241,25 +152,7 @@ export default class DialogsContextMenu { }); // delete button - let deleteButtonText = ''; - if(appPeersManager.isMegagroup(this.selectedId)) { - deleteButtonText = 'Leave'; - //deleteButtonText = 'Leave group'; - this.peerType = 'megagroup'; - } else if(appPeersManager.isChannel(this.selectedId)) { - deleteButtonText = 'Leave'; - //deleteButtonText = 'Leave channel'; - this.peerType = 'channel'; - } else if(this.selectedId < 0) { - deleteButtonText = 'Delete'; - //deleteButtonText = 'Delete and leave'; - this.peerType = 'group'; - } else { - deleteButtonText = 'Delete'; - //deleteButtonText = 'Delete chat'; - this.peerType = this.selectedId == rootScope.myId ? 'saved' : 'chat'; - } - this.buttons[this.buttons.length - 1].element.firstChild.nodeValue = deleteButtonText; + this.buttons[this.buttons.length - 1].element.firstChild.nodeValue = appPeersManager.getDeleteButtonText(this.selectedId); li.classList.add('menu-open'); positionMenu(e, this.element); diff --git a/src/components/popups/deleteDialog.ts b/src/components/popups/deleteDialog.ts new file mode 100644 index 00000000..c6362567 --- /dev/null +++ b/src/components/popups/deleteDialog.ts @@ -0,0 +1,100 @@ +import { PopupButton } from "."; +import appChatsManager from "../../lib/appManagers/appChatsManager"; +import appMessagesManager from "../../lib/appManagers/appMessagesManager"; +import appPeersManager, { PeerType } from "../../lib/appManagers/appPeersManager"; +import PopupPeer from "./peer"; + +export default class PopupDeleteDialog { + constructor(peerId: number, peerType: PeerType = appPeersManager.getDialogType(peerId)) { + let firstName = appPeersManager.getPeerTitle(peerId, false, true); + + let callbackFlush = (justClear?: true) => { + appMessagesManager.flushHistory(peerId, justClear); + }; + + let callbackLeave = () => { + appChatsManager.leave(-peerId); + }; + + let title: string, description: string, buttons: PopupButton[]; + switch(peerType) { + case 'channel': { + title = 'Leave Channel?'; + description = `Are you sure you want to leave this channel?`; + buttons = [{ + text: 'LEAVE ' + firstName, + isDanger: true, + callback: callbackLeave + }]; + + break; + } + + case 'megagroup': { + title = 'Leave Group?'; + description = `Are you sure you want to leave this group?`; + buttons = [{ + text: 'LEAVE ' + firstName, + isDanger: true, + callback: callbackLeave + }]; + + break; + } + + case 'chat': { + title = 'Delete Chat?'; + description = `Are you sure you want to delete chat with ${firstName}?`; + buttons = [{ + text: 'DELETE FOR ME AND ' + firstName, + isDanger: true, + callback: () => callbackFlush() + }, { + text: 'DELETE JUST FOR ME', + isDanger: true, + callback: () => callbackFlush(true) + }]; + + break; + } + + case 'saved': { + title = 'Delete Saved Messages?'; + description = `Are you sure you want to delete all your saved messages?`; + buttons = [{ + text: 'DELETE SAVED MESSAGES', + isDanger: true, + callback: () => callbackFlush() + }]; + + break; + } + + case 'group': { + title = 'Delete and leave Group?'; + description = `Are you sure you want to delete all message history and leave ${firstName}?`; + buttons = [{ + text: 'DELETE AND LEAVE ' + firstName, + isDanger: true, + callback: () => callbackLeave() + }]; + + break; + } + } + + buttons.push({ + text: 'CANCEL', + isCancel: true + }); + + let popup = new PopupPeer('popup-delete-chat', { + peerId, + title, + description, + buttons + }); + + popup.show(); + } +} \ No newline at end of file diff --git a/src/lib/appManagers/appDialogsManager.ts b/src/lib/appManagers/appDialogsManager.ts index c60a791d..b971d7a6 100644 --- a/src/lib/appManagers/appDialogsManager.ts +++ b/src/lib/appManagers/appDialogsManager.ts @@ -8,7 +8,6 @@ import Scrollable, { ScrollableX, SliceSides, SliceSidesContainer } from "../../ import appSidebarLeft from "../../components/sidebarLeft"; import { formatDateAccordingToToday } from "../../helpers/date"; import { escapeRegExp } from "../../helpers/string"; -import { isTouchSupported } from "../../helpers/touchSupport"; import { isApple, isSafari } from "../../helpers/userAgent"; import { logger, LogLevels } from "../logger"; import { RichTextProcessor } from "../richtextprocessor"; @@ -621,7 +620,7 @@ export class AppDialogsManager { if(this.loadDialogsPromise/* || 1 == 1 */) return this.loadDialogsPromise; - const promise = new Promise(async(resolve, reject) => { + const promise = new Promise(async(resolve, reject) => { if(!this.chatList.childElementCount) { const container = this.chatList.parentElement; container.append(this.chatsPreloader); diff --git a/src/lib/appManagers/appPeersManager.ts b/src/lib/appManagers/appPeersManager.ts index e1727af5..59c293e8 100644 --- a/src/lib/appManagers/appPeersManager.ts +++ b/src/lib/appManagers/appPeersManager.ts @@ -22,6 +22,7 @@ const DialogColorsFg = ['#c03d33', '#4fad2d', '#d09306', '#168acd', '#8544d6', ' const DialogColors = ['#e17076', '#7bc862', '#e5ca77', '#65AADD', '#a695e7', '#ee7aae', '#6ec9cb', '#faa774']; const DialogColorsMap = [0, 7, 4, 1, 6, 3, 5]; +export type PeerType = 'channel' | 'chat' | 'megagroup' | 'group' | 'saved'; export class AppPeersManager { /* public savePeerInstance(peerId: number, instance: any) { if(peerId < 0) appChatsManager.saveApiChat(instance); @@ -228,6 +229,29 @@ export class AppPeersManager { } return text; } + + public getDialogType(peerId: number): PeerType { + if(appPeersManager.isMegagroup(peerId)) { + return 'megagroup'; + } else if(appPeersManager.isChannel(peerId)) { + return 'channel'; + } else if(peerId < 0) { + return 'group'; + } else { + return peerId == rootScope.myId ? 'saved' : 'chat'; + } + } + + public getDeleteButtonText(peerId: number) { + switch(this.getDialogType(peerId)) { + case 'megagroup': + case 'channel': + return 'Leave'; + + default: + return 'Delete'; + } + } } const appPeersManager = new AppPeersManager(); diff --git a/src/pages/pagePassword.ts b/src/pages/pagePassword.ts index d9eb974d..647c99ed 100644 --- a/src/pages/pagePassword.ts +++ b/src/pages/pagePassword.ts @@ -43,10 +43,12 @@ let onFirstMount = (): Promise => { let handleError = (err: any) => { btnNext.removeAttribute('disabled'); + passwordInput.classList.add('error'); switch(err.type) { default: - btnNext.innerText = err.type; + //btnNext.innerText = err.type; + btnNext.innerText = 'INVALID PASSWORD'; break; } @@ -111,6 +113,7 @@ let onFirstMount = (): Promise => { passwordInput.addEventListener('keypress', function(this, e) { this.classList.remove('error'); + btnNext.innerText = 'NEXT'; if(e.key == 'Enter') { return btnNext.click();