import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import 'package:tm_app/core/constants/assets.dart'; import 'package:tm_app/core/constants/strings.dart'; import 'package:tm_app/core/routes/app_routes.dart'; import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/utils/size_config.dart'; import 'package:tm_app/data/services/model/home/home_response/home_response_model.dart'; import 'package:tm_app/view_models/home_view_model.dart'; import 'package:tm_app/views/home/widgets/notification_card.dart'; import 'package:tm_app/views/shared/tender_app_bar.dart'; import '../widgets.dart'; class MobileHomePage extends StatelessWidget { const MobileHomePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( appBar: tenderMobileAppBar(title: AppStrings.home), body: Consumer( builder: (context, homeViewModel, child) { if (homeViewModel.isLoading) { return const Center( child: CircularProgressIndicator(color: AppColors.secondary50), ); } if (homeViewModel.errorMessage != null) { return Center(child: Text(homeViewModel.errorMessage!)); } if (homeViewModel.homeResponse != null) { return SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox(height: 18.0.h()), NotificationCard(), SizedBox(height: 32.0.h()), _progressBarsRow(homeViewModel.homeResponse!), SizedBox(height: 32.0.h()), _firstTenderCardsRow(context, homeViewModel.homeResponse!), SizedBox(height: 8.0.h()), _secondTenderCardsRow(homeViewModel.homeResponse!), SizedBox(height: 40.0.h()), _yourTenderText(homeViewModel), _bottomListView(homeViewModel), ], ), ); } return const Center( child: CircularProgressIndicator(color: AppColors.secondary50), ); }, ), ); } Widget _progressBarsRow(HomeResponseModel homeResponse) { return Padding( padding: EdgeInsets.symmetric(horizontal: 24.0.w()), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ ProgressBarColumn( text: AppStrings.partnership, value: double.parse(homeResponse.partnership ?? '0'), amount: '${homeResponse.partnership}%', ), ProgressBarColumn( text: AppStrings.selfApply, value: double.parse(homeResponse.selfApply ?? '0'), amount: homeResponse.selfApply ?? '0', ), ProgressBarColumn( text: AppStrings.contracting, value: double.parse(homeResponse.contracting ?? '0'), amount: homeResponse.contracting ?? '0', ), ], ), ); } Widget _firstTenderCardsRow( BuildContext context, HomeResponseModel homeResponse, ) { return Padding( padding: EdgeInsets.symmetric(horizontal: 24.0.w()), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ TenderCard( backgroundColor: AppColors.primary20, iconPath: AssetsManager.arrows, title: AppStrings.tenderSubmitted, amount: homeResponse.tenderSubmitted ?? '0', textColor: Color(0xFF0164FF), enableTap: true, onTap: () { YourTendersRouteData().push(context); }, ), TenderCard( backgroundColor: AppColors.primary10, iconPath: AssetsManager.thumb, title: AppStrings.approvedTenders, amount: homeResponse.approvedTenders ?? '0', textColor: Color(0xFF24848E), enableTap: true, onTap: () { YourTendersRouteData().push(context); }, ), ], ), ); } Widget _secondTenderCardsRow(HomeResponseModel homeResponse) { return Padding( padding: EdgeInsets.symmetric(horizontal: 24.0.w()), child: Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ TenderCard( backgroundColor: AppColors.orange10, iconPath: AssetsManager.shield, title: AppStrings.tenderValue, amount: homeResponse.tenderValue ?? '0', textColor: Color(0xFFE5821E), enableTap: true, onTap: () {}, ), TenderCard( backgroundColor: AppColors.grey10, iconPath: AssetsManager.edit, title: AppStrings.thunderStatus, amount: homeResponse.thunderStatus ?? '0', textColor: Color(0xFF9E9E9E), enableTap: false, onTap: () {}, ), ], ), ); } Widget _yourTenderText(HomeViewModel homeViewModel) { final isYourTenders = homeViewModel.data?.data?.isNotEmpty ?? false; return Padding( padding: EdgeInsets.symmetric(horizontal: 24.0.w()), child: Text( isYourTenders ? AppStrings.yourTenders : AppStrings.recommendedTenders, style: TextStyle( fontSize: 18.0.sp(), fontWeight: FontWeight.w700, color: AppColors.grey80, ), ), ); } Widget _bottomListView(HomeViewModel homeViewModel) { final controller = ScrollController(); controller.addListener(() { if (controller.position.pixels >= controller.position.maxScrollExtent - 200) { if (!homeViewModel.isLoadingMore && homeViewModel.hasMore) { homeViewModel.getHomeRecommandTenders(); } } }); return Container( constraints: BoxConstraints(maxHeight: 387.0.h()), width: double.infinity, child: ListView.builder( controller: controller, padding: EdgeInsets.symmetric(horizontal: 24.0.w(), vertical: 15.0.h()), itemCount: homeViewModel.tenders.length + (homeViewModel.isLoadingMore ? 1 : 0), scrollDirection: Axis.horizontal, itemBuilder: (context, index) { if (index < homeViewModel.tenders.length) { return TendersListItem(tender: homeViewModel.tenders[index]); } else { return Center( child: Padding( padding: EdgeInsets.all(16.0), child: CircularProgressIndicator(color: AppColors.secondary50), ), ); } }, ), ); } }