2026-01-13 11:36:24 +05:30

145 lines
5.2 KiB
Dart

import 'package:flutter/material.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:get/get.dart';
import 'package:onufitness/constants/color_constant.dart';
import 'package:onufitness/constants/text_constant.dart';
import 'package:onufitness/screens/rise/widgets/ongoing_upcoming_pagination_widget.dart';
import 'package:onufitness/utils/helper_function.dart';
import 'package:onufitness/screens/rise/controllers/rise_controller.dart';
class UpcomingTab extends StatelessWidget {
const UpcomingTab({super.key});
@override
Widget build(BuildContext context) {
final RiseController controller = Get.find<RiseController>();
return GestureDetector(
onTap: () {
FocusScope.of(context).unfocus();
},
child: Column(
children: [
// Search bar
Container(
margin: EdgeInsets.symmetric(horizontal: 16.w, vertical: 8.h),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12.r),
),
child: TextField(
controller: controller.upcomingSearchController,
textInputAction: TextInputAction.search,
onSubmitted: (value) {
FocusScope.of(context).unfocus();
},
onChanged: (value) {
controller.upcomingSearchText.value = value;
},
decoration: InputDecoration(
hintText: 'Search Challenges..',
hintStyle: TextStyle(
color: lightGreyColor,
fontSize: smallSizeText,
),
prefixIcon: Icon(
Icons.search,
color: lightGreyColor,
size: 20.sp,
),
suffixIcon: Obx(() {
return controller.upcomingSearchText.value != ""
? GestureDetector(
onTap: () {
controller.clearUpcomingSearch();
controller.upcomingSearchText.value = "";
FocusScope.of(context).unfocus();
},
child: Icon(
Icons.clear,
color: Color(darkGreyColor),
size: 20.sp,
),
)
: SizedBox.shrink();
}),
enabledBorder: OutlineInputBorder(
borderSide: BorderSide(color: lightGreyColor),
borderRadius: BorderRadius.circular(8.r),
),
focusedBorder: OutlineInputBorder(
borderSide: BorderSide(color: lightGreyColor),
borderRadius: BorderRadius.circular(8.r),
),
contentPadding: EdgeInsets.symmetric(
horizontal: 16.w,
vertical: 12.h,
),
filled: true,
fillColor: Colors.white,
),
),
),
Expanded(
child: Obx(() {
if (controller.upcomingChallenges.isEmpty &&
controller.isUpcomingLoading.value) {
return Center(child: CircularProgressIndicator());
}
if (controller.upcomingChallenges.isEmpty) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.search_off, size: 64.sp, color: Colors.grey),
SizedBox(height: 16.h),
Text(
'No upcoming challenges found',
style: TextStyle(
fontSize: 16.sp,
color: Colors.grey[600],
),
),
SizedBox(height: 8.h),
ElevatedButton(
onPressed: () => controller.refreshUpcomingChallenges(),
style: ElevatedButton.styleFrom(
backgroundColor: Colors.white,
padding: EdgeInsets.symmetric(
horizontal: 24.w,
vertical: 12.h,
),
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(30.r),
),
elevation: 5,
shadowColor: Colors.black26,
),
child: Icon(Icons.refresh),
),
],
),
);
}
return RefreshIndicator(
onRefresh: () async {
controller.refreshUpcomingChallenges();
},
child:
isTablet
? paginationGridView(controller, false)
: paginationListView(controller, false),
);
}),
),
],
),
);
}
}