From 7b238f32fd7fd45f513bf8af062c318491cd821d Mon Sep 17 00:00:00 2001 From: Texas0295 Date: Wed, 17 Sep 2025 19:36:51 +0800 Subject: [PATCH] [FIX] chat: fix message pagination logic `loadInitial()` fetched 100 messages while `_page_size` was 20, so `_has_more` turned false too early and history stopped around 10h back. `loadMore()` also used `_currentPage * _page_size` for offset, causing duplicates. Use `_page_size` for initial load and rely on current message count as offset. This removes `_currentPage` entirely and lets older messages load correctly. Signed-off-by: Texas0295 --- lib/screens/chat/room.dart | 68 ++++++++++++++++++-------------------- 1 file changed, 33 insertions(+), 35 deletions(-) diff --git a/lib/screens/chat/room.dart b/lib/screens/chat/room.dart index 8ce1fedb..7332c910 100644 --- a/lib/screens/chat/room.dart +++ b/lib/screens/chat/room.dart @@ -289,7 +289,6 @@ class MessagesNotifier extends _$MessagesNotifier { bool? _withAttachments; late final String _roomId; - int _currentPage = 0; static const int _pageSize = 20; bool _hasMore = true; bool _isSyncing = false; @@ -565,47 +564,46 @@ class MessagesNotifier extends _$MessagesNotifier { } } - Future loadInitial() async { - developer.log('Loading initial messages', name: 'MessagesNotifier'); - if (_searchQuery == null || _searchQuery!.isEmpty) { - syncMessages(); - } - final messages = await _getCachedMessages(offset: 0, take: 100); - _currentPage = 0; - _hasMore = messages.length == _pageSize; - state = AsyncValue.data(messages); +Future loadInitial() async { + developer.log('Loading initial messages', name: 'MessagesNotifier'); + if (_searchQuery == null || _searchQuery!.isEmpty) { + syncMessages(); } - Future loadMore() async { - if (!_hasMore || state is AsyncLoading) return; - developer.log('Loading more messages', name: 'MessagesNotifier'); + final messages = await _getCachedMessages(offset: 0, take: _pageSize); - try { - final currentMessages = state.value ?? []; - _currentPage++; - final newMessages = await listMessages( - offset: _currentPage * _pageSize, - take: _pageSize, - ); + _hasMore = messages.length == _pageSize; - if (newMessages.isEmpty || newMessages.length < _pageSize) { - _hasMore = false; - } + state = AsyncValue.data(messages); +} - state = AsyncValue.data( - _sortMessages([...currentMessages, ...newMessages]), - ); - } catch (err, stackTrace) { - developer.log( - 'Error loading more messages', - name: 'MessagesNotifier', - error: err, - stackTrace: stackTrace, - ); - showErrorAlert(err); - _currentPage--; +Future loadMore() async { + if (!_hasMore || state is AsyncLoading) return; + developer.log('Loading more messages', name: 'MessagesNotifier'); + + try { + final currentMessages = state.value ?? []; + final offset = currentMessages.length; + + final newMessages = await listMessages(offset: offset, take: _pageSize); + + if (newMessages.isEmpty || newMessages.length < _pageSize) { + _hasMore = false; } + + state = AsyncValue.data( + _sortMessages([...currentMessages, ...newMessages]), + ); + } catch (err, stackTrace) { + developer.log( + 'Error loading more messages', + name: 'MessagesNotifier', + error: err, + stackTrace: stackTrace, + ); + showErrorAlert(err); } +} Future sendMessage( String content,