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)