diff --git a/src/components/emoticonsDropdown.ts b/src/components/emoticonsDropdown.ts index 2fecfdd7..54b947ed 100644 --- a/src/components/emoticonsDropdown.ts +++ b/src/components/emoticonsDropdown.ts @@ -10,6 +10,7 @@ import apiManager from '../lib/mtproto/apiManager'; import CryptoWorker from '../lib/crypto/cryptoworker'; import LazyLoadQueue from "./lazyLoadQueue"; import { MTDocument, wrapSticker } from "./wrappers"; +import appWebpManager from "../lib/appManagers/appWebpManager"; export const EMOTICONSSTICKERGROUP = 'emoticons-dropdown'; @@ -310,7 +311,7 @@ const initEmoticonsDropdown = (pageEl: HTMLDivElement, let thumb = stickerSet.set.thumb; appStickersManager.getStickerSetThumb(stickerSet.set).then(async(blob) => { - if(thumb.w == 1 && thumb.h == 1) { + if(thumb.w == 1 && thumb.h == 1) { // means animated const reader = new FileReader(); reader.addEventListener('loadend', async(e) => { @@ -329,7 +330,8 @@ const initEmoticonsDropdown = (pageEl: HTMLDivElement, reader.readAsArrayBuffer(blob); } else { let image = new Image(); - image.src = URL.createObjectURL(blob); + //image.src = URL.createObjectURL(blob); + appWebpManager.polyfillImage(image, blob); li.append(image); } diff --git a/src/lib/appManagers/appDialogsManager.ts b/src/lib/appManagers/appDialogsManager.ts index d7940250..40b0d820 100644 --- a/src/lib/appManagers/appDialogsManager.ts +++ b/src/lib/appManagers/appDialogsManager.ts @@ -215,7 +215,7 @@ export class AppDialogsManager { if(inUpper.length < hiddenLength) { inUpper.push(dom.listEl); } else if(inViewportIndex <= inViewportLength - 1) { - this.chatList.append(dom.listEl); + chatList.append(dom.listEl); ++inViewportIndex; //this.chatList.insertBefore(dom.listEl, this.chatList.children[inViewportIndex++]); } else { @@ -368,10 +368,6 @@ export class AppDialogsManager { public setUnreadMessages(dialog: any) { let dom = this.getDialogDom(dialog.peerID); - if(dialog.peerID == 228260936) { - console.log('dialog setUnreadMessages', dialog); - } - dom.statusSpan.innerHTML = ''; let lastMessage = appMessagesManager.getMessage(dialog.top_message); if(lastMessage._ != 'messageEmpty' && @@ -380,7 +376,7 @@ export class AppDialogsManager { let outgoing = (lastMessage.pFlags && lastMessage.pFlags.unread) /* && dialog.read_outbox_max_id != 0 */; // maybe uncomment, 31.01.2020 - console.log('outgoing', outgoing, lastMessage); + //console.log('outgoing', outgoing, lastMessage); if(outgoing) { dom.statusSpan.classList.remove('tgico-checks'); diff --git a/src/lib/appManagers/appImManager.ts b/src/lib/appManagers/appImManager.ts index 8fe0c1b5..5d93ce69 100644 --- a/src/lib/appManagers/appImManager.ts +++ b/src/lib/appManagers/appImManager.ts @@ -1,5 +1,5 @@ import apiManager from '../mtproto/apiManager'; -import { $rootScope, isElementInViewport, numberWithCommas, findUpClassName, formatNumber, placeCaretAtEnd, calcImageInBox, findUpTag } from "../utils"; +import { $rootScope, isElementInViewport, numberWithCommas, findUpClassName, formatNumber, placeCaretAtEnd, calcImageInBox, findUpTag, getRichValue, getRichValueWithCaret, getSelectedText } from "../utils"; import appUsersManager from "./appUsersManager"; import appMessagesManager from "./appMessagesManager"; import appPeersManager from "./appPeersManager"; @@ -140,7 +140,7 @@ class ChatInput { this.messageInput.addEventListener('keydown', (e: KeyboardEvent) => { if(e.key == 'Enter') { - if(e.shiftKey) { + if(e.shiftKey || e.ctrlKey) { return; } @@ -201,29 +201,36 @@ class ChatInput { } }); - this.messageInput.addEventListener('copy', (e) => { - const selection = document.getSelection(); - - let range = selection.getRangeAt(0); - let ancestorContainer = range.commonAncestorContainer; - - let str = ''; - - let selectedNodes = Array.from(ancestorContainer.childNodes).slice(range.startOffset, range.endOffset); - if(selectedNodes.length) { - str = this.serializeNodes(selectedNodes); - } else { - str = selection.toString(); - } - - console.log('messageInput copy', str, ancestorContainer.childNodes, range); + if(!RichTextProcessor.emojiSupported) { + this.messageInput.addEventListener('copy', (e) => { + const selection = document.getSelection(); + + let range = selection.getRangeAt(0); + let ancestorContainer = range.commonAncestorContainer; + + let str = ''; + + let selectedNodes = Array.from(ancestorContainer.childNodes).slice(range.startOffset, range.endOffset); + if(selectedNodes.length) { + str = this.serializeNodes(selectedNodes); + } else { + str = selection.toString(); + } + + //console.log('messageInput copy', str, ancestorContainer.childNodes, range); - // @ts-ignore - event.clipboardData.setData('text/plain', str); - event.preventDefault(); - }); + //let str = getRichValueWithCaret(this.messageInput); + //console.log('messageInput childNode copy:', str); + + // @ts-ignore + event.clipboardData.setData('text/plain', str); + event.preventDefault(); + }); + } this.messageInput.addEventListener('paste', (e) => { + //console.log('messageInput paste'); + e.preventDefault(); // @ts-ignore let text = (e.originalEvent || e).clipboardData.getData('text/plain'); @@ -321,11 +328,14 @@ class ChatInput { return; } + //console.log('document paste'); + // @ts-ignore var items = (event.clipboardData || event.originalEvent.clipboardData).items; //console.log('item', event.clipboardData.getData()); for(let i = 0; i < items.length; ++i) { if(items[i].kind == 'file') { + event.preventDefault() event.cancelBubble = true; event.stopPropagation(); @@ -398,16 +408,19 @@ class ChatInput { if(typeof(child) === 'object' && child.textContent) return str += child.textContent; if(child.innerText) return str += child.innerText; - if(child.tagName == 'IMG' && child.classList && child.classList.contains('emoji')) return str += child.getAttribute('emoji'); + if(child.tagName == 'IMG' && child.classList && child.classList.contains('emoji')) return str += child.getAttribute('alt'); return str; }, ''); }; public sendMessage() { - let str = this.serializeNodes(Array.from(this.messageInput.childNodes)); + //let str = this.serializeNodes(Array.from(this.messageInput.childNodes)); + let str = getRichValue(this.messageInput); + + //console.log('childnode str after:', str/* , getRichValue(this.messageInput) */); - //console.log('childnode str after:', str); + //return; this.lastUrl = ''; appMessagesManager.sendText(appImManager.peerID, str, { replyToMsgID: appImManager.replyToMsgID == 0 ? undefined : appImManager.replyToMsgID, @@ -770,6 +783,12 @@ export class AppImManager { return; } + if(e.key == 'Meta' || e.key == 'Control') { + return; + } else if(e.key == 'c' && (e.ctrlKey || e.metaKey) && target.tagName != 'INPUT') { + return; + } + if(e.target != this.chatInputC.messageInput && target.tagName != 'INPUT') { this.chatInputC.messageInput.focus(); placeCaretAtEnd(this.chatInputC.messageInput); @@ -1465,6 +1484,7 @@ export class AppImManager { } public renderMessage(message: any, reverse = false, multipleRender?: boolean, bubble: HTMLDivElement = null) { + this.log('message to render:', message); if(message.deleted) return; let peerID = this.peerID; @@ -1473,8 +1493,6 @@ export class AppImManager { let messageDiv = document.createElement('div'); messageDiv.classList.add('message'); - this.log('message to render:', message); - //messageDiv.innerText = message.message; // bubble @@ -1824,7 +1842,7 @@ export class AppImManager { let originalMessage = appMessagesManager.getMessage(message.reply_to_mid); let originalPeerTitle = appPeersManager.getPeerTitle(originalMessage.fromID) || ''; - this.log('message to render reply', originalMessage, originalPeerTitle, bubble); + this.log('message to render reply', originalMessage, originalPeerTitle, bubble, message); let originalText = ''; if(originalMessage.message) { diff --git a/src/lib/appManagers/appMessagesManager.ts b/src/lib/appManagers/appMessagesManager.ts index 8ebfe99e..e32e83bf 100644 --- a/src/lib/appManagers/appMessagesManager.ts +++ b/src/lib/appManagers/appMessagesManager.ts @@ -62,7 +62,7 @@ export class AppMessagesManager { public maxSeenID = 0; public allDialogsLoaded: {[folder_id: number]: boolean} = {}; - public dialogsOffsetDate = 0; + public dialogsOffsetDate: {[folder_id: number]: number} = {}; public pinnedIndex = 0; public dialogsNum = 0; @@ -73,8 +73,8 @@ export class AppMessagesManager { public newMessagesToHandle: any = {}; public newDialogsHandlePromise = 0; public newDialogsToHandle: any = {}; - public notificationsHandlePromise = 0; - public notificationsToHandle: any = {}; + //public notificationsHandlePromise = 0; + //public notificationsToHandle: any = {}; public newUpdatesAfterReloadToHandle: any = {}; public fwdMessagesPluralize = _('conversation_forwarded_X_messages'); @@ -802,9 +802,9 @@ export class AppMessagesManager { var offsetIndex = 0; var flags = 0; - if(this.dialogsOffsetDate) { - offsetDate = this.dialogsOffsetDate + serverTimeManager.serverTimeOffset; - offsetIndex = this.dialogsOffsetDate * 0x10000; + if(this.dialogsOffsetDate[folderID]) { + offsetDate = this.dialogsOffsetDate[folderID] + serverTimeManager.serverTimeOffset; + offsetIndex = this.dialogsOffsetDate[folderID] * 0x10000; flags |= 1; } @@ -898,7 +898,7 @@ export class AppMessagesManager { return (date * 0x10000) + ((++this.dialogsNum) & 0xFFFF); } - public pushDialogToStorage(dialog: any, offsetDate?: any) { + public pushDialogToStorage(dialog: any, offsetDate?: number) { var dialogs = this.dialogsStorage.dialogs; var pos = this.getDialogByPeerID(dialog.peerID)[1]; if(pos !== undefined) { @@ -907,12 +907,12 @@ export class AppMessagesManager { if(offsetDate && !dialog.pFlags.pinned && - (!this.dialogsOffsetDate || offsetDate < this.dialogsOffsetDate)) { + (!this.dialogsOffsetDate[dialog.folder_id] || offsetDate < this.dialogsOffsetDate[dialog.folder_id])) { if(pos !== undefined) { // So the dialog jumped to the last position return false; } - this.dialogsOffsetDate = offsetDate; + this.dialogsOffsetDate[dialog.folder_id] = offsetDate; } var index = dialog.index; @@ -1092,7 +1092,7 @@ export class AppMessagesManager { if(apiMessage.action) { var migrateFrom; var migrateTo; - switch (apiMessage.action._) { + switch(apiMessage.action._) { case 'messageActionChatEditPhoto': appPhotosManager.savePhoto(apiMessage.action.photo, mediaContext); if(isBroadcast) { @@ -1332,9 +1332,7 @@ export class AppMessagesManager { dialog.top_message = mid; dialog.read_inbox_max_id = appMessagesIDsManager.getFullMessageID(dialog.read_inbox_max_id, channelID); - //peerID == 228260936 && console.log('we get drunk', dialog, dialog.read_outbox_max_id); dialog.read_outbox_max_id = appMessagesIDsManager.getFullMessageID(dialog.read_outbox_max_id, channelID); - //peerID == 228260936 && console.log('we get high', dialog, dialog.read_outbox_max_id); var topDate = message.date; if(channelID) { @@ -1398,11 +1396,11 @@ export class AppMessagesManager { }*/ // WARNING } - public handleNotifications() { + /*public handleNotifications() { clearTimeout(this.notificationsHandlePromise); this.notificationsHandlePromise = 0; - var timeout = $rootScope.idle.isIDLE /* && StatusManager.isOtherDeviceActive() */ ? 30000 : 1000; + var timeout = $rootScope.idle.isIDLE /* && StatusManager.isOtherDeviceActive() * ? 30000 : 1000; Object.keys(this.notificationsToHandle).forEach((key: any) => { let notifyPeerToHandle = this.notificationsToHandle[key]; notifyPeerToHandle.isMutedPromise.then((muted: boolean) => { @@ -1423,9 +1421,9 @@ export class AppMessagesManager { }); this.notificationsToHandle = {}; - } + }*/ - public notifyAboutMessage(message: any, options: any = {}) { + /*public notifyAboutMessage(message: any, options: any = {}) { var peerID = this.getMessagePeer(message); var peerString: string; var notification: any = {}; @@ -1623,7 +1621,7 @@ export class AppMessagesManager { notification.silent = message.pFlags.silent || false if(notificationPhoto.location && !notificationPhoto.location.empty) { - apiFileManager.downloadSmallFile(notificationPhoto.location/* , notificationPhoto.size */) + apiFileManager.downloadSmallFile(notificationPhoto.location/* , notificationPhoto.size *) .then((blob) => { if(message.pFlags.unread) { notification.image = blob @@ -1633,7 +1631,7 @@ export class AppMessagesManager { } else { // NotificationsManager.notify(notification) // warning } - } + }*/ public mergeReplyKeyboard(historyStorage: any, message: any) { // console.log('merge', message.mid, message.reply_markup, historyStorage.reply_markup) @@ -2249,13 +2247,13 @@ export class AppMessagesManager { this.newDialogsHandlePromise = window.setTimeout(this.handleNewDialogs.bind(this), 0); } - if(inboxUnread && + /*if(inboxUnread && ($rootScope.selectedPeerID != peerID || $rootScope.idle.isIDLE)) { var notifyPeer = message.flags & 16 ? message.from_id : peerID; var notifyPeerToHandle = this.notificationsToHandle[notifyPeer]; if(notifyPeerToHandle === undefined) { notifyPeerToHandle = this.notificationsToHandle[notifyPeer] = { - isMutedPromise: Promise.resolve()/* NotificationsManager.getPeerMuted(notifyPeer) */, // WARNING + isMutedPromise: Promise.resolve()/* NotificationsManager.getPeerMuted(notifyPeer), // WARNING fwd_count: 0, from_id: 0 }; @@ -2274,7 +2272,7 @@ export class AppMessagesManager { if(!this.notificationsHandlePromise) { this.notificationsHandlePromise = window.setTimeout(this.handleNotifications.bind(this), 1000); } - } + } */ break; } @@ -3137,6 +3135,8 @@ export class AppMessagesManager { timeout: 300, noErrorBox: true }).then((historyResult: any) => { + console.log('requestHistory result:', historyResult); + appUsersManager.saveApiUsers(historyResult.users); appChatsManager.saveApiChats(historyResult.chats); this.saveMessages(historyResult.messages); diff --git a/src/lib/appManagers/appSidebarLeft.ts b/src/lib/appManagers/appSidebarLeft.ts index 87b09c45..7809a39b 100644 --- a/src/lib/appManagers/appSidebarLeft.ts +++ b/src/lib/appManagers/appSidebarLeft.ts @@ -107,7 +107,12 @@ class AppSidebarLeft { this.savedBtn.addEventListener('click', (e) => { this.log('savedbtn click'); setTimeout(() => { // menu doesn't close if no timeout (lol) - appImManager.setPeer(appImManager.myID); + let dom = appDialogsManager.getDialogDom(appImManager.myID); + if(dom) { + dom.listEl.click(); + } else { + appImManager.setPeer(appImManager.myID); + } }, 0); }); diff --git a/src/lib/appManagers/appStickersManager.ts b/src/lib/appManagers/appStickersManager.ts index c368c109..f4559c34 100644 --- a/src/lib/appManagers/appStickersManager.ts +++ b/src/lib/appManagers/appStickersManager.ts @@ -146,6 +146,10 @@ class appStickersManager { return await promise; } + + public async cleanup() { // if logout + await AppStorage.remove('stickerSets'); + } } export default new appStickersManager(); diff --git a/src/lib/appManagers/appWebPagesManager.ts b/src/lib/appManagers/appWebPagesManager.ts index b8d35f69..f0b80af1 100644 --- a/src/lib/appManagers/appWebPagesManager.ts +++ b/src/lib/appManagers/appWebPagesManager.ts @@ -1,4 +1,4 @@ -import { $rootScope, safeReplaceObject, templateUrl, calcImageInBox, encodeEntities, copy } from "../utils"; +import { $rootScope, safeReplaceObject, calcImageInBox, encodeEntities, copy } from "../utils"; import appPhotosManager from "./appPhotosManager"; import appDocsManager from "./appDocsManager"; import { RichTextProcessor } from "../richtextprocessor"; diff --git a/src/lib/mtproto/apiManager.ts b/src/lib/mtproto/apiManager.ts index 7de46e45..a42db03f 100644 --- a/src/lib/mtproto/apiManager.ts +++ b/src/lib/mtproto/apiManager.ts @@ -75,12 +75,12 @@ export class ApiManager { } return Promise.all(logoutPromises).then(() => { - AppStorage.remove('dc', 'user_auth'); + AppStorage.remove('dc', 'user_auth', 'stickerSets'); this.baseDcID = 0; this.telegramMeNotify(false); return this.mtpClearStorage(); }, (error) => { - storageKeys.push('dc', 'user_auth'); + storageKeys.push('dc', 'user_auth', 'stickerSets'); AppStorage.remove(storageKeys); this.baseDcID = 0; error.handled = true; diff --git a/src/lib/richtextprocessor.js b/src/lib/richtextprocessor.js index 56e4da23..c9635ea6 100644 --- a/src/lib/richtextprocessor.js +++ b/src/lib/richtextprocessor.js @@ -514,9 +514,9 @@ function wrapRichText (text, options = {}) { *///html.push(`${emojiSupported ? encodeEntities(entityText) : inner}\u200B`); //} - inner = ``; + background-size:${emojiData.sizeX}% ${emojiData.sizeY}%">`; //html.push(`${emojiSupported ? encodeEntities(entityText) : inner}\u200B`); @@ -784,7 +784,8 @@ let RichTextProcessor = { parseMarkdown: parseMarkdown, parseEmojis: parseEmojis, mergeEntities: mergeEntities, - getEmojiSpritesheetCoords: getEmojiSpritesheetCoords + getEmojiSpritesheetCoords: getEmojiSpritesheetCoords, + emojiSupported: emojiSupported }; window.RichTextProcessor = RichTextProcessor; diff --git a/src/lib/utils.js b/src/lib/utils.js index 22014f21..4be362f3 100644 --- a/src/lib/utils.js +++ b/src/lib/utils.js @@ -172,12 +172,12 @@ export function getRichValueWithCaret (field) { var selOffset if (sel && sel.rangeCount) { var range = sel.getRangeAt(0) - if (range.startContainer && + /* if (range.startContainer && range.startContainer == range.endContainer && - range.startOffset == range.endOffset) { + range.startOffset == range.endOffset) { */ selNode = range.startContainer selOffset = range.startOffset - } + //} } getRichElementValue(field, lines, line, selNode, selOffset) @@ -312,7 +312,35 @@ export const $rootScope = { } }; -export const _ = (str/* : string */) => str; +export const langPack = { + "messageActionChatCreate": "created the group", + "messageActionChatEditTitle": "changed group name", + "messageActionChatEditPhoto": "changed group photo", + "messageActionChatDeletePhoto": "removed group photo", + "messageActionChatReturn": "returned to group", + "messageActionChatJoined": "joined the group", + "messageActionChatAddUser": "invited {user}", + "messageActionChatAddUsers": "invited {} users", + "messageActionChatLeave": "left group", + "messageActionChatDeleteUser": "removed user", + "messageActionChatJoinedByLink": "joined the group", + "messageActionChannelCreate": "Channel created", + "messageActionChannelEditTitle": "Channel renamed", + "messageActionChannelEditPhoto": "Channel photo updated", + "messageActionChannelDeletePhoto": "Channel photo removed", + "messageActionPinMessage": "pinned message", + + "messageActionPhoneCall.in_ok": "Incoming Call", + "messageActionPhoneCall.out_ok": "Outgoing Call", + "messageActionPhoneCall.in_missed": "Missed Call", + "messageActionPhoneCall.out_missed": "Cancelled Call", +}; + +export const _ = (str/* : string */) => { + str = str.replace('_raw', ''); + + return langPack[str] ? langPack[str] : str; +}; export function isObject(object) { return typeof(object) === 'object' && object !== null; @@ -540,33 +568,6 @@ export function listUniqSorted (list) { return resultList } -export function templateUrl (tplName) { - var forceLayout = { - confirm_modal: 'desktop', - error_modal: 'desktop', - media_modal_layout: 'desktop', - slider: 'desktop', - reply_message: 'desktop', - full_round: 'desktop', - message_body: 'desktop', - message_media: 'desktop', - message_attach_game: 'desktop', - forwarded_messages: 'desktop', - chat_invite_link_modal: 'desktop', - reply_markup: 'desktop', - short_message: 'desktop', - pinned_message: 'desktop', - channel_edit_modal: 'desktop', - megagroup_edit_modal: 'desktop', - inline_results: 'desktop', - composer_dropdown: 'desktop', - peer_pinned_message_bar: 'desktop', - report_msgs_modal: 'desktop' - } - var layout = forceLayout[tplName] || (Config.Mobile ? 'mobile' : 'desktop') - return 'partials/' + layout + '/' + tplName + '.html' -} - export function encodeEntities (value) { return value.replace(/&/g, '&').replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, function (value) { var hi = value.charCodeAt(0)