From 948fff79f3e71cf87d3abad8dc6aa53df48fb222 Mon Sep 17 00:00:00 2001 From: shilangyu Date: Thu, 22 Apr 2021 21:08:30 +0200 Subject: [PATCH] Add deduplication --- lib/pages/communities_list.dart | 2 +- lib/pages/inbox.dart | 4 ++-- lib/pages/search_results.dart | 8 ++++---- lib/widgets/infinite_scroll.dart | 17 +++++++++++------ lib/widgets/sortable_infinite_list.dart | 4 ++-- 5 files changed, 20 insertions(+), 15 deletions(-) diff --git a/lib/pages/communities_list.dart b/lib/pages/communities_list.dart index 5cfea6a..1d82c25 100644 --- a/lib/pages/communities_list.dart +++ b/lib/pages/communities_list.dart @@ -36,7 +36,7 @@ class CommunitiesListPage extends StatelessWidget { ) ], ), - uniqueProp: (item) => item.community.id, + uniqueProp: (item) => item.community.actorId, ), ); } diff --git a/lib/pages/inbox.dart b/lib/pages/inbox.dart index 45fac14..27bf006 100644 --- a/lib/pages/inbox.dart +++ b/lib/pages/inbox.dart @@ -120,7 +120,7 @@ class InboxPage extends HookWidget { canBeMarkedAsRead: true, hideOnRead: unreadOnly.value, ), - uniqueProp: (item) => item.comment.id, + uniqueProp: (item) => item.comment.apId, ), SortableInfiniteList( noItems: const Text('no mentions'), @@ -158,7 +158,7 @@ class InboxPage extends HookWidget { privateMessageView: mv, hideOnRead: unreadOnly.value, ), - uniqueProp: (item) => item.privateMessage.id, + uniqueProp: (item) => item.privateMessage.apId, ), ], ), diff --git a/lib/pages/search_results.dart b/lib/pages/search_results.dart index 4d1e71c..2e871b9 100644 --- a/lib/pages/search_results.dart +++ b/lib/pages/search_results.dart @@ -119,13 +119,13 @@ class _SearchResultsList extends HookWidget { uniqueProp: (item) { switch (type) { case SearchType.comments: - return (item as CommentView).comment.id; + return (item as CommentView).comment.apId; case SearchType.communities: - return (item as CommunityView).community.id; + return (item as CommunityView).community.actorId; case SearchType.posts: - return (item as PostView).post.id; + return (item as PostView).post.apId; case SearchType.users: - return (item as PersonViewSafe).person.id; + return (item as PersonViewSafe).person.actorId; default: return item; } diff --git a/lib/widgets/infinite_scroll.dart b/lib/widgets/infinite_scroll.dart index f613b05..090339d 100644 --- a/lib/widgets/infinite_scroll.dart +++ b/lib/widgets/infinite_scroll.dart @@ -68,25 +68,30 @@ class InfiniteScroll extends HookWidget { // holds unique props of the data final dataSet = useRef(HashSet()); final hasMore = useRef(true); + final page = useRef(1); final isFetching = useRef(false); + final uniquePropFunc = uniqueProp ?? (e) => e as Object; + useEffect(() { if (controller != null) { controller?.clear = () { data.value = []; hasMore.current = true; + page.current = 1; + dataSet.current.clear(); }; } return null; }, []); - final page = data.value.length ~/ batchSize + 1; - return RefreshIndicator( onRefresh: () async { data.value = []; hasMore.current = true; + page.current = 1; + dataSet.current.clear(); await HapticFeedback.mediumImpact(); await Future.delayed(const Duration(seconds: 1)); @@ -116,20 +121,20 @@ class InfiniteScroll extends HookWidget { // if it's already fetching more, skip if (!isFetching.current) { isFetching.current = true; - fetcher(page, batchSize).then((incoming) { + fetcher(page.current, batchSize).then((incoming) { // if got less than the batchSize, mark the list as done if (incoming.length < batchSize) { hasMore.current = false; } final newData = incoming.where( - (e) => !dataSet.current.contains(uniqueProp?.call(e) ?? e), + (e) => !dataSet.current.contains(uniquePropFunc(e)), ); // append new data data.value = [...data.value, ...newData]; - dataSet.current - .addAll(newData.map(uniqueProp ?? (e) => e as Object)); + dataSet.current.addAll(newData.map(uniquePropFunc)); + page.current += 1; }).whenComplete(() => isFetching.current = false); } diff --git a/lib/widgets/sortable_infinite_list.dart b/lib/widgets/sortable_infinite_list.dart index 010701c..f65356f 100644 --- a/lib/widgets/sortable_infinite_list.dart +++ b/lib/widgets/sortable_infinite_list.dart @@ -75,7 +75,7 @@ class InfinitePostList extends SortableInfiniteList { fetcher: fetcher, controller: controller, noItems: const Text('there are no posts'), - uniqueProp: (item) => item.post.id, + uniqueProp: (item) => item.post.apId, ); } @@ -91,6 +91,6 @@ class InfiniteCommentList extends SortableInfiniteList { fetcher: fetcher, controller: controller, noItems: const Text('there are no comments'), - uniqueProp: (item) => item.comment.id, + uniqueProp: (item) => item.comment.apId, ); }