По логам видно, что у вас вместо 2 2 приходит 2 3 (page 3)
Вообще, слушать событие скролла больно, потому что слушатель отрабатывает чуть ли не на каждый проскроленный пиксель. Я думаю, происходит следующее:
Первый раз scrollPosts вызывается 2 раза почти одновременно, поэтому в серверном логе вы 2 раза видите параметры 2 1
Когда оба запроса вернутся с ответом, пейдж в стейте 2 раза увеличится на 1
Следующий запрос отправится уже с пейдж = 3, а столько данных у вас нет
Рекомендую погуглить "infinity scroll intersection observer", сейчас подгрузку чаще всего делают так
Или после первого срабатывания эффекта обнулять флаг fetching:
React.useEffect(() => {
if (fetching) {
...
}
setFetching(false);
}, [fetching]);