onufitness_mobile/lib/screens/rise/widgets/ongoing_upcoming_pagination_widget.dart
2026-01-13 11:36:24 +05:30

266 lines
10 KiB
Dart

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<ScrollNotification>(
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<ScrollNotification>(
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,
);
}
});
},
),
),
);
},
),
);
}