|
|
@@ -31,6 +31,7 @@ class ViewController: NSViewController {
|
|
|
private var paywallReturnToHomeOnDismiss = true
|
|
|
|
|
|
private var headerView: NSView!
|
|
|
+ private var headerFreeUsesBanner: FreeUsesBannerView!
|
|
|
private var contentTopBelowHeader: NSLayoutConstraint!
|
|
|
private var contentTopBelowWindow: NSLayoutConstraint!
|
|
|
|
|
|
@@ -118,6 +119,7 @@ class ViewController: NSViewController {
|
|
|
sidebar?.refreshAppearance()
|
|
|
view.refreshAppearanceRecursively()
|
|
|
paywallOverlay?.refreshAppearance()
|
|
|
+ headerFreeUsesBanner?.refreshAppearance()
|
|
|
photoPreviewOverlay?.refreshAppearance()
|
|
|
filePreviewOverlay?.refreshAppearance()
|
|
|
printTextOverlay?.refreshAppearance()
|
|
|
@@ -488,7 +490,7 @@ class ViewController: NSViewController {
|
|
|
|
|
|
private func showDestinationAfterEntitlementCheck(_ destination: SidebarDestination) {
|
|
|
if destination == .scanAndHome {
|
|
|
- if StoreManager.shared.isPremium {
|
|
|
+ if StoreManager.shared.isPremium || FreeTierManager.remainingUses(isPremium: false) > 0 {
|
|
|
sidebar.select(.scan)
|
|
|
showDestinationAfterEntitlementCheck(.scan)
|
|
|
} else {
|
|
|
@@ -497,14 +499,14 @@ class ViewController: NSViewController {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- if destination == .scan, !StoreManager.shared.isPremium {
|
|
|
+ if destination == .scan, !PremiumAccess.canAccess(.scannerScan) {
|
|
|
sidebar.select(.home)
|
|
|
showDestinationContent(.home)
|
|
|
presentPaywall(returnToHomeOnDismiss: true)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- if destination == .print, !StoreManager.shared.isPremium {
|
|
|
+ if destination == .print, !PremiumAccess.canAccess(.printText) {
|
|
|
sidebar.select(.home)
|
|
|
showDestinationContent(.home)
|
|
|
presentPaywall(returnToHomeOnDismiss: true)
|
|
|
@@ -651,9 +653,11 @@ class ViewController: NSViewController {
|
|
|
documentView.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
|
|
let sectionTitle = makeSectionTitle(title, icon: .grid)
|
|
|
+ let freeUsesBanner = FreeUsesBannerView()
|
|
|
let grid = makeFeatureGrid(features: features, columns: AppTheme.featureGridColumns)
|
|
|
|
|
|
documentView.addSubview(sectionTitle)
|
|
|
+ documentView.addSubview(freeUsesBanner)
|
|
|
documentView.addSubview(grid)
|
|
|
scrollView.documentView = documentView
|
|
|
container.addSubview(scrollView)
|
|
|
@@ -675,9 +679,13 @@ class ViewController: NSViewController {
|
|
|
sectionTitle.trailingAnchor.constraint(equalTo: documentView.trailingAnchor, constant: -AppTheme.contentPadding),
|
|
|
sectionTitle.topAnchor.constraint(equalTo: documentView.topAnchor, constant: 8),
|
|
|
|
|
|
+ freeUsesBanner.leadingAnchor.constraint(equalTo: documentView.leadingAnchor, constant: AppTheme.contentPadding),
|
|
|
+ freeUsesBanner.trailingAnchor.constraint(lessThanOrEqualTo: documentView.trailingAnchor, constant: -AppTheme.contentPadding),
|
|
|
+ freeUsesBanner.topAnchor.constraint(equalTo: sectionTitle.bottomAnchor, constant: 12),
|
|
|
+
|
|
|
grid.leadingAnchor.constraint(equalTo: documentView.leadingAnchor, constant: AppTheme.contentPadding),
|
|
|
grid.trailingAnchor.constraint(equalTo: documentView.trailingAnchor, constant: -AppTheme.contentPadding),
|
|
|
- grid.topAnchor.constraint(equalTo: sectionTitle.bottomAnchor, constant: 16),
|
|
|
+ grid.topAnchor.constraint(equalTo: freeUsesBanner.bottomAnchor, constant: 16),
|
|
|
grid.bottomAnchor.constraint(equalTo: documentView.bottomAnchor, constant: -40),
|
|
|
])
|
|
|
|
|
|
@@ -692,11 +700,18 @@ class ViewController: NSViewController {
|
|
|
titleLabel.alignment = .center
|
|
|
titleLabel.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
|
|
+ headerFreeUsesBanner = FreeUsesBannerView()
|
|
|
+ headerFreeUsesBanner.translatesAutoresizingMaskIntoConstraints = false
|
|
|
+
|
|
|
header.addSubview(titleLabel)
|
|
|
+ header.addSubview(headerFreeUsesBanner)
|
|
|
|
|
|
NSLayoutConstraint.activate([
|
|
|
titleLabel.centerXAnchor.constraint(equalTo: header.centerXAnchor),
|
|
|
- titleLabel.topAnchor.constraint(equalTo: header.topAnchor, constant: 2),
|
|
|
+ titleLabel.centerYAnchor.constraint(equalTo: header.centerYAnchor),
|
|
|
+
|
|
|
+ headerFreeUsesBanner.trailingAnchor.constraint(equalTo: header.trailingAnchor, constant: -AppTheme.contentPadding),
|
|
|
+ headerFreeUsesBanner.centerYAnchor.constraint(equalTo: header.centerYAnchor),
|
|
|
])
|
|
|
|
|
|
return header
|
|
|
@@ -739,9 +754,11 @@ class ViewController: NSViewController {
|
|
|
let documentView = FlippedDocumentView()
|
|
|
documentView.translatesAutoresizingMaskIntoConstraints = false
|
|
|
|
|
|
+ let freeUsesBanner = FreeUsesBannerView()
|
|
|
let quickStartSection = makeQuickStartSection()
|
|
|
let createPrintSection = makeCreatePrintSection()
|
|
|
|
|
|
+ documentView.addSubview(freeUsesBanner)
|
|
|
documentView.addSubview(quickStartSection)
|
|
|
documentView.addSubview(createPrintSection)
|
|
|
scrollView.documentView = documentView
|
|
|
@@ -754,9 +771,13 @@ class ViewController: NSViewController {
|
|
|
documentView.trailingAnchor.constraint(equalTo: contentGuide.trailingAnchor),
|
|
|
documentView.widthAnchor.constraint(equalTo: contentGuide.widthAnchor),
|
|
|
|
|
|
+ freeUsesBanner.leadingAnchor.constraint(equalTo: documentView.leadingAnchor, constant: AppTheme.contentPadding),
|
|
|
+ freeUsesBanner.trailingAnchor.constraint(lessThanOrEqualTo: documentView.trailingAnchor, constant: -AppTheme.contentPadding),
|
|
|
+ freeUsesBanner.topAnchor.constraint(equalTo: documentView.topAnchor, constant: 12),
|
|
|
+
|
|
|
quickStartSection.leadingAnchor.constraint(equalTo: documentView.leadingAnchor, constant: AppTheme.contentPadding),
|
|
|
quickStartSection.trailingAnchor.constraint(equalTo: documentView.trailingAnchor, constant: -AppTheme.contentPadding),
|
|
|
- quickStartSection.topAnchor.constraint(equalTo: documentView.topAnchor, constant: 20),
|
|
|
+ quickStartSection.topAnchor.constraint(equalTo: freeUsesBanner.bottomAnchor, constant: 16),
|
|
|
|
|
|
createPrintSection.leadingAnchor.constraint(equalTo: documentView.leadingAnchor, constant: AppTheme.contentPadding),
|
|
|
createPrintSection.trailingAnchor.constraint(equalTo: documentView.trailingAnchor, constant: -AppTheme.contentPadding),
|