diff --git a/covas_mobile/lib/pages/ListItemByOrganizers.dart b/covas_mobile/lib/pages/ListItemByOrganizers.dart index 3a89580..23f0c26 100644 --- a/covas_mobile/lib/pages/ListItemByOrganizers.dart +++ b/covas_mobile/lib/pages/ListItemByOrganizers.dart @@ -42,17 +42,62 @@ class ListItemOrganizers extends StatefulWidget { // homepage state class _MyHomePageState extends State { + int _fetchCount = 0; + bool _isLoading = false; + late ScrollController _scrollController; + final AuthService _authService = AuthService(); + void _incrementFetchCount() { + setState(() { + _fetchCount++; + }); + } + + void _decrementFetchCount() { + setState(() { + if (_fetchCount > 0) { + _fetchCount--; + } + }); + } + + void _scrollListener() { + if (_scrollController.position.pixels == + _scrollController.position.maxScrollExtent) { + _incrementFetchCount(); + } else if (_scrollController.position.pixels == + _scrollController.position.minScrollExtent) { + _decrementFetchCount(); + } + _fetchData(); + } + + Future _fetchData() async { + print("Counter : ${_fetchCount}"); + if (_isLoading) return; + setState(() { + _isLoading = true; + }); + + await Future.delayed(Duration(seconds: 2)); + getPosts(widget.organizer, count: _fetchCount); + + setState(() { + _isLoading = false; + }); + } + // variable to call and store future list of posts // function to fetch data from api and return future list of posts - static Future> getPosts(organizer) async { + static Future> getPosts(organizer, {count = 0}) async { SharedPreferences prefs = await SharedPreferences.getInstance(); var accessToken = prefs.getString("access_token") ?? ""; final List body = []; if (accessToken.isNotEmpty) { - var url = Uri.parse("${globals.api}/events?organizers=${organizer}"); + var url = Uri.parse( + "${globals.api}/events?organizers=${organizer}&skip=${count}"); final response = await http.get(url, headers: { "Content-Type": "application/json", HttpHeaders.cookieHeader: "access_token=${accessToken}" @@ -67,6 +112,14 @@ class _MyHomePageState extends State { void initState() { super.initState(); _authService.checkTokenStatus(context); + _scrollController = ScrollController(); + _scrollController.addListener(_scrollListener); + } + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); } // build function @@ -109,7 +162,10 @@ class _MyHomePageState extends State { foregroundColor: Colors.white, ), body: ListView.separated( - itemCount: posts.length, + controller: _scrollController, + itemCount: posts.isNotEmpty + ? posts.length + (_isLoading ? 1 : 0) // Add 1 only if loading + : 0, itemBuilder: (context, index) { final post = posts[index]; final startDate = DateTime.parse(post.startDate!); diff --git a/covas_mobile/lib/pages/ListItemByTags.dart b/covas_mobile/lib/pages/ListItemByTags.dart index 3866cc9..5844cbe 100644 --- a/covas_mobile/lib/pages/ListItemByTags.dart +++ b/covas_mobile/lib/pages/ListItemByTags.dart @@ -44,15 +44,59 @@ class ListItemTags extends StatefulWidget { class _MyHomePageState extends State { // variable to call and store future list of posts + int _fetchCount = 0; + bool _isLoading = false; + late ScrollController _scrollController; + final AuthService _authService = AuthService(); + void _incrementFetchCount() { + setState(() { + _fetchCount++; + }); + } + + void _decrementFetchCount() { + setState(() { + if (_fetchCount > 0) { + _fetchCount--; + } + }); + } + + void _scrollListener() { + if (_scrollController.position.pixels == + _scrollController.position.maxScrollExtent) { + _incrementFetchCount(); + } else if (_scrollController.position.pixels == + _scrollController.position.minScrollExtent) { + _decrementFetchCount(); + } + _fetchData(); + } + + Future _fetchData() async { + print("Counter : ${_fetchCount}"); + if (_isLoading) return; + setState(() { + _isLoading = true; + }); + + await Future.delayed(Duration(seconds: 2)); + getPosts(widget.tags, count: _fetchCount); + + setState(() { + _isLoading = false; + }); + } + // function to fetch data from api and return future list of posts - static Future> getPosts(tags) async { + static Future> getPosts(tags, {count = 0}) async { SharedPreferences prefs = await SharedPreferences.getInstance(); var accessToken = prefs.getString("access_token") ?? ""; final List body = []; if (accessToken.isNotEmpty) { - var url = Uri.parse("${globals.api}/events?tags=${tags}"); + var url = Uri.parse("${globals.api}/events?tags=${tags}&skip=${count}"); final response = await http.get(url, headers: { "Content-Type": "application/json", HttpHeaders.cookieHeader: "access_token=${accessToken}" @@ -67,6 +111,15 @@ class _MyHomePageState extends State { void initState() { super.initState(); _authService.checkTokenStatus(context); + _authService.checkTokenStatus(context); + _scrollController = ScrollController(); + _scrollController.addListener(_scrollListener); + } + + @override + void dispose() { + _scrollController.dispose(); + super.dispose(); } // build function @@ -108,7 +161,10 @@ class _MyHomePageState extends State { foregroundColor: Colors.white, ), body: ListView.separated( - itemCount: posts.length, + controller: _scrollController, + itemCount: posts.isNotEmpty + ? posts.length + (_isLoading ? 1 : 0) // Add 1 only if loading + : 0, itemBuilder: (context, index) { final post = posts[index]; final startDate = DateTime.parse(post.startDate!);