- 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.