Browse Source

Fix Alt+ArrowDown shortcut

master
morethanwords 3 years ago
parent
commit
a248f9d74e
  1. 157
      src/lib/appManagers/appImManager.ts

157
src/lib/appManagers/appImManager.ts

@ -43,7 +43,7 @@ import appNavigationController from '../../components/appNavigationController'; @@ -43,7 +43,7 @@ import appNavigationController from '../../components/appNavigationController';
import appNotificationsManager from './appNotificationsManager';
import AppPrivateSearchTab from '../../components/sidebarRight/tabs/search';
import { i18n, LangPackKey } from '../langPack';
import { ChatInvite, SendMessageAction } from '../../layer';
import { ChatInvite, Dialog, SendMessageAction } from '../../layer';
import { hslaStringToHex } from '../../helpers/color';
import { copy, getObjectKeysAndSort } from '../../helpers/object';
import { getFilesFromEvent } from '../../helpers/files';
@ -422,6 +422,89 @@ export class AppImManager { @@ -422,6 +422,89 @@ export class AppImManager {
});
this.onHashChange();
this.attachKeydownListener();
}
private attachKeydownListener() {
const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);
const onKeyDown = (e: KeyboardEvent) => {
if(rootScope.isOverlayActive || IGNORE_KEYS.has(e.key)) return;
const target = e.target as HTMLElement;
//if(target.tagName === 'INPUT') return;
//this.log('onkeydown', e, document.activeElement);
const chat = this.chat;
if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {
return;
} else if(e.altKey && (e.code === 'ArrowUp' || e.code === 'ArrowDown')) {
const folder = appMessagesManager.dialogsStorage.getFolder(rootScope.filterId, true);
let nextDialog: Dialog.dialog;
if(!rootScope.peerId) {
if(e.code === 'ArrowDown') {
nextDialog = folder[0];
}
} else {
const idx = folder.findIndex(dialog => dialog.peerId === rootScope.peerId);
if(idx !== -1) {
const nextIndex = e.code === 'ArrowUp' ? idx - 1 : idx + 1;
nextDialog = folder[nextIndex];
}
}
if(nextDialog) {
this.setPeer(nextDialog.peerId);
}
} else if(e.code === 'ArrowUp') {
if(!chat.input.editMsgId && chat.input.isInputEmpty()) {
const historyStorage = appMessagesManager.getHistoryStorage(chat.peerId, chat.threadId);
const slice = historyStorage.history.slice;
if(slice.isEnd(SliceEnd.Bottom) && slice.length) {
let goodMid: number;
for(const mid of slice) {
const message = chat.getMessage(mid);
const good = this.myId === chat.peerId ? message.fromId === this.myId : message.pFlags.out;
if(good) {
if(appMessagesManager.canEditMessage(chat.getMessage(mid), 'text')) {
goodMid = mid;
break;
}
// * this check will allow editing only last message
//break;
}
}
if(goodMid) {
chat.input.initMessageEditing(goodMid);
cancelEvent(e); // * prevent from scrolling
}
}
} else {
return;
}
} else if(e.code === 'ArrowDown') {
return;
}
if(chat.input.messageInput &&
e.target !== chat.input.messageInput &&
target.tagName !== 'INPUT' &&
!target.hasAttribute('contenteditable') &&
!isTouchSupported &&
(!mediaSizes.isMobile || this.tabId === 1) &&
!this.chat.selection.isSelecting &&
!this.chat.input.recording) {
chat.input.messageInput.focus();
placeCaretAtEnd(chat.input.messageInput);
}
};
document.body.addEventListener('keydown', onKeyDown);
}
private makeLink<T extends INTERNAL_LINK_TYPE>(type: T, uriParams: Omit<InternalLinkTypeMap[T], '_'>) {
@ -792,78 +875,6 @@ export class AppImManager { @@ -792,78 +875,6 @@ export class AppImManager {
private init() {
document.addEventListener('paste', this.onDocumentPaste, true);
const IGNORE_KEYS = new Set(['PageUp', 'PageDown', 'Meta', 'Control']);
const onKeyDown = (e: KeyboardEvent) => {
if(rootScope.isOverlayActive || IGNORE_KEYS.has(e.key)) return;
const target = e.target as HTMLElement;
//if(target.tagName === 'INPUT') return;
//this.log('onkeydown', e, document.activeElement);
const chat = this.chat;
if(e.code === 'KeyC' && (e.ctrlKey || e.metaKey) && target.tagName !== 'INPUT') {
return;
} else if(e.altKey && (e.code === 'ArrowUp' || e.code === 'ArrowDown') && rootScope.peerId) {
const folder = appMessagesManager.dialogsStorage.getFolder(rootScope.filterId, true);
const idx = folder.findIndex(dialog => dialog.peerId === rootScope.peerId);
if(idx !== -1) {
const nextIndex = e.code === 'ArrowUp' ? idx - 1 : idx + 1;
const nextDialog = folder[nextIndex];
if(nextDialog) {
this.setPeer(nextDialog.peerId);
}
}
} else if(e.code === 'ArrowUp') {
if(!chat.input.editMsgId && chat.input.isInputEmpty()) {
const historyStorage = appMessagesManager.getHistoryStorage(chat.peerId, chat.threadId);
const slice = historyStorage.history.slice;
if(slice.isEnd(SliceEnd.Bottom) && slice.length) {
let goodMid: number;
for(const mid of slice) {
const message = chat.getMessage(mid);
const good = this.myId === chat.peerId ? message.fromId === this.myId : message.pFlags.out;
if(good) {
if(appMessagesManager.canEditMessage(chat.getMessage(mid), 'text')) {
goodMid = mid;
break;
}
// * this check will allow editing only last message
//break;
}
}
if(goodMid) {
chat.input.initMessageEditing(goodMid);
cancelEvent(e); // * prevent from scrolling
}
}
} else {
return;
}
} else if(e.code === 'ArrowDown') {
return;
}
if(chat.input.messageInput &&
e.target !== chat.input.messageInput &&
target.tagName !== 'INPUT' &&
!target.hasAttribute('contenteditable') &&
!isTouchSupported &&
(!mediaSizes.isMobile || this.tabId === 1) &&
!this.chat.selection.isSelecting &&
!this.chat.input.recording) {
chat.input.messageInput.focus();
placeCaretAtEnd(chat.input.messageInput);
}
};
document.body.addEventListener('keydown', onKeyDown);
rootScope.addEventListener('history_multiappend', (msgIdsByPeer) => {
for(const peerId in msgIdsByPeer) {
appSidebarRight.sharedMediaTab.renderNewMessages(+peerId, Array.from(msgIdsByPeer[peerId]));

Loading…
Cancel
Save