Fix the day picker's workout-day dots missing on most days

The decorated-days set was built from dateComponents([.year, .month,
.day], from:) output, which also sets isLeapMonth = false; the day
picker probes it with bare y/m/d components (isLeapMonth nil). The two
compare == but hash differently, so Set.contains missed essentially
every member and dots appeared only on chance hash collisions. Build
the set from bare y/m/d components matching the probe's shape.

Claude-Session: https://claude.ai/code/session_012qw2itfzKyEJ1HpsFt8Ex4
This commit is contained in:
2026-07-11 08:20:39 -04:00
parent f8014e62ac
commit 20d7f00843
+13 -2
View File
@@ -288,9 +288,20 @@ struct TodayView: View {
}
/// Day-precision (year/month/day) components of every day with at least one
/// logged workout the day picker decorates these with a dot.
/// logged workout the day picker decorates these with a dot. Built as *bare*
/// y/m/d components, not `dateComponents([.year, .month, .day], from:)` output:
/// the latter also sets `isLeapMonth = false`, which `==` ignores but hashing
/// doesn't so a bare-components `Set.contains` probe (the day picker's) would
/// miss every member.
private var workoutDays: Set<DateComponents> {
Set(workouts.map { Calendar.current.dateComponents([.year, .month, .day], from: $0.start) })
Set(workouts.map { workout in
let c = Calendar.current.dateComponents([.year, .month, .day], from: workout.start)
var day = DateComponents()
day.year = c.year
day.month = c.month
day.day = c.day
return day
})
}
/// Row icon color: the routine's own color, or the goal's color as a generic