fix: codebase audit fixes — safety, accessibility, and production hygiene
Address 16 issues from external audit: - Move StoreKit transaction listener ownership to StoreManager singleton with proper deinit - Remove noisy VoiceOver announcements, add missing accessibility on StatPill and BootstrapLoadingView - Replace String @retroactive Identifiable with IdentifiableShareCode wrapper - Add crash guard in AchievementEngine getContributingVisitIds + cache stadium lookups - Pre-compute GamesHistoryViewModel filtered properties to avoid redundant SwiftUI recomputation - Remove force-unwraps in ProgressMapView with safe guard-let fallback - Add diff-based update gating in ItineraryTableViewWrapper to prevent unnecessary reloads - Replace deprecated UIScreen.main with UIWindowScene lookup - Add deinit task cancellation in ScheduleViewModel and SuggestedTripsGenerator - Wrap ~234 unguarded print() calls across 27 files in #if DEBUG Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -636,27 +636,37 @@ nonisolated struct CKTripPoll {
|
||||
guard let pollIdString = record[CKTripPoll.pollIdKey] as? String,
|
||||
let pollId = UUID(uuidString: pollIdString)
|
||||
else {
|
||||
#if DEBUG
|
||||
print("CKTripPoll.toPoll: Failed to parse pollId")
|
||||
#endif
|
||||
return nil
|
||||
}
|
||||
|
||||
guard let title = record[CKTripPoll.titleKey] as? String else {
|
||||
#if DEBUG
|
||||
print("CKTripPoll.toPoll: Missing title for poll \(pollId)")
|
||||
#endif
|
||||
return nil
|
||||
}
|
||||
|
||||
guard let ownerId = record[CKTripPoll.ownerIdKey] as? String else {
|
||||
#if DEBUG
|
||||
print("CKTripPoll.toPoll: Missing ownerId for poll \(pollId)")
|
||||
#endif
|
||||
return nil
|
||||
}
|
||||
|
||||
guard let shareCode = record[CKTripPoll.shareCodeKey] as? String else {
|
||||
#if DEBUG
|
||||
print("CKTripPoll.toPoll: Missing shareCode for poll \(pollId)")
|
||||
#endif
|
||||
return nil
|
||||
}
|
||||
|
||||
guard let createdAt = record[CKTripPoll.createdAtKey] as? Date else {
|
||||
#if DEBUG
|
||||
print("CKTripPoll.toPoll: Missing createdAt for poll \(pollId)")
|
||||
#endif
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -669,11 +679,15 @@ nonisolated struct CKTripPoll {
|
||||
do {
|
||||
tripSnapshots = try JSONDecoder().decode([Trip].self, from: tripsData)
|
||||
} catch {
|
||||
#if DEBUG
|
||||
print("CKTripPoll.toPoll: Failed to decode tripSnapshots for poll \(pollId): \(error)")
|
||||
#endif
|
||||
// Return poll with empty trips rather than failing completely
|
||||
}
|
||||
} else {
|
||||
#if DEBUG
|
||||
print("CKTripPoll.toPoll: Missing tripSnapshots data for poll \(pollId)")
|
||||
#endif
|
||||
}
|
||||
|
||||
var poll = TripPoll(
|
||||
|
||||
Reference in New Issue
Block a user