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