Stop the text branch's retry storm, pin the observer re-root

Fixkamo-internal
Shipped
26 Agosti 2026, 08:05 UTC
Author
kamo
Commit
cb7962f

voipApi.getConversations goes through apiCall, which throws on any non-2xx — unlike loadMore's other two branches, which fetch() directly and check res.ok. The text branch had no catch around it, so a backend 500 became an unhandled promise rejection, hasMore never flipped false, and the sentinel's IntersectionObserver kept re-firing the same failing call forever. It now catches and degrades exactly like its siblings: stop pagination, keep whatever rows are already loaded, never throw. Also adds coverage the extraction out of the old chats-list component never got: that the sentinel's IntersectionObserver effect actually re-roots once scrollRoot.current is populated on a later render (a scroll-root ref that starts null and never gets a real re-render checked would otherwise root the observer on the viewport forever — the exact bug this hook exists to avoid). That behavior was already correct; this test only closes the gap that it was untested. A mutation check (scrollRoot.current -> scrollRoot in the deps array) confirmed the new test actually fails against that regression.

All changes

Je, unaona nini kuhusu usafiri?

Kila moja ya hizi updates ardhi katika nafasi yako ya kazi moja kwa moja. Kuanza bure na kuangalia kukua wiki baada ya wiki.

Kuwa Huru MileleMtazamo wa bei