opt: оптимизейшон
This commit is contained in:
@@ -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 = <SharedMediaItem>[];
|
||||
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<SharedMediaPage> fetchMedia({
|
||||
|
||||
@@ -957,15 +957,13 @@ class _ChatScreenState extends State<ChatScreen>
|
||||
);
|
||||
}
|
||||
|
||||
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<ChatScreen>
|
||||
nextMessage: nextMessage,
|
||||
chatType: chat?.type ?? 'CHAT',
|
||||
chatId: widget.chatId,
|
||||
photoActions: _photoActions(),
|
||||
photoActions: _photoActions,
|
||||
overrideStatus: _effectiveStatus(message),
|
||||
otherReadTime: _otherReadTime,
|
||||
reactionsListenable: _reactionNotifierFor(
|
||||
|
||||
@@ -208,8 +208,19 @@ class _PhotoViewerScreenState extends State<PhotoViewerScreen> {
|
||||
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;
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user