import 'package:flutter/material.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:onufitness/constants/string_constant.dart'; import 'package:onufitness/screens/rise/controllers/rise_controller.dart'; import 'package:onufitness/screens/rise/views/detailed_rise_screen.dart'; import 'package:onufitness/screens/rise/widgets/challenge_card.dart'; Widget paginationGridView(RiseController controller, bool isOngoing) { final challenges = isOngoing ? controller.ongoingChallenges : controller.upcomingChallenges; final isLoading = isOngoing ? controller.isOngoingLoading : controller.isUpcomingLoading; final hasMoreData = isOngoing ? controller.ongoingHasMoreData : controller.upcomingHasMoreData; return NotificationListener( onNotification: (ScrollNotification scrollInfo) { if (scrollInfo is ScrollEndNotification && scrollInfo.metrics.pixels >= scrollInfo.metrics.maxScrollExtent - 50 && scrollInfo.metrics.pixels > 100 && !isLoading.value && hasMoreData.value) { if (isOngoing) { controller.loadMoreOngoingChallenges(); } else { controller.loadMoreUpcomingChallenges(); } } return false; }, child: GridView.builder( padding: EdgeInsets.all(15.w), gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 2, crossAxisSpacing: 10, mainAxisSpacing: 10, childAspectRatio: 0.8, ), itemCount: challenges.length + (hasMoreData.value ? 1 : 0), itemBuilder: (context, index) { if (index == challenges.length) { return Center( child: isLoading.value ? CircularProgressIndicator() : SizedBox.shrink(), ); } final challenge = challenges[index]; return Padding( padding: EdgeInsets.only(bottom: 12.h), child: InkWell( onTap: () { Get.to( () => ChallengeDetailsScreen( riseController: controller, index: index, challengeItem: challenge, ), ); }, child: isOngoing ? ChallengeCard( tabName: riseExploreTabOngoing, title: challenge.challengeTitle ?? 'Unknown Challenge', category: challenge.fitnessGoalTitle ?? 'General Fitness', participants: '${challenge.totalParticipants ?? 0} Participants', imageUrl: challenge.challengeImageName, onJoinPressed: () { controller .joinChallenge(challengeID: challenge.challengeId!) .then((value) { if (value) { controller.fetchOngoingChallenges( isRefresh: true, ); controller.fetchCreatedChallenges( isRefresh: true, ); controller.fetchJoinedChallenges( isRefresh: true, ); } }); }, isLoading: controller.isJoiningChallengeLoading, challengeID: challenge.challengeId, isChallengeJoined: challenge.isChallengeJoined!, isChallengeStarted: challenge.isChallengeStarted!, ) : ChallengeCard( isLoading: controller.isJoiningChallengeLoading, challengeID: challenge.challengeId, isChallengeJoined: challenge.isChallengeJoined!, isChallengeStarted: challenge.isChallengeStarted!, tabName: riseExploreTabUpcoming, title: challenge.challengeTitle ?? 'Unknown Challenge', category: challenge.fitnessGoalTitle ?? 'General Fitness', participants: '${challenge.totalParticipants ?? 0} Participants', imageUrl: challenge.challengeImageName, onJoinPressed: () { controller .joinChallenge(challengeID: challenge.challengeId!) .then((value) { if (value) { controller.fetchUpcomingChallenges( isRefresh: true, ); controller.fetchCreatedChallenges( isRefresh: true, ); controller.fetchJoinedChallenges( isRefresh: true, ); } }); }, ), ), ); }, ), ); } Widget paginationListView(RiseController controller, bool isOngoing) { final challenges = isOngoing ? controller.ongoingChallenges : controller.upcomingChallenges; final isLoading = isOngoing ? controller.isOngoingLoading : controller.isUpcomingLoading; final hasMoreData = isOngoing ? controller.ongoingHasMoreData : controller.upcomingHasMoreData; return NotificationListener( onNotification: (ScrollNotification scrollInfo) { if (scrollInfo is ScrollEndNotification && scrollInfo.metrics.pixels >= scrollInfo.metrics.maxScrollExtent - 50 && scrollInfo.metrics.pixels > 100 && !isLoading.value && hasMoreData.value) { if (isOngoing) { controller.loadMoreOngoingChallenges(); } else { controller.loadMoreUpcomingChallenges(); } } return false; }, child: ListView.builder( padding: EdgeInsets.all(16.w), itemCount: challenges.length + (hasMoreData.value ? 1 : 0), itemBuilder: (context, index) { if (index == challenges.length) { return Container( padding: EdgeInsets.all(16.h), child: Center( child: isLoading.value ? CircularProgressIndicator(color: Colors.black) : SizedBox.shrink(), ), ); } final challenge = challenges[index]; return Padding( padding: EdgeInsets.only(bottom: 12.h), child: InkWell( onTap: () { Get.to( () => ChallengeDetailsScreen( riseController: controller, index: index, challengeItem: challenge, ), ); }, child: isOngoing ? ChallengeCard( tabName: riseExploreTabOngoing, title: challenge.challengeTitle ?? 'Unknown Challenge', category: challenge.fitnessGoalTitle ?? 'General Fitness', participants: '${challenge.totalParticipants ?? 0} Participants', imageUrl: challenge.challengeImageName, onJoinPressed: () { controller .joinChallenge(challengeID: challenge.challengeId!) .then((value) { if (value) { controller.fetchOngoingChallenges( isRefresh: true, ); controller.fetchCreatedChallenges( isRefresh: true, ); controller.fetchJoinedChallenges( isRefresh: true, ); } }); }, isLoading: controller.isJoiningChallengeLoading, challengeID: challenge.challengeId, isChallengeJoined: challenge.isChallengeJoined!, isChallengeStarted: challenge.isChallengeStarted!, ) : ChallengeCard( isLoading: controller.isJoiningChallengeLoading, challengeID: challenge.challengeId, tabName: riseExploreTabUpcoming, title: challenge.challengeTitle ?? 'Unknown Challenge', category: challenge.fitnessGoalTitle ?? 'General Fitness', participants: '${challenge.totalParticipants ?? 0} Participants', imageUrl: challenge.challengeImageName, isChallengeJoined: challenge.isChallengeJoined!, isChallengeStarted: challenge.isChallengeStarted!, onJoinPressed: () { controller .joinChallenge(challengeID: challenge.challengeId!) .then((value) { if (value) { controller.fetchUpcomingChallenges( isRefresh: true, ); controller.fetchCreatedChallenges( isRefresh: true, ); controller.fetchJoinedChallenges( isRefresh: true, ); } }); }, ), ), ); }, ), ); }