From e4c64407583d81c7f7865fb061b61eb6e8fdd994 Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Mon, 15 Sep 2025 23:27:21 -0600 Subject: [PATCH] Fixed Widget stats --- ios/ClimbingActivityWidget/Info.plist | 2 +- .../LiveActivityManager.swift | 6 +- ios/OpenClimb.xcodeproj/project.pbxproj | 4 +- .../UserInterfaceState.xcuserstate | Bin 62733 -> 65136 bytes .../xcschemes/xcschememanagement.plist | 2 +- ios/OpenClimb/ContentView.swift | 4 +- ios/OpenClimb/Models/DataModels.swift | 6 +- ios/OpenClimb/Utils/AppIconHelper.swift | 7 +- .../ViewModels/ClimbingDataManager.swift | 2 +- .../ViewModels/LiveActivityManager.swift | 21 +-- .../Views/AddEdit/AddAttemptView.swift | 37 ++-- .../Views/LiveActivityDebugView.swift | 2 +- ios/SessionStatusLive/SessionStatusLive.swift | 158 +++++++----------- 13 files changed, 94 insertions(+), 157 deletions(-) diff --git a/ios/ClimbingActivityWidget/Info.plist b/ios/ClimbingActivityWidget/Info.plist index ae9f1ab..79b8a72 100644 --- a/ios/ClimbingActivityWidget/Info.plist +++ b/ios/ClimbingActivityWidget/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString - 1.0 + 1.0.0 CFBundleVersion 1 NSExtension diff --git a/ios/OpenClimb.xcodeproj/LiveActivityManager.swift b/ios/OpenClimb.xcodeproj/LiveActivityManager.swift index 8e66542..d148bc8 100644 --- a/ios/OpenClimb.xcodeproj/LiveActivityManager.swift +++ b/ios/OpenClimb.xcodeproj/LiveActivityManager.swift @@ -21,7 +21,7 @@ final class LiveActivityManager { do { currentActivity = try Activity.request( attributes: attributes, - contentState: initialContentState, + content: .init(state: initialContentState, staleDate: nil), pushType: nil ) } catch { @@ -38,13 +38,13 @@ final class LiveActivityManager { totalAttempts: totalAttempts, completedProblems: completedProblems ) - await currentActivity.update(using: updatedContentState, alertConfiguration: nil) + 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(using: nil, dismissalPolicy: .immediate) + await currentActivity.end(nil, dismissalPolicy: .immediate) self.currentActivity = nil } } diff --git a/ios/OpenClimb.xcodeproj/project.pbxproj b/ios/OpenClimb.xcodeproj/project.pbxproj index 80e8460..314e0a1 100644 --- a/ios/OpenClimb.xcodeproj/project.pbxproj +++ b/ios/OpenClimb.xcodeproj/project.pbxproj @@ -477,7 +477,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = com.atridad.OpenClimb.SessionStatusLive; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; @@ -506,7 +506,7 @@ "@executable_path/Frameworks", "@executable_path/../../Frameworks", ); - MARKETING_VERSION = 1.0; + MARKETING_VERSION = 1.0.0; PRODUCT_BUNDLE_IDENTIFIER = com.atridad.OpenClimb.SessionStatusLive; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; diff --git a/ios/OpenClimb.xcodeproj/project.xcworkspace/xcuserdata/atridad.xcuserdatad/UserInterfaceState.xcuserstate b/ios/OpenClimb.xcodeproj/project.xcworkspace/xcuserdata/atridad.xcuserdatad/UserInterfaceState.xcuserstate index 4811c96609557cf402cbff4ae2ffcb82d72c6ea3..b948fda7b13ab38b98db7c34d4f8a8fe02397aba 100644 GIT binary patch delta 34697 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 h!x#_@00UO%E-v94C{(lTq{SPL}0!RP= delta 32907 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 diff --git a/ios/OpenClimb.xcodeproj/xcuserdata/atridad.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/OpenClimb.xcodeproj/xcuserdata/atridad.xcuserdatad/xcschemes/xcschememanagement.plist index 53d0216..29372fd 100644 --- a/ios/OpenClimb.xcodeproj/xcuserdata/atridad.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/ios/OpenClimb.xcodeproj/xcuserdata/atridad.xcuserdatad/xcschemes/xcschememanagement.plist @@ -12,7 +12,7 @@ SessionStatusLiveExtension.xcscheme_^#shared#^_ orderHint - 0 + 1 diff --git a/ios/OpenClimb/ContentView.swift b/ios/OpenClimb/ContentView.swift index 15d44e6..276c850 100644 --- a/ios/OpenClimb/ContentView.swift +++ b/ios/OpenClimb/ContentView.swift @@ -43,8 +43,8 @@ struct ContentView: View { .tag(4) } .environmentObject(dataManager) - .onChange(of: scenePhase) { newPhase in - if newPhase == .active { + .onChange(of: scenePhase) { + if scenePhase == .active { dataManager.onAppBecomeActive() } } diff --git a/ios/OpenClimb/Models/DataModels.swift b/ios/OpenClimb/Models/DataModels.swift index 2cbb042..c395279 100644 --- a/ios/OpenClimb/Models/DataModels.swift +++ b/ios/OpenClimb/Models/DataModels.swift @@ -1,4 +1,3 @@ - import Foundation import SwiftUI @@ -493,13 +492,14 @@ struct Attempt: Identifiable, Codable, Hashable { } func updated( - result: AttemptResult? = nil, highestHold: String? = nil, notes: String? = nil, + problemId: UUID? = nil, result: AttemptResult? = nil, highestHold: String? = nil, + notes: String? = nil, duration: Int? = nil, restTime: Int? = nil ) -> Attempt { return Attempt( id: self.id, sessionId: self.sessionId, - problemId: self.problemId, + problemId: problemId ?? self.problemId, result: result ?? self.result, highestHold: highestHold ?? self.highestHold, notes: notes ?? self.notes, diff --git a/ios/OpenClimb/Utils/AppIconHelper.swift b/ios/OpenClimb/Utils/AppIconHelper.swift index f5f6c62..b21132a 100644 --- a/ios/OpenClimb/Utils/AppIconHelper.swift +++ b/ios/OpenClimb/Utils/AppIconHelper.swift @@ -1,4 +1,3 @@ - import Combine import SwiftUI @@ -82,9 +81,9 @@ struct IconAppearanceModifier: ViewModifier { func body(content: Content) -> some View { content - .onChange(of: colorScheme) { _, newColorScheme in - iconHelper.updateDarkModeStatus(for: newColorScheme) - onChange(iconHelper.getRecommendedIconVariant(for: newColorScheme)) + .onChange(of: colorScheme) { + iconHelper.updateDarkModeStatus(for: colorScheme) + onChange(iconHelper.getRecommendedIconVariant(for: colorScheme)) } .onAppear { iconHelper.updateDarkModeStatus(for: colorScheme) diff --git a/ios/OpenClimb/ViewModels/ClimbingDataManager.swift b/ios/OpenClimb/ViewModels/ClimbingDataManager.swift index 57b26bf..13f8a04 100644 --- a/ios/OpenClimb/ViewModels/ClimbingDataManager.swift +++ b/ios/OpenClimb/ViewModels/ClimbingDataManager.swift @@ -1020,7 +1020,7 @@ extension ClimbingDataManager { private func updateLiveActivityForActiveSession() { guard let activeSession = activeSession, activeSession.status == .active, - let gym = gym(withId: activeSession.gymId) + let _ = gym(withId: activeSession.gymId) else { return } diff --git a/ios/OpenClimb/ViewModels/LiveActivityManager.swift b/ios/OpenClimb/ViewModels/LiveActivityManager.swift index 97c0a3f..efa406e 100644 --- a/ios/OpenClimb/ViewModels/LiveActivityManager.swift +++ b/ios/OpenClimb/ViewModels/LiveActivityManager.swift @@ -45,7 +45,7 @@ final class LiveActivityManager { do { let activity = try Activity.request( attributes: attributes, - contentState: initialContentState, + content: .init(state: initialContentState, staleDate: nil), pushType: nil ) self.currentActivity = activity @@ -81,12 +81,8 @@ final class LiveActivityManager { completedProblems: completedProblems ) - do { - await currentActivity.update(using: updatedContentState, alertConfiguration: nil) - print("✅ Live Activity updated successfully") - } catch { - print("❌ Failed to update live activity: \(error)") - } + await currentActivity.update(.init(state: updatedContentState, staleDate: nil)) + print("✅ Live Activity updated successfully") } /// Call this when a ClimbSession ends to end the Live Activity @@ -98,14 +94,9 @@ final class LiveActivityManager { print("🔴 Ending Live Activity: \(currentActivity.id)") - do { - await currentActivity.end(using: nil, dismissalPolicy: .immediate) - self.currentActivity = nil - print("✅ Live Activity ended successfully") - } catch { - print("❌ Failed to end live activity: \(error)") - self.currentActivity = nil - } + await currentActivity.end(nil, dismissalPolicy: .immediate) + self.currentActivity = nil + print("✅ Live Activity ended successfully") } /// Check if Live Activities are available and authorized diff --git a/ios/OpenClimb/Views/AddEdit/AddAttemptView.swift b/ios/OpenClimb/Views/AddEdit/AddAttemptView.swift index a89a576..e113476 100644 --- a/ios/OpenClimb/Views/AddEdit/AddAttemptView.swift +++ b/ios/OpenClimb/Views/AddEdit/AddAttemptView.swift @@ -1,4 +1,3 @@ - import SwiftUI struct AddAttemptView: View { @@ -610,36 +609,25 @@ struct EditAttemptView: View { var body: some View { NavigationView { Form { - Section("Problem") { + Section("Select Problem") { if availableProblems.isEmpty { Text("No problems available") .foregroundColor(.secondary) } else { - ForEach(availableProblems, id: \.id) { problem in - HStack { - VStack(alignment: .leading, spacing: 4) { - Text(problem.name ?? "Unnamed Problem") - .font(.headline) - - Text( - "\(problem.difficulty.system.displayName): \(problem.difficulty.grade)" - ) - .font(.subheadline) - .foregroundColor(.blue) + LazyVGrid( + columns: Array(repeating: GridItem(.flexible(), spacing: 8), count: 2), + spacing: 8 + ) { + ForEach(availableProblems, id: \.id) { problem in + ProblemSelectionCard( + problem: problem, + isSelected: selectedProblem?.id == problem.id + ) { + selectedProblem = problem } - - Spacer() - - if selectedProblem?.id == problem.id { - Image(systemName: "checkmark.circle.fill") - .foregroundColor(.blue) - } - } - .contentShape(Rectangle()) - .onTapGesture { - selectedProblem = problem } } + .padding(.vertical, 8) } } @@ -724,6 +712,7 @@ struct EditAttemptView: View { guard selectedProblem != nil else { return } let updatedAttempt = attempt.updated( + problemId: selectedProblem?.id, result: selectedResult, highestHold: highestHold.isEmpty ? nil : highestHold, notes: notes.isEmpty ? nil : notes, diff --git a/ios/OpenClimb/Views/LiveActivityDebugView.swift b/ios/OpenClimb/Views/LiveActivityDebugView.swift index 88843b6..708aef5 100644 --- a/ios/OpenClimb/Views/LiveActivityDebugView.swift +++ b/ios/OpenClimb/Views/LiveActivityDebugView.swift @@ -128,7 +128,7 @@ struct LiveActivityDebugView: View { .frame(maxWidth: .infinity, alignment: .leading) .padding(8) .id("bottom") - .onChange(of: debugOutput) { _ in + .onChange(of: debugOutput) { withAnimation { proxy.scrollTo("bottom", anchor: .bottom) } diff --git a/ios/SessionStatusLive/SessionStatusLive.swift b/ios/SessionStatusLive/SessionStatusLive.swift index afa3c22..54cba42 100644 --- a/ios/SessionStatusLive/SessionStatusLive.swift +++ b/ios/SessionStatusLive/SessionStatusLive.swift @@ -15,7 +15,7 @@ struct ClimbingStatsProvider: TimelineProvider { ClimbingStatsEntry( date: Date(), weeklyAttempts: 42, - todayAttempts: 8, + weeklySessions: 5, currentStreak: 3, favoriteGym: "Summit Climbing" ) @@ -25,7 +25,7 @@ struct ClimbingStatsProvider: TimelineProvider { let entry = ClimbingStatsEntry( date: Date(), weeklyAttempts: 42, - todayAttempts: 8, + weeklySessions: 5, currentStreak: 3, favoriteGym: "Summit Climbing" ) @@ -41,7 +41,7 @@ struct ClimbingStatsProvider: TimelineProvider { let entry = ClimbingStatsEntry( date: currentDate, weeklyAttempts: stats.weeklyAttempts, - todayAttempts: stats.todayAttempts, + weeklySessions: stats.weeklySessions, currentStreak: stats.currentStreak, favoriteGym: stats.favoriteGym ) @@ -60,7 +60,7 @@ struct ClimbingStatsProvider: TimelineProvider { let attempts = try? JSONDecoder().decode([WidgetAttempt].self, from: attemptsData) else { return ClimbingStats( - weeklyAttempts: 0, todayAttempts: 0, currentStreak: 0, favoriteGym: "No Data") + weeklyAttempts: 0, weeklySessions: 0, currentStreak: 0, favoriteGym: "No Data") } // Load sessions for streak calculation @@ -74,16 +74,16 @@ struct ClimbingStatsProvider: TimelineProvider { let calendar = Calendar.current let now = Date() let weekAgo = calendar.date(byAdding: .day, value: -7, to: now)! - let startOfToday = calendar.startOfDay(for: now) + _ = calendar.startOfDay(for: now) // Calculate weekly attempts let weeklyAttempts = attempts.filter { attempt in attempt.timestamp >= weekAgo }.count - // Calculate today's attempts - let todayAttempts = attempts.filter { attempt in - attempt.timestamp >= startOfToday + // Calculate weekly sessions + let weeklySessions = sessions.filter { session in + session.date >= weekAgo && session.status == "COMPLETED" }.count // Calculate current streak (consecutive days with sessions) @@ -94,7 +94,7 @@ struct ClimbingStatsProvider: TimelineProvider { return ClimbingStats( weeklyAttempts: weeklyAttempts, - todayAttempts: todayAttempts, + weeklySessions: weeklySessions, currentStreak: currentStreak, favoriteGym: favoriteGym ) @@ -144,14 +144,14 @@ struct ClimbingStatsProvider: TimelineProvider { struct ClimbingStatsEntry: TimelineEntry { let date: Date let weeklyAttempts: Int - let todayAttempts: Int + let weeklySessions: Int let currentStreak: Int let favoriteGym: String } struct ClimbingStats { let weeklyAttempts: Int - let todayAttempts: Int + let weeklySessions: Int let currentStreak: Int let favoriteGym: String } @@ -176,7 +176,7 @@ struct SmallWidgetView: View { let entry: ClimbingStatsEntry var body: some View { - VStack(spacing: 8) { + VStack(spacing: 12) { // Header HStack { if let uiImage = UIImage(named: "AppIcon") { @@ -190,51 +190,37 @@ struct SmallWidgetView: View { .foregroundColor(.accentColor) } Spacer() - Text("This Week") - .font(.caption) - .foregroundColor(.secondary) - } - - // Main stat - weekly attempts - VStack(spacing: 2) { - Text("\(entry.weeklyAttempts)") - .font(.largeTitle) - .fontWeight(.bold) - .foregroundColor(.primary) - Text("Attempts") + Text("Weekly") .font(.caption) .foregroundColor(.secondary) } Spacer() - // Bottom stats - HStack { - VStack(alignment: .leading, spacing: 2) { - Text("\(entry.todayAttempts)") - .font(.headline) - .fontWeight(.semibold) - Text("Today") - .font(.caption2) - .foregroundColor(.secondary) + // Main stats - weekly attempts and sessions + VStack(spacing: 16) { + HStack(spacing: 8) { + Image(systemName: "flame.fill") + .foregroundColor(.orange) + .font(.title2) + Text("\(entry.weeklyAttempts)") + .font(.title) + .fontWeight(.bold) + .foregroundColor(.primary) } - Spacer() - - VStack(alignment: .trailing, spacing: 2) { - HStack(spacing: 2) { - Text("\(entry.currentStreak)") - .font(.headline) - .fontWeight(.semibold) - Image(systemName: "flame.fill") - .foregroundColor(.orange) - .font(.caption) - } - Text("Day Streak") - .font(.caption2) - .foregroundColor(.secondary) + HStack(spacing: 8) { + Image(systemName: "play.fill") + .foregroundColor(.blue) + .font(.title2) + Text("\(entry.weeklySessions)") + .font(.title) + .fontWeight(.bold) + .foregroundColor(.primary) } } + + Spacer() } .padding() } @@ -244,7 +230,7 @@ struct MediumWidgetView: View { let entry: ClimbingStatsEntry var body: some View { - VStack(spacing: 12) { + VStack(spacing: 16) { // Header HStack { HStack(spacing: 6) { @@ -258,69 +244,41 @@ struct MediumWidgetView: View { .font(.title2) .foregroundColor(.accentColor) } - Text("Climbing Stats") + Text("Weekly") .font(.headline) .fontWeight(.semibold) } Spacer() - Text("This Week") - .font(.caption) - .foregroundColor(.secondary) } - // Main stats row - HStack(spacing: 20) { - VStack(spacing: 4) { - Text("\(entry.weeklyAttempts)") - .font(.title) - .fontWeight(.bold) - .foregroundColor(.primary) - Text("Total Attempts") - .font(.caption) - .foregroundColor(.secondary) - } - - VStack(spacing: 4) { - Text("\(entry.todayAttempts)") - .font(.title) - .fontWeight(.bold) - .foregroundColor(.blue) - Text("Today") - .font(.caption) - .foregroundColor(.secondary) - } - - VStack(spacing: 4) { - HStack(spacing: 4) { - Text("\(entry.currentStreak)") - .font(.title) - .fontWeight(.bold) - .foregroundColor(.orange) + // Main stats row - weekly attempts and sessions + HStack(spacing: 40) { + VStack(spacing: 8) { + HStack(spacing: 8) { Image(systemName: "flame.fill") .foregroundColor(.orange) - .font(.title3) + .font(.title2) + Text("\(entry.weeklyAttempts)") + .font(.title) + .fontWeight(.bold) + .foregroundColor(.primary) + } + } + + VStack(spacing: 8) { + HStack(spacing: 8) { + Image(systemName: "play.fill") + .foregroundColor(.blue) + .font(.title2) + Text("\(entry.weeklySessions)") + .font(.title) + .fontWeight(.bold) + .foregroundColor(.primary) } - Text("Day Streak") - .font(.caption) - .foregroundColor(.secondary) } } Spacer() - - // Bottom info - HStack { - VStack(alignment: .leading, spacing: 2) { - Text("Favorite Gym") - .font(.caption2) - .foregroundColor(.secondary) - Text(entry.favoriteGym) - .font(.caption) - .fontWeight(.medium) - .lineLimit(1) - } - Spacer() - } } .padding() } @@ -367,14 +325,14 @@ struct WidgetGym: Codable { ClimbingStatsEntry( date: .now, weeklyAttempts: 42, - todayAttempts: 8, + weeklySessions: 5, currentStreak: 3, favoriteGym: "Summit Climbing" ) ClimbingStatsEntry( date: .now, weeklyAttempts: 58, - todayAttempts: 12, + weeklySessions: 8, currentStreak: 5, favoriteGym: "Boulder Zone" )