Merge pull request 'FIX/FEED_PAGINATION' (#62) from FIX/FEED_PAGINATION into master
continuous-integration/drone/push Build is passing Details

Reviewed-on: #62
pull/63/head
Emre KARTAL 1 year ago
commit 5efab7ea60

@ -25,7 +25,7 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
late Animation<double> animation; late Animation<double> animation;
late List<Post> friendFeed; late List<Post> friendFeed;
Timer? timer; Timer? timer;
var page = 0; var pageFriend = 0;
late List<Post> discoveryFeed; late List<Post> discoveryFeed;
late Tuple2<List<Post>, List<Post>> displayFeed; late Tuple2<List<Post>, List<Post>> displayFeed;
bool isDismissed = true; bool isDismissed = true;
@ -126,7 +126,7 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
displayFeed = displayFeed =
Tuple2(MyApp.postViewModel.postsFriends.reversed.toList(), MyApp.postViewModel.bestPosts.reversed.toList()); Tuple2(MyApp.postViewModel.postsFriends.toList(), MyApp.postViewModel.bestPosts.toList());
bool empty = bool empty =
(choiceFeed == true && displayFeed.item1.isEmpty) || (choiceFeed == false && displayFeed.item2.isEmpty); (choiceFeed == true && displayFeed.item1.isEmpty) || (choiceFeed == false && displayFeed.item2.isEmpty);
ScrollController _scrollController = ScrollController(); ScrollController _scrollController = ScrollController();
@ -134,6 +134,15 @@ class _FeedScreenState extends State<FeedScreen> with SingleTickerProviderStateM
if (_scrollController.position.maxScrollExtent == if (_scrollController.position.maxScrollExtent ==
_scrollController.position.pixels) { _scrollController.position.pixels) {
print("fin"); print("fin");
if (choiceFeed) {
setState(() {
MyApp.postViewModel.getMorePostsFriends();
});
} else {
setState(() {
MyApp.postViewModel.getMoreBestPosts();
});
}
} }
}); });

@ -42,16 +42,41 @@ class PostService {
deletePost() {} deletePost() {}
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPopularPosts( Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPopularPosts(int limit) async {
{int limit = 10, DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24));
QueryDocumentSnapshot<Map<String, dynamic>>? offset}) async { var response = await FirebaseFirestore.instance
.collection("posts")
.where("date", isGreaterThan: twentyFourHoursAgo)
.orderBy("date", descending: true)
.limit(limit)
.get();
MyApp.postViewModel.lastPostDiscovery = response.docs.isNotEmpty
? response.docs.last
: MyApp.postViewModel.lastPostDiscovery;
var filteredPosts = response.docs.where((doc) {
String user = doc["user_id"];
return user != MyApp.userViewModel.userCurrent.id;
}).toList();
return filteredPosts;
}
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getMorePopularPosts(int limit) async {
DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24));
QuerySnapshot<Map<String, dynamic>> response; QuerySnapshot<Map<String, dynamic>> response;
response = await FirebaseFirestore.instance response = await FirebaseFirestore.instance
.collection("posts") .collection("posts")
.orderBy("date") .where("date", isGreaterThan: twentyFourHoursAgo)
.orderBy("date", descending: true)
.limit(limit) .limit(limit)
.startAfterDocument(MyApp.postViewModel.lastPostDiscovery)
.get(); .get();
MyApp.postViewModel.lastPostDiscovery = response.docs.isNotEmpty
? response.docs.last
: MyApp.postViewModel.lastPostDiscovery;
var filteredPosts = response.docs.where((doc) { var filteredPosts = response.docs.where((doc) {
String user = doc["user_id"]; String user = doc["user_id"];
return user != MyApp.userViewModel.userCurrent.id; return user != MyApp.userViewModel.userCurrent.id;
@ -59,18 +84,41 @@ class PostService {
return filteredPosts; return filteredPosts;
} }
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPostsFriends( Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getPostsFriends(int limit) async {
{int limit = 10, int offset = 0}) async {
var response = await FirebaseFirestore.instance var response = await FirebaseFirestore.instance
.collection("posts") .collection("posts")
.where("user_id", whereIn: [ .where("user_id", whereIn: [
MyApp.userViewModel.userCurrent.id, MyApp.userViewModel.userCurrent.id,
...MyApp.userViewModel.userCurrent.followed ...MyApp.userViewModel.userCurrent.followed
]) ])
.orderBy("date") .where("")
.orderBy("date", descending: true)
.limit(limit) .limit(limit)
.get(); .get();
MyApp.postViewModel.lastPostFriend = response.docs.isNotEmpty
? response.docs.last
: MyApp.postViewModel.lastPostFriend;
return response.docs;
}
Future<List<QueryDocumentSnapshot<Map<String, dynamic>>>> getMorePostsFriends(int limit) async {
var response = await FirebaseFirestore.instance
.collection("posts")
.where("user_id", whereIn: [
MyApp.userViewModel.userCurrent.id,
...MyApp.userViewModel.userCurrent.followed
])
.orderBy("date", descending: true)
.limit(limit)
.startAfterDocument(MyApp.postViewModel.lastPostFriend)
.get();
MyApp.postViewModel.lastPostFriend = response.docs.isNotEmpty
? response.docs.last
: MyApp.postViewModel.lastPostFriend;
return response.docs; return response.docs;
} }

@ -11,6 +11,8 @@ import '../model/mapper/PostMapper.dart';
class PostViewModel { class PostViewModel {
List<Post> _postsFriends = []; List<Post> _postsFriends = [];
List<Post> _bestPosts = []; List<Post> _bestPosts = [];
var lastPostFriend;
var lastPostDiscovery;
final PostService _postService = PostService(); final PostService _postService = PostService();
// Constructor // Constructor
@ -26,10 +28,10 @@ class PostViewModel {
await _postService.createPost(description, idMusic, image, location); await _postService.createPost(description, idMusic, image, location);
} }
Future<List<Post>> getPostsFriends() async { Future<List<Post>> getPostsFriends({int limit = 10}) async {
try { try {
_postsFriends = []; _postsFriends = [];
var responseData = await _postService.getPostsFriends(); var responseData = await _postService.getPostsFriends(limit);
List<String> ids = []; List<String> ids = [];
var postsFutures = responseData.map((value) { var postsFutures = responseData.map((value) {
ids.add(value.data()["song_id"]); ids.add(value.data()["song_id"]);
@ -40,7 +42,7 @@ class PostViewModel {
for (int i = 0; i < posts.length; i++) { for (int i = 0; i < posts.length; i++) {
posts[i].music = musics[i]; posts[i].music = musics[i];
} }
_postsFriends = posts; _postsFriends.addAll(posts);
return _postsFriends; return _postsFriends;
} catch (e) { } catch (e) {
print(e); print(e);
@ -49,13 +51,29 @@ class PostViewModel {
} }
} }
List<Post> getMorePostsFriends() { void getMorePostsFriends({int limit = 10}) async {
throw new Error(); try {
var responseData = await _postService.getMorePostsFriends(limit);
List<String> ids = [];
var postsFutures = responseData.map((value) {
ids.add(value.data()["song_id"]);
return PostMapper.toModel(value);
}).toList();
var posts = await Future.wait(postsFutures);
List<Music> musics = await MyApp.musicViewModel.getMusicsWithIds(ids);
for (int i = 0; i < posts.length; i++) {
posts[i].music = musics[i];
}
_postsFriends.addAll(posts);
} catch (e) {
print(e);
}
} }
Future<List<Post>> getBestPosts() async { Future<List<Post>> getBestPosts({int limit = 10}) async {
try { try {
var responseData = await _postService.getPopularPosts(); _bestPosts = [];
var responseData = await _postService.getPopularPosts(limit);
List<String> ids = []; List<String> ids = [];
var postsFutures = responseData.map((value) async { var postsFutures = responseData.map((value) async {
ids.add(value.data()["song_id"]); ids.add(value.data()["song_id"]);
@ -66,7 +84,7 @@ class PostViewModel {
for (int i = 0; i < posts.length; i++) { for (int i = 0; i < posts.length; i++) {
posts[i].music = musics[i]; posts[i].music = musics[i];
} }
_bestPosts = posts; _bestPosts.addAll(posts);
return _bestPosts; return _bestPosts;
} catch (e) { } catch (e) {
print(e); print(e);
@ -75,8 +93,23 @@ class PostViewModel {
} }
} }
List<Post> getMoreBestPosts() { void getMoreBestPosts({int limit = 10}) async {
throw new Error(); try {
var responseData = await _postService.getMorePopularPosts(limit);
List<String> ids = [];
var postsFutures = responseData.map((value) async {
ids.add(value.data()["song_id"]);
return await PostMapper.toModel(value);
}).toList();
var posts = await Future.wait(postsFutures);
List<Music> musics = await MyApp.musicViewModel.getMusicsWithIds(ids);
for (int i = 0; i < posts.length; i++) {
posts[i].music = musics[i];
}
_bestPosts.addAll(posts);
} catch (e) {
print(e);
}
} }
Future<List<bool>> recapSevenDays(String id) async { Future<List<bool>> recapSevenDays(String id) async {

Loading…
Cancel
Save