Pārlūkot izejas kodu

Dismiss AI Companion notes sheet on outside clicks.

Start and clean up a local click monitor around the notes sheet lifecycle so clicks elsewhere in the app close the popup consistently.

Co-authored-by: Cursor <cursoragent@cursor.com>
huzaifahayat12 2 mēneši atpakaļ
vecāks
revīzija
35a10cd51a
1 mainītis faili ar 27 papildinājumiem un 0 dzēšanām
  1. 27 0
      meetings_app/ViewController.swift

+ 27 - 0
meetings_app/ViewController.swift

@@ -341,6 +341,7 @@ final class ViewController: NSViewController {
     private weak var aiCompanionNotesTextView: NSTextView?
     private weak var aiCompanionNotesCopyButton: NSButton?
     private weak var aiCompanionNotesCloseButton: NSButton?
+    private var aiCompanionNotesOutsideClickMonitor: Any?
     private var aiCompanionNotesTaskByMeetingId = [String: Task<Void, Never>]()
     private var aiCompanionAudioPlayer: AVPlayer?
     private var aiCompanionLocalAudioPlayer: AVAudioPlayer?
@@ -3544,6 +3545,7 @@ private extension ViewController {
             if hostWindow.attachedSheet !== panel {
                 hostWindow.beginSheet(panel, completionHandler: nil)
             }
+            aiCompanionStartNotesOutsideClickMonitor()
             panel.makeKeyAndOrderFront(nil)
             NSApp.activate(ignoringOtherApps: true)
             return
@@ -3647,6 +3649,7 @@ private extension ViewController {
 
         panel.contentView = root
         hostWindow.beginSheet(panel, completionHandler: nil)
+        aiCompanionStartNotesOutsideClickMonitor()
         panel.makeKeyAndOrderFront(nil)
         NSApp.activate(ignoringOtherApps: true)
 
@@ -3671,7 +3674,30 @@ private extension ViewController {
     }
 
     @objc private func aiCompanionCloseNotesTapped(_ sender: NSButton) {
+        aiCompanionCloseNotesPanel()
+    }
+
+    private func aiCompanionStartNotesOutsideClickMonitor() {
+        guard aiCompanionNotesOutsideClickMonitor == nil else { return }
+        aiCompanionNotesOutsideClickMonitor = NSEvent.addLocalMonitorForEvents(
+            matching: [.leftMouseDown, .rightMouseDown, .otherMouseDown]
+        ) { [weak self] event in
+            guard let self, let panel = self.aiCompanionNotesPanel else { return event }
+            if event.window === panel { return event }
+            self.aiCompanionCloseNotesPanel()
+            return event
+        }
+    }
+
+    private func aiCompanionStopNotesOutsideClickMonitor() {
+        guard let monitor = aiCompanionNotesOutsideClickMonitor else { return }
+        NSEvent.removeMonitor(monitor)
+        aiCompanionNotesOutsideClickMonitor = nil
+    }
+
+    private func aiCompanionCloseNotesPanel() {
         guard let panel = aiCompanionNotesPanel else { return }
+        aiCompanionStopNotesOutsideClickMonitor()
         if let hostWindow = view.window, hostWindow.attachedSheet === panel {
             hostWindow.endSheet(panel)
         }
@@ -6616,6 +6642,7 @@ extension ViewController: NSWindowDelegate {
     func windowWillClose(_ notification: Notification) {
         guard let closingWindow = notification.object as? NSWindow else { return }
         if closingWindow === aiCompanionNotesPanel {
+            aiCompanionStopNotesOutsideClickMonitor()
             aiCompanionNotesPanel = nil
             aiCompanionNotesRootView = nil
             aiCompanionNotesHeaderView = nil