From b0695559505c3d1f34e68281d2e1f236c9689a99 Mon Sep 17 00:00:00 2001 From: VincentMeilinger Date: Thu, 11 Jan 2024 11:16:32 +0100 Subject: [PATCH] Added a timer view --- .../project.pbxproj | 4 + .../UserInterfaceState.xcuserstate | Bin 55005 -> 58775 bytes .../Localizable.xcstrings | 3 + .../ViewModels/MainViewModel.swift | 36 +++++ .../Views/RecipeDetailView.swift | 2 +- .../Views/TimerView.swift | 127 ++++++++++++++++++ 6 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 Nextcloud Cookbook iOS Client/Views/TimerView.swift diff --git a/Nextcloud Cookbook iOS Client.xcodeproj/project.pbxproj b/Nextcloud Cookbook iOS Client.xcodeproj/project.pbxproj index 9236c86..35f3cfb 100644 --- a/Nextcloud Cookbook iOS Client.xcodeproj/project.pbxproj +++ b/Nextcloud Cookbook iOS Client.xcodeproj/project.pbxproj @@ -49,6 +49,7 @@ A7FB0D7E2B25C6A200A3469E /* V2LoginView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7FB0D7D2B25C6A200A3469E /* V2LoginView.swift */; }; A9CA6CEF2B4C086100F78AB5 /* RecipeExporter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9CA6CEE2B4C086100F78AB5 /* RecipeExporter.swift */; }; A9CA6CF62B4C63F200F78AB5 /* TPPDF in Frameworks */ = {isa = PBXBuildFile; productRef = A9CA6CF52B4C63F200F78AB5 /* TPPDF */; }; + A9D89AB02B4FE97800F49D92 /* TimerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A9D89AAF2B4FE97800F49D92 /* TimerView.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -113,6 +114,7 @@ A7FB0D7B2B25C68500A3469E /* TokenLoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TokenLoginView.swift; sourceTree = ""; }; A7FB0D7D2B25C6A200A3469E /* V2LoginView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = V2LoginView.swift; sourceTree = ""; }; A9CA6CEE2B4C086100F78AB5 /* RecipeExporter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RecipeExporter.swift; sourceTree = ""; }; + A9D89AAF2B4FE97800F49D92 /* TimerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimerView.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -243,6 +245,7 @@ A7F3F8E92ACC221C0076C227 /* CategoryPickerView.swift */, A76B8A702AE002AE00096CEC /* Alerts.swift */, A7CD3FD12B2C546A00D764AD /* CollapsibleView.swift */, + A9D89AAF2B4FE97800F49D92 /* TimerView.swift */, ); path = Views; sourceTree = ""; @@ -462,6 +465,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + A9D89AB02B4FE97800F49D92 /* TimerView.swift in Sources */, A79AA8E22AFF8C14007D25F2 /* RecipeEditViewModel.swift in Sources */, A7FB0D7C2B25C68500A3469E /* TokenLoginView.swift in Sources */, A70D7CA12AC73CA800D53DBF /* RecipeEditView.swift in Sources */, diff --git a/Nextcloud Cookbook iOS Client.xcodeproj/project.xcworkspace/xcuserdata/vincie.xcuserdatad/UserInterfaceState.xcuserstate b/Nextcloud Cookbook iOS Client.xcodeproj/project.xcworkspace/xcuserdata/vincie.xcuserdatad/UserInterfaceState.xcuserstate index 072e5e86ed35d10bdfcf9142ce730e03853ee627..c1608cffda072cd4b77fd0a763058f0dee0dea1c 100644 GIT binary patch delta 26999 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

!CM8pM*XOeG&R9 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 PAAIAp{}cbe>EM3=6Q;B8 delta 24616 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 WqmpC(iicBD{ RecipeTimer { + let timer = RecipeTimer(timeTotal: timeTotal) + timers[recipeId] = timer + return timer + } + + func getTimer(forRecipe recipeId: String, timeTotal: Double) -> RecipeTimer { + return timers[recipeId] ?? createTimer(forRecipe: recipeId, timeTotal: timeTotal) + } + + + func startTimer(forRecipe recipeId: String, timeTotal: Double) { + let timer = RecipeTimer(timeTotal: timeTotal) + timer.start() + timers[recipeId] = timer + } + + func pauseTimer(forRecipe recipeId: String) { + timers[recipeId]?.pause() + } + + func resumeTimer(forRecipe recipeId: String) { + timers[recipeId]?.resume() + } + + func cancelTimer(forRecipe recipeId: String) { + timers[recipeId]?.cancel() + timers[recipeId] = nil + } +} diff --git a/Nextcloud Cookbook iOS Client/Views/RecipeDetailView.swift b/Nextcloud Cookbook iOS Client/Views/RecipeDetailView.swift index b8d8c2e..30c2dda 100644 --- a/Nextcloud Cookbook iOS Client/Views/RecipeDetailView.swift +++ b/Nextcloud Cookbook iOS Client/Views/RecipeDetailView.swift @@ -61,7 +61,7 @@ struct RecipeDetailView: View { } Divider() - + TimerView(timer: viewModel.getTimer(forRecipe: recipeDetail.id, timeTotal: 20)) RecipeDurationSection(recipeDetail: recipeDetail) LazyVGrid(columns: [GridItem(.adaptive(minimum: 400), alignment: .top)]) { diff --git a/Nextcloud Cookbook iOS Client/Views/TimerView.swift b/Nextcloud Cookbook iOS Client/Views/TimerView.swift new file mode 100644 index 0000000..b95b2c3 --- /dev/null +++ b/Nextcloud Cookbook iOS Client/Views/TimerView.swift @@ -0,0 +1,127 @@ +// +// TimerView.swift +// Nextcloud Cookbook iOS Client +// +// Created by Vincent Meilinger on 11.01.24. +// + +import Foundation +import SwiftUI +import Combine + + +struct TimerView: View { + @ObservedObject var timer: RecipeTimer + + var body: some View { + HStack { + Gauge(value: timer.timeTotal - timer.timeElapsed, in: 0...timer.timeTotal) { + Text("Cooking time") + } currentValueLabel: { + Button { + if timer.isRunning { + timer.pause() + } else { + timer.start() + } + } label: { + if timer.isRunning { + Image(systemName: "pause.fill") + .foregroundStyle(.blue) + } else { + Image(systemName: "play.fill") + .foregroundStyle(.blue) + } + } + } + .gaugeStyle(.accessoryCircularCapacity) + .animation(.easeInOut, value: timer.timeElapsed) + .tint(.white) + + VStack(alignment: .leading) { + HStack { + Text("Cooking time") + .padding(.horizontal) + Button { + timer.cancel() + } label: { + Image(systemName: "xmark.circle.fill") + } + } + Text("\(Int(timer.timeTotal - timer.timeElapsed))") + .padding(.horizontal) + } + } + .bold() + .padding() + .background { + RoundedRectangle(cornerRadius: 20) + .foregroundStyle(.ultraThickMaterial) + } + } +} + + + +class RecipeTimer: ObservableObject { + var timeTotal: Double + private var startDate: Date? + private var pauseDate: Date? + @Published var timeElapsed: Double = 0 + @Published var isRunning: Bool = false + private var timer: Timer.TimerPublisher? + private var timerCancellable: Cancellable? + + init(timeTotal: Double) { + self.timeTotal = timeTotal + } + + func start() { + self.isRunning = true + if startDate == nil { + startDate = Date() + } else if let pauseDate = pauseDate { + // Adjust start date based on the pause duration + let pauseDuration = Date().timeIntervalSince(pauseDate) + startDate = startDate?.addingTimeInterval(pauseDuration) + } + + self.timer = Timer.publish(every: 1, on: .main, in: .common) + self.timerCancellable = self.timer?.autoconnect().sink { [weak self] _ in + DispatchQueue.main.async { + if let self = self, let startTime = self.startDate { + let elapsed = Date().timeIntervalSince(startTime) + if elapsed < self.timeTotal { + self.timeElapsed = elapsed + } else { + self.timeElapsed = self.timeTotal + self.pause() + } + } + } + } + } + + func pause() { + self.isRunning = false + pauseDate = Date() + self.timerCancellable?.cancel() + self.timerCancellable = nil + self.timer = nil + } + + func resume() { + self.isRunning = true + start() + } + + func cancel() { + self.isRunning = false + self.timerCancellable?.cancel() + self.timerCancellable = nil + self.timer = nil + self.timeElapsed = 0 + self.startDate = nil + self.pauseDate = nil + } +}