Parcourir la Source

Add status bar shortcuts for sidebar pages

Expose Join Meetings, Schedule, Calendar, Widgets, and Settings in the menu bar and route clicks through a single notification to navigate in-app.

Made-with: Cursor
huzaifahayat12 il y a 1 mois
Parent
commit
8dff934ed0

+ 27 - 6
meetings_app/StatusBar/StatusBarController.swift

@@ -42,20 +42,26 @@ final class StatusBarController: NSObject {
42 42
         openAppItem.target = self
43 43
         menu.addItem(openAppItem)
44 44
 
45
+        menu.addItem(.separator())
46
+        addOpenSidebarItem(title: "Join Meetings", pageRaw: 0, to: menu)
47
+        addOpenSidebarItem(title: "Schedule", pageRaw: 1, to: menu)
48
+        addOpenSidebarItem(title: "Calendar", pageRaw: 2, to: menu)
49
+        addOpenSidebarItem(title: "Widgets", pageRaw: 3, to: menu)
50
+        addOpenSidebarItem(title: "Settings", pageRaw: 4, to: menu)
51
+
45 52
         let signedIn = authService.loadTokens() != nil
46 53
         if signedIn {
47 54
             let topMeetings = WidgetMeetingStore.load().prefix(3).map { $0 }
55
+            menu.addItem(.separator())
56
+            let header = NSMenuItem(title: "Top meetings", action: nil, keyEquivalent: "")
57
+            header.isEnabled = false
58
+            menu.addItem(header)
59
+
48 60
             if topMeetings.isEmpty {
49 61
                 let empty = NSMenuItem(title: "No upcoming meetings", action: nil, keyEquivalent: "")
50 62
                 empty.isEnabled = false
51
-                menu.addItem(.separator())
52 63
                 menu.addItem(empty)
53 64
             } else {
54
-                menu.addItem(.separator())
55
-                let header = NSMenuItem(title: "Top meetings", action: nil, keyEquivalent: "")
56
-                header.isEnabled = false
57
-                menu.addItem(header)
58
-
59 65
                 for meeting in topMeetings {
60 66
                     let title = "\(meeting.timeText)  \(meeting.title)"
61 67
                     let item = NSMenuItem(title: title, action: #selector(meetingClicked(_:)), keyEquivalent: "")
@@ -102,6 +108,14 @@ final class StatusBarController: NSObject {
102 108
         }
103 109
     }
104 110
 
111
+    @objc private func openSidebarPageClicked(_ sender: NSMenuItem) {
112
+        guard let pageRaw = sender.representedObject as? Int else { return }
113
+        bringAppToFront()
114
+        DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) {
115
+            NotificationCenter.default.post(name: .statusBarOpenSidebarPage, object: nil, userInfo: ["page": pageRaw])
116
+        }
117
+    }
118
+
105 119
     @objc private func meetingClicked(_ sender: NSMenuItem) {
106 120
         guard let link = sender.representedObject as? String,
107 121
               let url = URL(string: link.trimmingCharacters(in: .whitespacesAndNewlines)) else { return }
@@ -125,5 +139,12 @@ final class StatusBarController: NSObject {
125 139
             window.makeKeyAndOrderFront(nil)
126 140
         }
127 141
     }
142
+
143
+    private func addOpenSidebarItem(title: String, pageRaw: Int, to menu: NSMenu) {
144
+        let item = NSMenuItem(title: title, action: #selector(openSidebarPageClicked(_:)), keyEquivalent: "")
145
+        item.target = self
146
+        item.representedObject = pageRaw
147
+        menu.addItem(item)
148
+    }
128 149
 }
129 150
 

+ 7 - 0
meetings_app/ViewController.swift

@@ -696,6 +696,7 @@ private extension ViewController {
696 696
         NotificationCenter.default.addObserver(self, selector: #selector(widgetRefreshRequested), name: .widgetRefreshRequested, object: nil)
697 697
         NotificationCenter.default.addObserver(self, selector: #selector(widgetOpenMeetWebRequested), name: .widgetOpenMeetWebRequested, object: nil)
698 698
         NotificationCenter.default.addObserver(self, selector: #selector(widgetOpenMeetingLinkRequested(_:)), name: .widgetOpenMeetingLinkRequested, object: nil)
699
+        NotificationCenter.default.addObserver(self, selector: #selector(statusBarOpenSidebarPageRequested(_:)), name: .statusBarOpenSidebarPage, object: nil)
699 700
         NotificationCenter.default.addObserver(self, selector: #selector(statusBarSignOutRequested), name: .statusBarSignOutRequested, object: nil)
700 701
     }
701 702
 
@@ -717,6 +718,12 @@ private extension ViewController {
717 718
         openInDefaultBrowser(url: url)
718 719
     }
719 720
 
721
+    @objc private func statusBarOpenSidebarPageRequested(_ notification: Notification) {
722
+        guard let pageRaw = notification.userInfo?["page"] as? Int,
723
+              let page = SidebarPage(rawValue: pageRaw) else { return }
724
+        showSidebarPage(page)
725
+    }
726
+
720 727
     @objc private func statusBarSignOutRequested() { performGoogleSignOut() }
721 728
 
722 729
     @objc private func joinMeetClicked(_ sender: Any?) {

+ 1 - 0
meetings_app/Widgets/DesktopWidgetView.swift

@@ -358,6 +358,7 @@ extension Notification.Name {
358 358
     static let widgetOpenMeetWebRequested = Notification.Name("widgetOpenMeetWebRequested")
359 359
     static let widgetRefreshRequested = Notification.Name("widgetRefreshRequested")
360 360
     static let widgetOpenMeetingLinkRequested = Notification.Name("widgetOpenMeetingLinkRequested")
361
+    static let statusBarOpenSidebarPage = Notification.Name("statusBarOpenSidebarPage")
361 362
     static let statusBarSignOutRequested = Notification.Name("statusBarSignOutRequested")
362 363
     static let meetingsSnapshotUpdated = Notification.Name("meetingsSnapshotUpdated")
363 364
 }