|
@@ -454,6 +454,16 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /// Returns `false` and presents the paywall when the user does not have an active Pro subscription.
|
|
|
|
|
+ @discardableResult
|
|
|
|
|
+ private func ensureProAccess() -> Bool {
|
|
|
|
|
+ guard SubscriptionStore.shared.isProActive else {
|
|
|
|
|
+ presentPremiumPlansSheet()
|
|
|
|
|
+ return false
|
|
|
|
|
+ }
|
|
|
|
|
+ return true
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
private func presentPremiumPlansSheet() {
|
|
private func presentPremiumPlansSheet() {
|
|
|
guard let hostWindow = window else { return }
|
|
guard let hostWindow = window else { return }
|
|
|
|
|
|
|
@@ -1346,7 +1356,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
])
|
|
])
|
|
|
|
|
|
|
|
cvMakerPageView.onContinueToProfileSelection = { [weak self] template in
|
|
cvMakerPageView.onContinueToProfileSelection = { [weak self] template in
|
|
|
- guard let self else { return }
|
|
|
|
|
|
|
+ guard let self, self.ensureProAccess() else { return }
|
|
|
self.pendingCVTemplate = template
|
|
self.pendingCVTemplate = template
|
|
|
self.profilesListPageView.setPendingCVTemplateDisplayName(template.name)
|
|
self.profilesListPageView.setPendingCVTemplateDisplayName(template.name)
|
|
|
self.selectProfileSidebarForCVMakerFlow()
|
|
self.selectProfileSidebarForCVMakerFlow()
|
|
@@ -1420,6 +1430,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private func presentCVDocumentPreview(profile: SavedProfile, template: CVTemplate) {
|
|
private func presentCVDocumentPreview(profile: SavedProfile, template: CVTemplate) {
|
|
|
|
|
+ guard ensureProAccess() else { return }
|
|
|
isCVDocumentPreviewPresented = true
|
|
isCVDocumentPreviewPresented = true
|
|
|
cvFilledPreviewPageView.configure(profile: profile, template: template)
|
|
cvFilledPreviewPageView.configure(profile: profile, template: template)
|
|
|
cvFilledPreviewPageView.isHidden = false
|
|
cvFilledPreviewPageView.isHidden = false
|
|
@@ -1436,6 +1447,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private func presentProfileEditor(existingID: UUID?) {
|
|
private func presentProfileEditor(existingID: UUID?) {
|
|
|
|
|
+ guard ensureProAccess() else { return }
|
|
|
if isCVDocumentPreviewPresented {
|
|
if isCVDocumentPreviewPresented {
|
|
|
dismissCVDocumentPreview()
|
|
dismissCVDocumentPreview()
|
|
|
}
|
|
}
|
|
@@ -1772,10 +1784,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@objc private func didSubmitSearch() {
|
|
@objc private func didSubmitSearch() {
|
|
|
- guard SubscriptionStore.shared.isProActive else {
|
|
|
|
|
- presentPremiumPlansSheet()
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ guard ensureProAccess() else { return }
|
|
|
let prompt = jobKeywordsField.stringValue.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
let prompt = jobKeywordsField.stringValue.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
|
guard !prompt.isEmpty, !isAwaitingResponse else { return }
|
|
guard !prompt.isEmpty, !isAwaitingResponse else { return }
|
|
|
let isContinuation = isContinuationPrompt(prompt)
|
|
let isContinuation = isContinuationPrompt(prompt)
|
|
@@ -1892,6 +1901,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
private func focusSearchField(seed: String) {
|
|
private func focusSearchField(seed: String) {
|
|
|
|
|
+ guard ensureProAccess() else { return }
|
|
|
jobKeywordsField.stringValue = seed
|
|
jobKeywordsField.stringValue = seed
|
|
|
window?.makeFirstResponder(jobKeywordsField)
|
|
window?.makeFirstResponder(jobKeywordsField)
|
|
|
if let editor = jobKeywordsField.window?.fieldEditor(true, for: jobKeywordsField) as? NSTextView {
|
|
if let editor = jobKeywordsField.window?.fieldEditor(true, for: jobKeywordsField) as? NSTextView {
|
|
@@ -1900,10 +1910,7 @@ final class DashboardView: NSView, NSTextFieldDelegate, NSSharingServicePickerDe
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@objc private func didTapLoadMoreJobs() {
|
|
@objc private func didTapLoadMoreJobs() {
|
|
|
- guard SubscriptionStore.shared.isProActive else {
|
|
|
|
|
- presentPremiumPlansSheet()
|
|
|
|
|
- return
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ guard ensureProAccess() else { return }
|
|
|
let prompt = "Show more jobs"
|
|
let prompt = "Show more jobs"
|
|
|
guard !isAwaitingResponse, isContinuationPrompt(prompt) else { return }
|
|
guard !isAwaitingResponse, isContinuationPrompt(prompt) else { return }
|
|
|
if anchorUserJobQuery(excludingLatestUserMessage: prompt) == nil { return }
|
|
if anchorUserJobQuery(excludingLatestUserMessage: prompt) == nil { return }
|