@@ -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-
10842ipc . answerMain ( 'show-preferences' , async ( ) => {
10943 if ( isPreferencesOpen ( ) ) {
11044 return ;
@@ -114,11 +48,21 @@ ipc.answerMain('show-preferences', async () => {
11448} ) ;
11549
11650ipc . 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
12468ipc . answerMain ( 'log-out' , async ( ) => {
@@ -193,7 +137,7 @@ ipc.answerMain('insert-sticker', () => {
193137} ) ;
194138
195139ipc . 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
199143ipc . 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
334311ipc . answerMain ( 'show-requests-view' , async ( ) => {
335- await selectOtherListViews ( 3 ) ;
312+ await openSettingsMenuAndClickItem ( 'Message requests' , { useExactMatch : true } ) ;
336313} ) ;
337314
338315ipc . 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
342323ipc . answerMain ( 'toggle-video-autoplay' , ( ) => {
@@ -704,26 +685,10 @@ async function deleteSelectedConversation(): Promise<void> {
704685}
705686
706687async 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
729694function isPreferencesOpen ( ) : boolean {
0 commit comments