import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:provider/provider.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/tender_approvals_state_response/tender_approvals_state_response.dart'; import 'package:tm_app/view_models/home_view_model.dart'; import 'package:tm_app/views/shared/desktop_navigation_widget.dart'; import '../widgets.dart'; class DesktopHomePage extends StatelessWidget { const DesktopHomePage({super.key}); @override Widget build(BuildContext context) { return Scaffold( 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!)); } return Column( children: [ DesktopNavigationWidget( currentIndex: 0, // Home index onTabChanged: (index) { // Navigate to different screens based on index switch (index) { case 0: // Already on home break; case 1: // Navigate to tenders Router.neglect(context, () => context.go('/tenders')); break; case 2: // Navigate to profile Router.neglect(context, () => context.go('/profile')); break; } }, ), Expanded( child: Center( child: SizedBox( width: 780, child: SingleChildScrollView( child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ SizedBox(height: 55), // SizedBox(width: 780, child: NotificationCard()), SizedBox(height: 40.0), _progressBarsRow( homeViewModel.tenderApprovalsStateResponse!, ), SizedBox(height: 32.0.h()), Padding( padding: EdgeInsets.symmetric(horizontal: 15.0.w()), child: _firstTenderCardsRow( context, homeViewModel.tenderApprovalsStateResponse!, ), ), SizedBox(height: 32.0.h()), _yourTenderText(homeViewModel), SizedBox(height: 8.0.h()), _bottomListView(homeViewModel), ], ), ), ), ), ), ], ); }, ), ); } Widget _progressBarsRow( TenderApprovalsStateResponse tenderApprovalsStateResponse, ) { final partnership = tenderApprovalsStateResponse.data!.partnershipCount ?? 0; final selfApply = tenderApprovalsStateResponse.data!.selfApplyCount ?? 0; final total = (partnership + selfApply); final partnershipPercent = total > 0 ? (partnership / total) * 100 : 0; final selfApplyPercent = total > 0 ? (selfApply / total) * 100 : 0; return Row( // mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.center, children: [ ProgressBarColumn( text: AppStrings.partnership, value: double.parse('$partnershipPercent'), amount: double.parse('$partnershipPercent').toString(), circularProgressIndicatorWidth: 176, circularProgressIndicatorHeight: 176, ), SizedBox(width: 106), ProgressBarColumn( text: AppStrings.selfApply, value: double.parse(selfApplyPercent.toString()), amount: double.parse(selfApplyPercent.toString()).toString(), circularProgressIndicatorWidth: 176, circularProgressIndicatorHeight: 176, ), //SizedBox(width: 106), // ProgressBarColumn( // text: AppStrings.contracting, // value: double.parse(homeResponse.contracting ?? '0'), // amount: homeResponse.contracting ?? '0', // circularProgressIndicatorWidth: 176, // circularProgressIndicatorHeight: 176, // ), ], ); } Widget _firstTenderCardsRow( BuildContext context, TenderApprovalsStateResponse tenderApprovalsStateResponse, ) { return Row( mainAxisAlignment: MainAxisAlignment.center, children: [ Expanded( child: TenderCard( backgroundColor: AppColors.primary20, iconPath: 'assets/icons/arrows.svg', title: AppStrings.tenderSubmitted, amount: tenderApprovalsStateResponse.data!.submittedTenders.toString(), // tenderApprovalsStateResponse // .data! // .approvalsBySubmission! // .selfApply // .toString(), textColor: Color(0xFF0164FF), enableTap: true, width: 178, height: 148, onTap: () { YourTendersRouteData().push(context); }, ), ), SizedBox(width: 10), Expanded( child: TenderCard( backgroundColor: AppColors.primary10, iconPath: 'assets/icons/thumb.svg', title: AppStrings.approvedTenders, amount: '0', textColor: Color(0xFF24848E), enableTap: true, width: 178, height: 148, onTap: () { YourTendersRouteData().push(context); }, ), ), // SizedBox(width: 10), // TenderCard( // backgroundColor: AppColors.orange10, // iconPath: 'assets/icons/shield.svg', // title: AppStrings.tenderValue, // amount: homeResponse.tenderValue ?? '0', // textColor: Color(0xFFE5821E), // enableTap: true, // width: 178, // height: 148, // onTap: () {}, // ), // SizedBox(width: 10), // TenderCard( // backgroundColor: AppColors.grey10, // iconPath: 'assets/icons/edit.svg', // title: AppStrings.thunderStatus, // amount: homeResponse.thunderStatus ?? '0', // textColor: Color(0xFF9E9E9E), // enableTap: false, // width: 178, // height: 148, // onTap: () {}, // ), ], ); } Widget _yourTenderText(HomeViewModel homeViewModel) { final isYourTenders = homeViewModel.data?.data?.isNotEmpty ?? false; return ConstrainedBox( constraints: BoxConstraints(maxWidth: 740), child: Align( alignment: Alignment.centerLeft, 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 (homeViewModel.isRecommendedMode) { if (controller.position.pixels >= controller.position.maxScrollExtent - 200) { if (!homeViewModel.isLoadingMore && homeViewModel.hasMore) { homeViewModel.getHomeRecommandTenders(); } } } }); return SizedBox( width: 740, height: 387.0, child: ListView.builder( controller: controller, padding: EdgeInsets.only(bottom: 20), 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), ), ); } }, ), ); } }