diff --git a/Sources/justMUSIC/lib/screens/feed_screen.dart b/Sources/justMUSIC/lib/screens/feed_screen.dart index d20c400..1a38fbd 100644 --- a/Sources/justMUSIC/lib/screens/feed_screen.dart +++ b/Sources/justMUSIC/lib/screens/feed_screen.dart @@ -25,7 +25,7 @@ class _FeedScreenState extends State with SingleTickerProviderStateM late Animation animation; late List friendFeed; Timer? timer; - var page = 0; + var pageFriend = 0; late List discoveryFeed; late Tuple2, List> displayFeed; bool isDismissed = true; @@ -126,7 +126,7 @@ class _FeedScreenState extends State with SingleTickerProviderStateM @override Widget build(BuildContext context) { displayFeed = - Tuple2(MyApp.postViewModel.postsFriends.reversed.toList(), MyApp.postViewModel.bestPosts.reversed.toList()); + Tuple2(MyApp.postViewModel.postsFriends.toList(), MyApp.postViewModel.bestPosts.toList()); bool empty = (choiceFeed == true && displayFeed.item1.isEmpty) || (choiceFeed == false && displayFeed.item2.isEmpty); ScrollController _scrollController = ScrollController(); @@ -134,6 +134,15 @@ class _FeedScreenState extends State with SingleTickerProviderStateM if (_scrollController.position.maxScrollExtent == _scrollController.position.pixels) { print("fin"); + if (choiceFeed) { + setState(() { + MyApp.postViewModel.getMorePostsFriends(); + }); + } else { + setState(() { + MyApp.postViewModel.getMoreBestPosts(); + }); + } } }); diff --git a/Sources/justMUSIC/lib/services/PostService.dart b/Sources/justMUSIC/lib/services/PostService.dart index 28557a8..a180f40 100644 --- a/Sources/justMUSIC/lib/services/PostService.dart +++ b/Sources/justMUSIC/lib/services/PostService.dart @@ -42,16 +42,41 @@ class PostService { deletePost() {} - Future>>> getPopularPosts( - {int limit = 10, - QueryDocumentSnapshot>? offset}) async { + Future>>> getPopularPosts(int limit) async { + DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24)); + 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>>> getMorePopularPosts(int limit) async { + DateTime twentyFourHoursAgo = DateTime.now().subtract(Duration(hours: 24)); QuerySnapshot> response; response = await FirebaseFirestore.instance .collection("posts") - .orderBy("date") + .where("date", isGreaterThan: twentyFourHoursAgo) + .orderBy("date", descending: true) .limit(limit) + .startAfterDocument(MyApp.postViewModel.lastPostDiscovery) .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; @@ -59,18 +84,41 @@ class PostService { return filteredPosts; } - Future>>> getPostsFriends( - {int limit = 10, int offset = 0}) async { + Future>>> getPostsFriends(int limit) async { var response = await FirebaseFirestore.instance .collection("posts") .where("user_id", whereIn: [ MyApp.userViewModel.userCurrent.id, ...MyApp.userViewModel.userCurrent.followed ]) - .orderBy("date") + .where("") + .orderBy("date", descending: true) .limit(limit) .get(); + MyApp.postViewModel.lastPostFriend = response.docs.isNotEmpty + ? response.docs.last + : MyApp.postViewModel.lastPostFriend; + + return response.docs; + } + + Future>>> 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; } diff --git a/Sources/justMUSIC/lib/view_model/PostViewModel.dart b/Sources/justMUSIC/lib/view_model/PostViewModel.dart index 1c2a361..061f7d3 100644 --- a/Sources/justMUSIC/lib/view_model/PostViewModel.dart +++ b/Sources/justMUSIC/lib/view_model/PostViewModel.dart @@ -11,6 +11,8 @@ import '../model/mapper/PostMapper.dart'; class PostViewModel { List _postsFriends = []; List _bestPosts = []; + var lastPostFriend; + var lastPostDiscovery; final PostService _postService = PostService(); // Constructor @@ -26,10 +28,10 @@ class PostViewModel { await _postService.createPost(description, idMusic, image, location); } - Future> getPostsFriends() async { + Future> getPostsFriends({int limit = 10}) async { try { _postsFriends = []; - var responseData = await _postService.getPostsFriends(); + var responseData = await _postService.getPostsFriends(limit); List ids = []; var postsFutures = responseData.map((value) { ids.add(value.data()["song_id"]); @@ -40,7 +42,7 @@ class PostViewModel { for (int i = 0; i < posts.length; i++) { posts[i].music = musics[i]; } - _postsFriends = posts; + _postsFriends.addAll(posts); return _postsFriends; } catch (e) { print(e); @@ -49,13 +51,29 @@ class PostViewModel { } } - List getMorePostsFriends() { - throw new Error(); + void getMorePostsFriends({int limit = 10}) async { + try { + var responseData = await _postService.getMorePostsFriends(limit); + List ids = []; + var postsFutures = responseData.map((value) { + ids.add(value.data()["song_id"]); + return PostMapper.toModel(value); + }).toList(); + var posts = await Future.wait(postsFutures); + List 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> getBestPosts() async { + Future> getBestPosts({int limit = 10}) async { try { - var responseData = await _postService.getPopularPosts(); + _bestPosts = []; + var responseData = await _postService.getPopularPosts(limit); List ids = []; var postsFutures = responseData.map((value) async { ids.add(value.data()["song_id"]); @@ -66,7 +84,7 @@ class PostViewModel { for (int i = 0; i < posts.length; i++) { posts[i].music = musics[i]; } - _bestPosts = posts; + _bestPosts.addAll(posts); return _bestPosts; } catch (e) { print(e); @@ -75,8 +93,23 @@ class PostViewModel { } } - List getMoreBestPosts() { - throw new Error(); + void getMoreBestPosts({int limit = 10}) async { + try { + var responseData = await _postService.getMorePopularPosts(limit); + List 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 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> recapSevenDays(String id) async {