Skip to content

Commit 834ff11

Browse files
Merge pull request #520 from H7GhosT/fix/delayed-submenu-opening
Fix opening submenu when there is a delay
2 parents 010aa28 + 17ea24a commit 834ff11

File tree

5 files changed

+43
-16
lines changed

5 files changed

+43
-16
lines changed

src/components/chat/contextMenu.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ import {getFullDate} from '../../helpers/date/getFullDate';
8181
import PaidMessagesInterceptor, {PAYMENT_REJECTED} from './paidMessagesInterceptor';
8282
import {MySponsoredPeer} from '../../lib/appManagers/appChatsManager';
8383
import {PopupChecklist} from '../popups/checklist';
84-
import createSubmenuTrigger from '../createSubmenuTrigger';
84+
import createSubmenuTrigger, {CreateSubmenuArgs} from '../createSubmenuTrigger';
8585
import noop from '../../helpers/noop';
8686
import {isSensitive} from '../../helpers/restrictions';
8787
import {hasSensitiveSpoiler} from '../wrappers/mediaSpoiler';
@@ -998,7 +998,7 @@ export default class ChatContextMenu {
998998
}];
999999
}
10001000

1001-
private createChecklistItemSubmenu = async() => {
1001+
private createChecklistItemSubmenu = async({middleware}: CreateSubmenuArgs) => {
10021002
const {item, completion} = this.checklistItem;
10031003
const message = this.message as Message.message & {media: MessageMedia.messageMediaToDo};
10041004
const canEdit = await this.managers.appMessagesManager.canEditMessage(message, 'text');
@@ -1058,10 +1058,14 @@ export default class ChatContextMenu {
10581058
});
10591059
}
10601060
}
1061-
]
1061+
];
1062+
1063+
const filteredButtons = await filterAsync(buttons, (button) => button.verify?.() ?? true);
1064+
1065+
if(!middleware()) return;
10621066

10631067
return ButtonMenu({
1064-
buttons: await filterAsync(buttons, (button) => button.verify?.() ?? true)
1068+
buttons: filteredButtons
10651069
})
10661070
}
10671071

src/components/createSubmenuTrigger.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {CLICK_EVENT_NAME} from '../helpers/dom/clickEvent';
2+
import {getMiddleware, Middleware, MiddlewareHelper} from '../helpers/middleware';
23
import noop from '../helpers/noop';
34
import pause from '../helpers/schedulers/pause';
45
import {i18n} from '../lib/langPack';
@@ -9,14 +10,22 @@ import Icon from './icon';
910

1011
let submenuHelperIdSeed = 0;
1112

13+
export type CreateSubmenuArgs = {
14+
middleware: Middleware;
15+
};
16+
1217
export default function createSubmenuTrigger(
1318
options: Pick<ButtonMenuItemOptionsVerifiable, 'text' | 'regularText' | 'icon' | 'verify' | 'separator' | 'separatorDown' | 'onClose'>,
14-
createSubmenu: () => MaybePromise<HTMLElement>
19+
createSubmenu: (args: CreateSubmenuArgs) => MaybePromise<HTMLElement>
1520
) {
16-
let isDisabled = false;
21+
let
22+
isDisabled = false,
23+
currentMiddleware: MiddlewareHelper
24+
;
1725

1826
const onOpen = () => {
1927
if(!menuBtnOptions.element) return;
28+
currentMiddleware = getMiddleware();
2029

2130
menuBtnOptions.element.addEventListener(CLICK_EVENT_NAME, (e) => {
2231
e.stopPropagation();
@@ -26,7 +35,7 @@ export default function createSubmenuTrigger(
2635
attachFloatingButtonMenu({
2736
element: menuBtnOptions.element,
2837
direction: 'right-start',
29-
createMenu: createSubmenu,
38+
createMenu: () => createSubmenu({middleware: currentMiddleware.get()}),
3039
offset: [-5, -5],
3140
level: 2,
3241
triggerEvent: 'mouseenter',
@@ -36,6 +45,7 @@ export default function createSubmenuTrigger(
3645
};
3746

3847
const onClose = async() => {
48+
currentMiddleware?.destroy();
3949
// Prevents hover from triggering when the menu is closing
4050
isDisabled = true;
4151
await pause(200);

src/components/dialogsContextMenu.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,9 @@ import createContextMenu from '../helpers/dom/createContextMenu';
2222
import PopupElement from './popups';
2323
import cancelEvent from '../helpers/dom/cancelEvent';
2424
import IS_SHARED_WORKER_SUPPORTED from '../environment/sharedWorkerSupport';
25-
import wrapEmojiText from '../lib/richTextProcessor/wrapEmojiText';
2625
import appImManager from '../lib/appManagers/appImManager';
27-
import assumeType from '../helpers/assumeType';
2826
import {isDialog, isForumTopic, isMonoforumDialog, isSavedDialog} from '../lib/appManagers/utils/dialogs/isDialog';
29-
import createSubmenuTrigger from './createSubmenuTrigger';
27+
import createSubmenuTrigger, {CreateSubmenuArgs} from './createSubmenuTrigger';
3028
import type AddToFolderDropdownMenu from './addToFolderDropdownMenu';
3129
import memoizeAsyncWithTTL from '../helpers/memoizeAsyncWithTTL';
3230
import {MonoforumDialog} from '../lib/storages/monoforumDialogs';
@@ -240,15 +238,19 @@ export default class DialogsContextMenu {
240238
return this.buttons = this.buttons.filter(Boolean);
241239
}
242240

243-
private createAddToFolderSubmenu = async() => {
241+
private createAddToFolderSubmenu = async({middleware}: CreateSubmenuArgs) => {
244242
if(!isDialog(this.dialog)) return;
245243

246244
const {default: AddToFolderDropdownMenu, fetchDialogFilters} = await import('./addToFolderDropdownMenu');
247245

246+
const filters = await fetchDialogFilters();
247+
248+
if(!middleware()) return;
249+
248250
const menu = new AddToFolderDropdownMenu;
249251
menu.feedProps({
250252
dialog: this.dialog,
251-
filters: await fetchDialogFilters(),
253+
filters,
252254
currentFilter: () => appDialogsManager.filterId,
253255
onNewDialog: (dialog) => {
254256
this.dialog = dialog;

src/components/floatingButtonMenu.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,16 @@ export default function attachFloatingButtonMenu({
3030

3131
const triggerBcr = element.getBoundingClientRect();
3232

33-
const menu = await createMenu();
33+
let menu: HTMLElement;
34+
try {
35+
menu = await createMenu();
36+
} catch{}
37+
38+
if(!menu) {
39+
opened = false;
40+
onCloseArg?.();
41+
return;
42+
}
3443

3544
const onClose = async() => {
3645
opened = false;

src/components/sidebarLeft/index.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ import DeferredIsUsingPasscode from '../../lib/passcode/deferredIsUsingPasscode'
9999
import EncryptionKeyStore from '../../lib/passcode/keyStore';
100100
import createLockButton from './lockButton';
101101
import {MAX_SIDEBAR_WIDTH, MIN_SIDEBAR_WIDTH, SIDEBAR_COLLAPSE_FACTOR} from './constants';
102-
import createSubmenuTrigger from '../createSubmenuTrigger';
102+
import createSubmenuTrigger, {CreateSubmenuArgs} from '../createSubmenuTrigger';
103103
import ChatTypeMenu from '../chatTypeMenu';
104104
import {RequestHistoryOptions} from '../../lib/appManagers/appMessagesManager';
105105
import EmptySearchPlaceholder from '../emptySearchPlaceholder';
@@ -734,7 +734,7 @@ export class AppSidebarLeft extends SidebarSlider {
734734
const moreSubmenu = createSubmenuTrigger({
735735
text: 'MultiAccount.More',
736736
icon: 'more'
737-
}, () => this.createMoreSubmenu(moreSubmenu, closeTabsBefore));
737+
}, (args) => this.createMoreSubmenu(args, closeTabsBefore));
738738

739739
const newSubmenu = createSubmenuTrigger({
740740
text: 'CreateANew',
@@ -963,7 +963,7 @@ export class AppSidebarLeft extends SidebarSlider {
963963

964964

965965
private async createMoreSubmenu(
966-
submenu: ReturnType<typeof createSubmenuTrigger>,
966+
{middleware}: CreateSubmenuArgs,
967967
closeTabsBefore: (clb: () => void) => void
968968
) {
969969
const toggleTheme = () => {
@@ -1089,6 +1089,8 @@ export class AppSidebarLeft extends SidebarSlider {
10891089

10901090
initAnimationsToggleIcon();
10911091

1092+
if(!middleware()) return;
1093+
10921094
return menu;
10931095
}
10941096

0 commit comments

Comments
 (0)