Skip to content

Commit 3eb3bec

Browse files
committed
Fix menu bar items: Attach Files, New Conversation, Create Channel, and View menu navigation
1 parent bfc74ef commit 3eb3bec

2 files changed

Lines changed: 73 additions & 108 deletions

File tree

source/browser.ts

Lines changed: 62 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -39,72 +39,6 @@ async function withMenu(
3939
}
4040
}
4141

42-
async function isNewSidebar(): Promise<boolean> {
43-
// Facebook.com/messages always uses the new sidebar design
44-
// This function is kept for backwards compatibility
45-
return true;
46-
}
47-
48-
async function withSettingsMenu(callback: () => Promise<void> | void): Promise<void> {
49-
// Wait for navigation pane buttons to show up
50-
const settingsMenu = await elementReady(selectors.userMenuNewSidebar, {stopOnDomReady: false});
51-
52-
await withMenu(settingsMenu as HTMLElement, callback);
53-
}
54-
55-
async function selectMenuItem(itemNumber: number): Promise<void> {
56-
let selector;
57-
58-
// Wait for menu to show up
59-
await elementReady(selectors.conversationMenuSelectorNewDesign, {stopOnDomReady: false});
60-
61-
const items = document.querySelectorAll<HTMLElement>(
62-
`${selectors.conversationMenuSelectorNewDesign} [role=menuitem]`,
63-
);
64-
65-
// Negative items will select from the end
66-
if (itemNumber < 0) {
67-
selector = -itemNumber <= items.length ? items[items.length + itemNumber] : null;
68-
} else {
69-
selector = itemNumber <= items.length ? items[itemNumber - 1] : null;
70-
}
71-
72-
if (selector) {
73-
selector.click();
74-
}
75-
}
76-
77-
async function selectOtherListViews(itemNumber: number): Promise<void> {
78-
// In case one of other views is shown
79-
clickBackButton();
80-
81-
const newSidebar = await isNewSidebar();
82-
83-
if (newSidebar) {
84-
const items = document.querySelectorAll<HTMLElement>(
85-
`${selectors.viewsMenu} span > a`,
86-
);
87-
88-
const selector = itemNumber <= items.length ? items[itemNumber - 1] : null;
89-
90-
if (selector) {
91-
selector.click();
92-
}
93-
} else {
94-
await withSettingsMenu(() => {
95-
selectMenuItem(itemNumber);
96-
});
97-
}
98-
}
99-
100-
function clickBackButton(): void {
101-
const backButton = document.querySelector<HTMLElement>('._30yy._2oc9');
102-
103-
if (backButton) {
104-
backButton.click();
105-
}
106-
}
107-
10842
ipc.answerMain('show-preferences', async () => {
10943
if (isPreferencesOpen()) {
11044
return;
@@ -114,11 +48,21 @@ ipc.answerMain('show-preferences', async () => {
11448
});
11549

11650
ipc.answerMain('new-conversation', async () => {
117-
document.querySelector<HTMLElement>('[href="/new/"]')!.click();
51+
document.querySelector<HTMLElement>('[aria-label="New message"]')!.click();
11852
});
11953

120-
ipc.answerMain('new-room', async () => {
121-
document.querySelector<HTMLElement>('.x16n37ib .x1i10hfl.x6umtig.x1b1mbwd.xaqea5y.xav7gou.x1ypdohk.xe8uvvx.xdj266r.x11i5rnm.xat24cr.x1mh8g0r.x16tdsg8.x1hl2dhg.xggy1nq.x87ps6o.x1lku1pv.x1a2a7pz.x6s0dn4.x14yjl9h.xudhj91.x18nykt9.xww2gxu.x972fbf.xcfux6l.x1qhh985.xm0m39n.x9f619.x78zum5.xl56j7k.xexx8yu.x4uap5.x18d9i69.xkhd6sd.x1n2onr6.xc9qbxq.x14qfxbe.x1qhmfi1')!.click();
54+
ipc.answerMain('create-channel', async () => {
55+
// Click "New message" button to open the dialog
56+
document.querySelector<HTMLElement>('[aria-label="New message"]')!.click();
57+
58+
// Wait for the "Create channel" element to appear
59+
const createChannelElement = await elementReady<HTMLElement>('#newBroadcastChannel div', {
60+
stopOnDomReady: false,
61+
});
62+
63+
if (createChannelElement) {
64+
createChannelElement.click();
65+
}
12266
});
12367

12468
ipc.answerMain('log-out', async () => {
@@ -193,7 +137,7 @@ ipc.answerMain('insert-sticker', () => {
193137
});
194138

195139
ipc.answerMain('attach-files', () => {
196-
document.querySelector<HTMLElement>('[aria-label="Attach a file up to 25 MB"]')!.click();
140+
document.querySelector<HTMLElement>('[aria-label^="Attach a file"]')!.click();
197141
});
198142

199143
ipc.answerMain('focus-text-input', () => {
@@ -323,20 +267,57 @@ ipc.answerMain('toggle-message-buttons', async () => {
323267
document.body.classList.toggle('show-message-buttons', !showMessageButtons);
324268
});
325269

326-
ipc.answerMain('show-chats-view', async () => {
327-
await selectOtherListViews(1);
328-
});
270+
async function openSettingsMenuAndClickItem(
271+
menuItemText: string,
272+
options?: {useExactMatch?: boolean; waitForSelector?: string},
273+
): Promise<void> {
274+
// Click the Settings button
275+
const settingsButton = document.querySelector<HTMLElement>(selectors.userMenuNewSidebar);
276+
if (!settingsButton) {
277+
return;
278+
}
279+
280+
settingsButton.click();
281+
282+
// Wait for the menu to appear
283+
await elementReady(selectors.conversationMenuSelectorNewDesign, {stopOnDomReady: false});
284+
285+
// Find and click the menu item
286+
const menuItems = document.querySelectorAll<HTMLElement>(
287+
`${selectors.conversationMenuSelectorNewDesign} [role="menuitem"]`,
288+
);
289+
290+
for (const item of menuItems) {
291+
const text = item.textContent?.trim();
292+
const matches = options?.useExactMatch ? text === menuItemText : text?.includes(menuItemText);
293+
294+
if (matches) {
295+
item.click();
296+
break;
297+
}
298+
}
299+
300+
// Optionally wait for something to appear after clicking
301+
if (options?.waitForSelector) {
302+
await elementReady(options.waitForSelector, {stopOnDomReady: false});
303+
}
304+
}
329305

330-
ipc.answerMain('show-marketplace-view', async () => {
331-
await selectOtherListViews(2);
306+
ipc.answerMain('show-chats-view', async () => {
307+
// Navigate to main messages page
308+
window.location.href = '/messages';
332309
});
333310

334311
ipc.answerMain('show-requests-view', async () => {
335-
await selectOtherListViews(3);
312+
await openSettingsMenuAndClickItem('Message requests', {useExactMatch: true});
336313
});
337314

338315
ipc.answerMain('show-archive-view', async () => {
339-
await selectOtherListViews(4);
316+
await openSettingsMenuAndClickItem('Archived chats', {useExactMatch: true});
317+
});
318+
319+
ipc.answerMain('show-restricted-view', async () => {
320+
await openSettingsMenuAndClickItem('Restricted accounts', {useExactMatch: true});
340321
});
341322

342323
ipc.answerMain('toggle-video-autoplay', () => {
@@ -704,26 +685,10 @@ async function deleteSelectedConversation(): Promise<void> {
704685
}
705686

706687
async function openPreferences(): Promise<void> {
707-
// Click the Settings button to open the menu
708-
const settingsButton = document.querySelector<HTMLElement>(selectors.userMenuNewSidebar);
709-
settingsButton?.click();
710-
711-
// Wait for the menu to appear
712-
await elementReady(selectors.conversationMenuSelectorNewDesign, {stopOnDomReady: false});
713-
714-
// Find and click the "Preferences" menu item by its text content
715-
const menuItems = document.querySelectorAll<HTMLElement>(
716-
`${selectors.conversationMenuSelectorNewDesign} [role=menuitem]`,
717-
);
718-
719-
for (const item of menuItems) {
720-
if (item.textContent?.includes('Preferences')) {
721-
item.click();
722-
break;
723-
}
724-
}
725-
726-
await elementReady(selectors.preferencesSelector, {stopOnDomReady: false});
688+
await openSettingsMenuAndClickItem('Preferences', {
689+
useExactMatch: false,
690+
waitForSelector: selectors.preferencesSelector,
691+
});
727692
}
728693

729694
function isPreferencesOpen(): boolean {

source/menu.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ export default async function updateMenu(): Promise<Menu> {
3838
},
3939
};
4040

41-
const newRoomItem: MenuItemConstructorOptions = {
42-
label: 'New Room',
41+
const newChannelItem: MenuItemConstructorOptions = {
42+
label: 'Create Channel',
4343
accelerator: 'CommandOrControl+O',
4444
click() {
45-
sendAction('new-room');
45+
sendAction('create-channel');
4646
},
4747
};
4848

@@ -553,12 +553,6 @@ Press Command/Ctrl+R in Caprine to see your changes.
553553
sendAction('show-chats-view');
554554
},
555555
},
556-
{
557-
label: 'Show Marketplace Chats',
558-
click() {
559-
sendAction('show-marketplace-view');
560-
},
561-
},
562556
{
563557
label: 'Show Message Requests',
564558
click() {
@@ -571,6 +565,12 @@ Press Command/Ctrl+R in Caprine to see your changes.
571565
sendAction('show-archive-view');
572566
},
573567
},
568+
{
569+
label: 'Show Restricted Accounts',
570+
click() {
571+
sendAction('show-restricted-view');
572+
},
573+
},
574574
];
575575

576576
const spellCheckerSubmenu: MenuItemConstructorOptions[] = getSpellCheckerLanguages();
@@ -783,7 +783,7 @@ ${debugInfo()}`;
783783
role: 'fileMenu',
784784
submenu: [
785785
newConversationItem,
786-
newRoomItem,
786+
newChannelItem,
787787
{
788788
type: 'separator',
789789
},
@@ -817,7 +817,7 @@ ${debugInfo()}`;
817817
role: 'fileMenu',
818818
submenu: [
819819
newConversationItem,
820-
newRoomItem,
820+
newChannelItem,
821821
{
822822
type: 'separator',
823823
},

0 commit comments

Comments
 (0)