From 90eb891a71a246b6a62baa48464e555fd2477910 Mon Sep 17 00:00:00 2001 From: Jganenokk Date: Tue, 14 Jul 2026 15:48:48 +0700 Subject: [PATCH] =?UTF-8?q?opt:=20=D0=BE=D0=BF=D1=82=D0=B8=D0=BC=D0=B8?= =?UTF-8?q?=D0=B7=D0=B5=D0=B9=D1=88=D0=BE=D0=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/backend/modules/shared_content.dart | 27 ++++++++++++--------- lib/frontend/screens/chats/chat_screen.dart | 18 ++++++-------- lib/frontend/widgets/photo_viewer.dart | 13 +++++++++- 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/lib/backend/modules/shared_content.dart b/lib/backend/modules/shared_content.dart index 5053422..af1545e 100644 --- a/lib/backend/modules/shared_content.dart +++ b/lib/backend/modules/shared_content.dart @@ -139,9 +139,7 @@ class SharedContentModule { final index = _photoIndexes.putIfAbsent(chatId, _ChatPhotoIndex.new); for (var page = 0; page < _photoIndexMaxPages; page++) { - if (index.items.any((i) => i.dedupKey == photoKey)) { - return _snapshot(index); - } + if (index.seen.contains(photoKey)) return _snapshot(index); if (index.reachedEnd) return null; await _nextPhotoPage(chatId, index, resolveAnchor); } @@ -212,17 +210,22 @@ class SharedContentModule { backward: _photoIndexPageSize, ); index.started = true; - - var added = 0; - for (final item in page.items) { - if (!index.seen.add(item.dedupKey)) continue; - index.items.add(item); - added++; - } - index.items.sort((a, b) => b.time.compareTo(a.time)); if (page.total > index.total) index.total = page.total; - if (added == 0) index.reachedEnd = true; + final fresh = []; + for (final item in page.items) { + if (index.seen.add(item.dedupKey)) fresh.add(item); + } + if (fresh.isEmpty) { + index.reachedEnd = true; + return; + } + + final oldest = index.items.isEmpty ? null : index.items.last; + index.items.addAll(fresh); + if (oldest != null && fresh.first.time > oldest.time) { + index.items.sort((a, b) => b.time.compareTo(a.time)); + } } Future fetchMedia({ diff --git a/lib/frontend/screens/chats/chat_screen.dart b/lib/frontend/screens/chats/chat_screen.dart index ccf05b5..8385a87 100644 --- a/lib/frontend/screens/chats/chat_screen.dart +++ b/lib/frontend/screens/chats/chat_screen.dart @@ -957,15 +957,13 @@ class _ChatScreenState extends State ); } - PhotoViewerActions _photoActions() { - return PhotoViewerActions( - goToMessage: _requestGoToMessage, - forward: _forwardMessageById, - delete: (messageId, senderId) => - _confirmDeleteMessage(messageId, senderId == _myId), - viewAllPhotos: () => _openChatInfo(initialTab: ChatInfoTab.media), - ); - } + late final PhotoViewerActions _photoActions = PhotoViewerActions( + goToMessage: _requestGoToMessage, + forward: _forwardMessageById, + delete: (messageId, senderId) => + _confirmDeleteMessage(messageId, senderId == _myId), + viewAllPhotos: () => _openChatInfo(initialTab: ChatInfoTab.media), + ); void _forwardMessageById(String messageId) { final message = _messages.where((m) => m.id == messageId).firstOrNull; @@ -4702,7 +4700,7 @@ class _ChatScreenState extends State nextMessage: nextMessage, chatType: chat?.type ?? 'CHAT', chatId: widget.chatId, - photoActions: _photoActions(), + photoActions: _photoActions, overrideStatus: _effectiveStatus(message), otherReadTime: _otherReadTime, reactionsListenable: _reactionNotifierFor( diff --git a/lib/frontend/widgets/photo_viewer.dart b/lib/frontend/widgets/photo_viewer.dart index 4251737..9496960 100644 --- a/lib/frontend/widgets/photo_viewer.dart +++ b/lib/frontend/widgets/photo_viewer.dart @@ -208,8 +208,19 @@ class _PhotoViewerScreenState extends State { resolveAnchor: () => _resolveAnchor(chatId), ); if (!mounted) return; + + final known = _items.length; + final appended = + known > 0 && + feed.items.length > known && + feed.items[known - 1].dedupKey == _items.last.id; + setState(() { - _items = feed.items.map(_ViewerPhoto.fromFeed).toList(); + if (appended) { + _items.addAll(feed.items.skip(known).map(_ViewerPhoto.fromFeed)); + } else { + _items = feed.items.map(_ViewerPhoto.fromFeed).toList(); + } _total = feed.total; _reachedEnd = feed.reachedEnd; });