fix: scroll direction check always failed — read prevMinY before write
All checks were successful
Security Checks / dependency-audit (push) Successful in 14s
Security Checks / secret-scanning (push) Successful in 4s
Security Checks / dockerfile-lint (push) Successful in 4s

Bug: lastKnownMinY[entryId] was set to newMinY on line 83, then
read back on line 97 to check direction. Since it was just set to
newMinY, the check (lastKnownMinY[entryId] <= newMinY) was always
true, making isMovingUp always true, so the guard always failed.

Fix: Read prevMinY BEFORE writing newMinY. Compute isScrollingDown
from the delta between prev and new. Use that boolean in the guard.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Yusuf Suleman
2026-04-04 00:08:57 -05:00
parent 6cff4a9036
commit 78ee06695b

View File

@@ -69,17 +69,21 @@ struct EntryListView: View {
guard entryHeight > 0 else { return }
// --- Scroll direction + activation ---
if let prev = lastKnownMinY[entryId] {
let prevMinY = lastKnownMinY[entryId]
let isScrollingDown: Bool
if let prev = prevMinY {
let delta = prev - newMinY // positive = scrolling down
if delta > 2 {
isScrollingDown = delta > 2
if isScrollingDown {
cumulativeDown += delta
if cumulativeDown > activationThreshold {
trackingActive = true
}
}
// Don't reset trackingActive on upward scroll
// just don't mark anything. Keeps cumulative progress.
} else {
isScrollingDown = false
}
// Store AFTER reading previous value
lastKnownMinY[entryId] = newMinY
// --- Visibility tracking ---
@@ -92,11 +96,8 @@ struct EntryListView: View {
}
// --- Mark-as-read ---
// Current scroll direction for THIS entry is "down"
// if its minY decreased since last check
let isMovingUp = (lastKnownMinY[entryId] ?? 0) <= newMinY
guard trackingActive,
!isMovingUp,
isScrollingDown,
!entry.isRead,
!markedByScroll.contains(entryId),
wasVisible.contains(entryId),