Follow-up from #1297 (not a merge blocker).
Evidence
src/screens/chat.screen.tsx:187 (scrollToBottom) calls scrollIntoView({ behavior: 'smooth' }) and then immediately clearUnreadMarkers().
If the customer interrupts the animation (touch, wheel, resize), they can remain above the new messages while the New divider and unread count are already gone. A programmatic scroll can also flip isNearBottomRef mid-animation and treat the next arrival as unread.
Suggested fix
Clear unread markers only when handleThreadScroll observes isScrollNearBottom(...) === true. Keep “auto-following” distinct from a deliberate scroll-up.
Follow-up from #1297 (not a merge blocker).
Evidence
src/screens/chat.screen.tsx:187(scrollToBottom) callsscrollIntoView({ behavior: 'smooth' })and then immediatelyclearUnreadMarkers().If the customer interrupts the animation (touch, wheel, resize), they can remain above the new messages while the New divider and unread count are already gone. A programmatic scroll can also flip
isNearBottomRefmid-animation and treat the next arrival as unread.Suggested fix
Clear unread markers only when
handleThreadScrollobservesisScrollNearBottom(...) === true. Keep “auto-following” distinct from a deliberate scroll-up.