51 lines
1.8 KiB
Swift
51 lines
1.8 KiB
Swift
import ActivityKit
|
|
import Foundation
|
|
|
|
@MainActor
|
|
final class LiveActivityManager {
|
|
static let shared = LiveActivityManager()
|
|
private init() {}
|
|
|
|
private var currentActivity: Activity<SessionActivityAttributes>?
|
|
|
|
/// Call this when a ClimbSession starts to begin a Live Activity
|
|
func startLiveActivity(for session: ClimbSession, gymName: String) async {
|
|
await endLiveActivity()
|
|
let attributes = SessionActivityAttributes(
|
|
gymName: gymName, startTime: session.startTime ?? session.date)
|
|
let initialContentState = SessionActivityAttributes.ContentState(
|
|
elapsed: 0,
|
|
totalAttempts: 0,
|
|
completedProblems: 0
|
|
)
|
|
do {
|
|
currentActivity = try Activity<SessionActivityAttributes>.request(
|
|
attributes: attributes,
|
|
content: .init(state: initialContentState, staleDate: nil),
|
|
pushType: nil
|
|
)
|
|
} catch {
|
|
AppLogger.error("Failed to start live activity: \(error)", tag: "LegacyLiveActivityManager")
|
|
}
|
|
}
|
|
|
|
/// Call this to update the Live Activity with new session progress
|
|
func updateLiveActivity(elapsed: TimeInterval, totalAttempts: Int, completedProblems: Int) async
|
|
{
|
|
guard let currentActivity else { return }
|
|
let updatedContentState = SessionActivityAttributes.ContentState(
|
|
elapsed: elapsed,
|
|
totalAttempts: totalAttempts,
|
|
completedProblems: completedProblems
|
|
)
|
|
await currentActivity.update(.init(state: updatedContentState, staleDate: nil))
|
|
}
|
|
|
|
/// Call this when a ClimbSession ends to end the Live Activity
|
|
func endLiveActivity() async {
|
|
guard let currentActivity else { return }
|
|
await currentActivity.end(nil, dismissalPolicy: .immediate)
|
|
self.currentActivity = nil
|
|
}
|
|
}
|