Compare commits
2 Commits
cd6fea9b53
...
df9fd48964
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df9fd48964 | ||
|
|
e42c1217db |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -54,3 +54,4 @@ coverage/
|
||||
node-compile-cache/
|
||||
.gitnexus
|
||||
Config/Secrets.xcconfig
|
||||
tabatago-swift/build/
|
||||
|
||||
Binary file not shown.
@@ -7,12 +7,12 @@
|
||||
<key>TabataGo.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>4</integer>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>TabataGoTests.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>3</integer>
|
||||
<integer>0</integer>
|
||||
</dict>
|
||||
<key>TabataGoUITests.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
@@ -29,6 +29,11 @@
|
||||
<key>orderHint</key>
|
||||
<integer>1</integer>
|
||||
</dict>
|
||||
<key>TabataGoWidget.xcscheme_^#shared#^_</key>
|
||||
<dict>
|
||||
<key>orderHint</key>
|
||||
<integer>2</integer>
|
||||
</dict>
|
||||
</dict>
|
||||
<key>SuppressBuildableAutocreation</key>
|
||||
<dict>
|
||||
|
||||
@@ -116,6 +116,8 @@ final class PlayerViewModel: ObservableObject {
|
||||
}
|
||||
|
||||
func abandonWorkout() {
|
||||
isRunning = false
|
||||
isPaused = false
|
||||
timer?.invalidate()
|
||||
stopActivitySyncTimer()
|
||||
Task { try? await liveSession.end() }
|
||||
@@ -401,7 +403,8 @@ final class PlayerViewModel: ObservableObject {
|
||||
phaseElapsedSeconds: max(0, Double(totalPhaseTime) - Double(timeRemaining))
|
||||
)
|
||||
|
||||
if let existing = workoutActivity, existing.activityState != .active {
|
||||
if let existing = workoutActivity,
|
||||
existing.activityState == .ended || existing.activityState == .dismissed {
|
||||
workoutActivity = nil
|
||||
}
|
||||
|
||||
@@ -449,12 +452,14 @@ final class PlayerViewModel: ObservableObject {
|
||||
}
|
||||
|
||||
func endActivity() async {
|
||||
stopActivitySyncTimer()
|
||||
guard let activity = workoutActivity else { return }
|
||||
workoutActivity = nil
|
||||
activityStateTask?.cancel()
|
||||
activityStateTask = nil
|
||||
nonisolated(unsafe) let safeActivity = activity
|
||||
guard safeActivity.activityState == .active else { return }
|
||||
guard safeActivity.activityState != .ended,
|
||||
safeActivity.activityState != .dismissed else { return }
|
||||
let finalState = WorkoutActivityAttributes.ContentState(
|
||||
exerciseName: safeActivity.content.state.exerciseName,
|
||||
phase: .complete,
|
||||
@@ -497,7 +502,11 @@ final class PlayerViewModel: ObservableObject {
|
||||
activityStateTask = Task { @MainActor [weak self] in
|
||||
for await state in activity.activityStateUpdates {
|
||||
guard let self else { return }
|
||||
if state == .stale || state == .ended || state == .dismissed {
|
||||
if state == .stale {
|
||||
// Stop sync timer, but keep the activity reference
|
||||
// so endActivity() can still call .end() to properly dismiss it.
|
||||
self.stopActivitySyncTimer()
|
||||
} else if state == .ended || state == .dismissed {
|
||||
self.workoutActivity = nil
|
||||
self.stopActivitySyncTimer()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user