Quellcode durchsuchen

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 vor 3 Monaten
Ursprung
Commit
8dff934ed0

+ 27 - 6
meetings_app/StatusBar/StatusBarController.swift

@@ -42,20 +42,26 @@ final class StatusBarController: NSObject {
         openAppItem.target = self
         menu.addItem(openAppItem)
 
+        menu.addItem(.separator())
+        addOpenSidebarItem(title: "Join Meetings", pageRaw: 0, to: menu)
+        addOpenSidebarItem(title: "Schedule", pageRaw: 1, to: menu)
+        addOpenSidebarItem(title: "Calendar", pageRaw: 2, to: menu)
+        addOpenSidebarItem(title: "Widgets", pageRaw: 3, to: menu)
+        addOpenSidebarItem(title: "Settings", pageRaw: 4, to: menu)
+
         let signedIn = authService.loadTokens() != nil
         if signedIn {
             let topMeetings = WidgetMeetingStore.load().prefix(3).map { $0 }
+            menu.addItem(.separator())
+            let header = NSMenuItem(title: "Top meetings", action: nil, keyEquivalent: "")
+            header.isEnabled = false
+            menu.addItem(header)
+
             if topMeetings.isEmpty {
                 let empty = NSMenuItem(title: "No upcoming meetings", action: nil, keyEquivalent: "")
                 empty.isEnabled = false
-                menu.addItem(.separator())
                 menu.addItem(empty)
             } else {
-                menu.addItem(.separator())
-                let header = NSMenuItem(title: "Top meetings", action: nil, keyEquivalent: "")
-                header.isEnabled = false
-                menu.addItem(header)
-
                 for meeting in topMeetings {
                     let title = "\(meeting.timeText)  \(meeting.title)"
                     let item = NSMenuItem(title: title, action: #selector(meetingClicked(_:)), keyEquivalent: "")
@@ -102,6 +108,14 @@ final class StatusBarController: NSObject {
         }
     }
 
+    @objc private func openSidebarPageClicked(_ sender: NSMenuItem) {
+        guard let pageRaw = sender.representedObject as? Int else { return }
+        bringAppToFront()
+        DispatchQueue.main.asyncAfter(deadline: .now() + 0.15) {
+            NotificationCenter.default.post(name: .statusBarOpenSidebarPage, object: nil, userInfo: ["page": pageRaw])
+        }
+    }
+
     @objc private func meetingClicked(_ sender: NSMenuItem) {
         guard let link = sender.representedObject as? String,
               let url = URL(string: link.trimmingCharacters(in: .whitespacesAndNewlines)) else { return }
@@ -125,5 +139,12 @@ final class StatusBarController: NSObject {
             window.makeKeyAndOrderFront(nil)
         }
     }
+
+    private func addOpenSidebarItem(title: String, pageRaw: Int, to menu: NSMenu) {
+        let item = NSMenuItem(title: title, action: #selector(openSidebarPageClicked(_:)), keyEquivalent: "")
+        item.target = self
+        item.representedObject = pageRaw
+        menu.addItem(item)
+    }
 }
 

+ 7 - 0
meetings_app/ViewController.swift

@@ -696,6 +696,7 @@ private extension ViewController {
         NotificationCenter.default.addObserver(self, selector: #selector(widgetRefreshRequested), name: .widgetRefreshRequested, object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(widgetOpenMeetWebRequested), name: .widgetOpenMeetWebRequested, object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(widgetOpenMeetingLinkRequested(_:)), name: .widgetOpenMeetingLinkRequested, object: nil)
+        NotificationCenter.default.addObserver(self, selector: #selector(statusBarOpenSidebarPageRequested(_:)), name: .statusBarOpenSidebarPage, object: nil)
         NotificationCenter.default.addObserver(self, selector: #selector(statusBarSignOutRequested), name: .statusBarSignOutRequested, object: nil)
     }
 
@@ -717,6 +718,12 @@ private extension ViewController {
         openInDefaultBrowser(url: url)
     }
 
+    @objc private func statusBarOpenSidebarPageRequested(_ notification: Notification) {
+        guard let pageRaw = notification.userInfo?["page"] as? Int,
+              let page = SidebarPage(rawValue: pageRaw) else { return }
+        showSidebarPage(page)
+    }
+
     @objc private func statusBarSignOutRequested() { performGoogleSignOut() }
 
     @objc private func joinMeetClicked(_ sender: Any?) {

+ 1 - 0
meetings_app/Widgets/DesktopWidgetView.swift

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