Prevents non-subscriber from launching additional timers

main
Laurent 3 years ago
parent badad9cefb
commit cf3836444b
  1. 4
      LeCountdown/Subscription/AppGuard.swift
  2. 4
      LeCountdown/Views/ContentView.swift
  3. 22
      LeCountdown/Views/DialView.swift
  4. 2
      LeCountdown/Views/PresetsView.swift
  5. 16
      LeCountdown/Views/TimersView.swift

@ -32,6 +32,8 @@ extension Notification.Name {
@objc class AppGuard: NSObject { @objc class AppGuard: NSObject {
static let freeTimersCount: Int = 3
static var main: AppGuard = AppGuard() static var main: AppGuard = AppGuard()
@Published private(set) var purchasedTransactions = Set<StoreKit.Transaction>() @Published private(set) var purchasedTransactions = Set<StoreKit.Transaction>()
@ -124,7 +126,7 @@ extension Notification.Name {
} }
var isSubscriber: Bool { var isSubscriber: Bool {
return self.currentPlan != .none return true //self.currentPlan != .none
} }
var currentPlan: StorePlan { var currentPlan: StorePlan {

@ -51,7 +51,9 @@ struct ContentView<T : AbstractTimer>: View {
.foregroundColor(.white) .foregroundColor(.white)
} }
TimersView(isEditing: self.$isEditing, siriHandler: { timer in TimersView(isEditing: self.$isEditing,
showSubscriptionSheet: self.$showSubscriptionSheet,
siriHandler: { timer in
self._handleSiriTips(timer: timer) self._handleSiriTips(timer: timer)
}) })
.environment(\.managedObjectContext, viewContext) .environment(\.managedObjectContext, viewContext)

@ -15,7 +15,10 @@ struct DialView: View {
@EnvironmentObject var conductor: Conductor @EnvironmentObject var conductor: Conductor
@State var timer: AbstractTimer @State var timer: AbstractTimer
var isLaunchable: Bool
var isEditingBinding: Binding<Bool> var isEditingBinding: Binding<Bool>
@Binding var showSubscriptionSheet: Bool
var frameSize: CGFloat var frameSize: CGFloat
@ -27,13 +30,27 @@ struct DialView: View {
switch self.isEditingBinding.wrappedValue { switch self.isEditingBinding.wrappedValue {
case false: case false:
Button { Button {
if self.isLaunchable {
self._launchTimer() self._launchTimer()
} else {
self.showSubscriptionSheet = true
}
} label: { } label: {
ZStack {
VStack { VStack {
Spacer() Spacer()
self._dialView().padding(.horizontal) self._dialView().padding(.horizontal)
Spacer() Spacer()
} }
if !self.isLaunchable {
Group {
Image(systemName: "lock.circle").font(.title).foregroundColor(.white)
}.frame(maxWidth: .infinity, maxHeight: .infinity).background(Color(white: 0.0, opacity: 0.6))
}
}
} }
case true: case true:
NavigationLink { NavigationLink {
@ -119,7 +136,10 @@ struct DialView_Previews: PreviewProvider {
DialView( DialView(
timer: Countdown.fake(context: PersistenceController.preview.container.viewContext), timer: Countdown.fake(context: PersistenceController.preview.container.viewContext),
isEditingBinding: .constant(true), frameSize: 150.0) isLaunchable: true,
isEditingBinding: .constant(false),
showSubscriptionSheet: .constant(false),
frameSize: 150.0)
.environmentObject(Conductor.maestro) .environmentObject(Conductor.maestro)
.environmentObject(BoringContext()) .environmentObject(BoringContext())

@ -119,7 +119,7 @@ struct PresetsView: View {
} }
fileprivate func _showNewCountdown() { fileprivate func _showNewCountdown() {
if AppGuard.main.isSubscriber || viewContext.count(entityName: "AbstractTimer") < 4 { if AppGuard.main.isSubscriber || viewContext.count(entityName: "AbstractTimer") < AppGuard.freeTimersCount {
self.isShowingNewCountdown = true self.isShowingNewCountdown = true
} else { } else {
self.isShowingSubscription = true self.isShowingSubscription = true

@ -14,6 +14,7 @@ struct TimersView: View {
@Environment(\.managedObjectContext) private var viewContext @Environment(\.managedObjectContext) private var viewContext
@Binding var isEditing: Bool @Binding var isEditing: Bool
@Binding var showSubscriptionSheet: Bool
var siriHandler: ((AbstractTimer) -> ()) var siriHandler: ((AbstractTimer) -> ())
@ -24,6 +25,7 @@ struct TimersView: View {
fileprivate let itemSpacing: CGFloat = 10.0 fileprivate let itemSpacing: CGFloat = 10.0
var body: some View { var body: some View {
let abstractTimers: [AbstractTimer] = Array(self.timers) let abstractTimers: [AbstractTimer] = Array(self.timers)
@ -43,8 +45,11 @@ struct TimersView: View {
ReorderableForEach(items: abstractTimers) { timer in ReorderableForEach(items: abstractTimers) { timer in
let launchable: Bool = self._isLaunchable(timer: timer)
DialView(timer: timer, DialView(timer: timer,
isLaunchable: launchable,
isEditingBinding: self.$isEditing, isEditingBinding: self.$isEditing,
showSubscriptionSheet: self.$showSubscriptionSheet,
frameSize: width, handler: { timer in frameSize: width, handler: { timer in
self.siriHandler(timer) self.siriHandler(timer)
@ -68,7 +73,16 @@ struct TimersView: View {
} }
fileprivate func _isLaunchable(timer: AbstractTimer) -> Bool {
return AppGuard.main.isSubscriber || (self.timers.firstIndex(of: timer) ?? 0) < AppGuard.freeTimersCount
}
fileprivate func _reorder(from: IndexSet, to: Int) { fileprivate func _reorder(from: IndexSet, to: Int) {
guard AppGuard.main.isSubscriber || self.timers.count < 4 else {
return
}
var timers: [AbstractTimer] = Array(self.timers) var timers: [AbstractTimer] = Array(self.timers)
timers.move(fromOffsets: from, toOffset: to) timers.move(fromOffsets: from, toOffset: to)
for (i, countdown) in timers.enumerated() { for (i, countdown) in timers.enumerated() {
@ -102,6 +116,6 @@ struct TimersView: View {
struct TimersView_Previews: PreviewProvider { struct TimersView_Previews: PreviewProvider {
static var previews: some View { static var previews: some View {
TimersView(isEditing: .constant(false), siriHandler: { _ in }) TimersView(isEditing: .constant(false), showSubscriptionSheet: .constant(false), siriHandler: { _ in })
} }
} }

Loading…
Cancel
Save