|
|
@@ -185,6 +185,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
185
|
185
|
private var chatThinkingRowHost: NSView?
|
|
186
|
186
|
private let jobSearchService = OpenAIJobSearchService()
|
|
187
|
187
|
private var premiumPlansWindowController: PremiumPlansWindowController?
|
|
|
188
|
+ private var isPreparingPremiumPlansSheet = false
|
|
188
|
189
|
private var indeedJobBrowserViewController: IndeedJobBrowserViewController?
|
|
189
|
190
|
private var isIndeedJobBrowserPresented = false
|
|
190
|
191
|
private weak var sidebarUpgradeCard: NSView?
|
|
|
@@ -777,31 +778,41 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
777
|
778
|
|
|
778
|
779
|
private func presentPremiumPlansSheet() {
|
|
779
|
780
|
guard let hostWindow = window else { return }
|
|
|
781
|
+ if isPreparingPremiumPlansSheet { return }
|
|
780
|
782
|
|
|
781
|
|
- if premiumPlansWindowController == nil {
|
|
782
|
|
- premiumPlansWindowController = PremiumPlansWindowController()
|
|
783
|
|
- }
|
|
784
|
|
- guard let paywallWindow = premiumPlansWindowController?.window else { return }
|
|
|
783
|
+ isPreparingPremiumPlansSheet = true
|
|
|
784
|
+ Task { @MainActor [weak self] in
|
|
|
785
|
+ defer { self?.isPreparingPremiumPlansSheet = false }
|
|
|
786
|
+ guard let self else { return }
|
|
785
|
787
|
|
|
786
|
|
- if hostWindow.attachedSheet === paywallWindow {
|
|
787
|
|
- return
|
|
788
|
|
- }
|
|
|
788
|
+ if self.premiumPlansWindowController == nil {
|
|
|
789
|
+ self.premiumPlansWindowController = PremiumPlansWindowController()
|
|
|
790
|
+ }
|
|
|
791
|
+ guard let controller = self.premiumPlansWindowController else { return }
|
|
|
792
|
+ await controller.prepareForPresentation()
|
|
789
|
793
|
|
|
790
|
|
- paywallWindow.styleMask = [.borderless, .closable, .resizable]
|
|
791
|
|
- paywallWindow.isOpaque = true
|
|
792
|
|
- paywallWindow.backgroundColor = PremiumPlansWindowController.paywallSheetBackground
|
|
|
794
|
+ guard let paywallWindow = controller.window else { return }
|
|
793
|
795
|
|
|
794
|
|
- let hostContentRect = hostWindow.contentRect(forFrameRect: hostWindow.frame)
|
|
795
|
|
- let overscan = PremiumSheetLayout.overscanPerEdge
|
|
796
|
|
- var expandedContentRect = hostContentRect.insetBy(dx: -overscan, dy: -overscan)
|
|
797
|
|
- expandedContentRect.size.height += PremiumSheetLayout.overscanExtraTop
|
|
798
|
|
- let paywallFrame = paywallWindow.frameRect(forContentRect: expandedContentRect)
|
|
799
|
|
- paywallWindow.setFrame(paywallFrame, display: false)
|
|
800
|
|
- let lockedSize = paywallWindow.frame.size
|
|
801
|
|
- paywallWindow.minSize = lockedSize
|
|
802
|
|
- paywallWindow.maxSize = lockedSize
|
|
|
796
|
+ if hostWindow.attachedSheet === paywallWindow {
|
|
|
797
|
+ return
|
|
|
798
|
+ }
|
|
|
799
|
+
|
|
|
800
|
+ paywallWindow.styleMask = [.borderless, .closable, .resizable]
|
|
|
801
|
+ paywallWindow.isOpaque = true
|
|
|
802
|
+ paywallWindow.backgroundColor = PremiumPlansWindowController.paywallSheetBackground
|
|
803
|
803
|
|
|
804
|
|
- hostWindow.beginSheet(paywallWindow)
|
|
|
804
|
+ let hostContentRect = hostWindow.contentRect(forFrameRect: hostWindow.frame)
|
|
|
805
|
+ let overscan = PremiumSheetLayout.overscanPerEdge
|
|
|
806
|
+ var expandedContentRect = hostContentRect.insetBy(dx: -overscan, dy: -overscan)
|
|
|
807
|
+ expandedContentRect.size.height += PremiumSheetLayout.overscanExtraTop
|
|
|
808
|
+ let paywallFrame = paywallWindow.frameRect(forContentRect: expandedContentRect)
|
|
|
809
|
+ paywallWindow.setFrame(paywallFrame, display: false)
|
|
|
810
|
+ let lockedSize = paywallWindow.frame.size
|
|
|
811
|
+ paywallWindow.minSize = lockedSize
|
|
|
812
|
+ paywallWindow.maxSize = lockedSize
|
|
|
813
|
+
|
|
|
814
|
+ await hostWindow.beginSheet(paywallWindow)
|
|
|
815
|
+ }
|
|
805
|
816
|
}
|
|
806
|
817
|
|
|
807
|
818
|
private func configureFeatureShortcutCards() {
|