From 5649634464ac6e125f39c002c56232d34955b3ed Mon Sep 17 00:00:00 2001 From: amirrezaghabeli Date: Sat, 6 Sep 2025 13:18:12 +0330 Subject: [PATCH] some changes and fixes --- lib/core/config/dependencies.dart | 1 + lib/view_models/liked_tenders_view_model.dart | 8 + .../detail/pages/detail_desktop_page.dart | 22 - .../detail/pages/detail_tablet_page.dart | 18 - .../detail/widgets/tender_detail_action.dart | 34 +- lib/views/home/pages/d_home_page.dart | 83 ++-- lib/views/home/pages/t_home_page.dart | 19 - .../pages/liked_tenders_desktop_page.dart | 393 ++++++++--------- .../pages/liked_tenders_mobile_page.dart | 206 +++++---- .../pages/liked_tenders_tablet_page.dart | 405 +++++++++--------- .../strings/liked_tenders_strings.dart | 1 + .../widgets/liked_tenders_list_item.dart | 2 +- lib/views/profile/pages/d_profile_page.dart | 22 - lib/views/profile/pages/t_profile_page.dart | 21 +- .../shared/desktop_navigation_widget.dart | 38 +- .../shared/tablet_navigation_widget.dart | 40 +- lib/views/tenders/pages/d_tenders_page.dart | 93 ++-- lib/views/tenders/pages/t_tenders_page.dart | 20 +- .../tenders/widgets/main_tenders_slider.dart | 10 +- .../pages/your_tenders_desktop_page.dart | 36 +- .../pages/your_tenders_mobile_page.dart | 4 +- .../pages/your_tenders_tablet_page.dart | 26 +- .../strings/your_tenders_strings.dart | 2 + .../widgets/tenders_filter_dialog.dart | 2 +- 24 files changed, 691 insertions(+), 815 deletions(-) diff --git a/lib/core/config/dependencies.dart b/lib/core/config/dependencies.dart index 6164a53..3233f40 100644 --- a/lib/core/config/dependencies.dart +++ b/lib/core/config/dependencies.dart @@ -122,6 +122,7 @@ List get viewModels { (context) => LikedTendersViewModel( likedTendersRepository: context.read(), tendersRepository: context.read(), + homeViewModel: context.read(), ), ), ChangeNotifierProvider( diff --git a/lib/view_models/liked_tenders_view_model.dart b/lib/view_models/liked_tenders_view_model.dart index 68fe799..149d280 100644 --- a/lib/view_models/liked_tenders_view_model.dart +++ b/lib/view_models/liked_tenders_view_model.dart @@ -5,6 +5,7 @@ import 'package:tm_app/data/repositories/tenders_repository.dart'; import 'package:tm_app/data/services/model/liked_tender_feedback/liked_tender_feedback.dart'; import 'package:tm_app/data/services/model/liked_tenders_response/liked_tenders_response.dart'; import 'package:tm_app/data/services/model/tender_approvals_toggle_response/tender_approvals_toggle_response.dart'; +import 'package:tm_app/view_models/home_view_model.dart'; import '../data/services/model/feedback_response/feedback_response.dart'; import '../data/services/model/tender_approvals_by_id_response/tender_approvals_by_id_response.dart'; @@ -13,10 +14,13 @@ import '../data/services/model/tender_approvals_data/tender_approvals_data.dart' class LikedTendersViewModel with ChangeNotifier { final LikedTendersRepository _likedTendersRepository; final TendersRepository _tendersRepository; + final HomeViewModel _homeViewModel; LikedTendersViewModel({ required LikedTendersRepository likedTendersRepository, required TendersRepository tendersRepository, + required HomeViewModel homeViewModel, }) : _likedTendersRepository = likedTendersRepository, + _homeViewModel = homeViewModel, _tendersRepository = tendersRepository; bool isLoading = false; @@ -47,6 +51,10 @@ class LikedTendersViewModel with ChangeNotifier { bool get isSubmitApprovalLoading => _isSubmitApprovalLoading; bool get isRejectApprovalLoading => _isRejectApprovalLoading; + void updateHome() { + _homeViewModel.init(); + } + Future getLikedTenders({bool reset = false}) async { if (!reset && (isLoadingMore || !hasMore)) { return; diff --git a/lib/views/detail/pages/detail_desktop_page.dart b/lib/views/detail/pages/detail_desktop_page.dart index 18eabc0..0621ef8 100644 --- a/lib/views/detail/pages/detail_desktop_page.dart +++ b/lib/views/detail/pages/detail_desktop_page.dart @@ -7,7 +7,6 @@ import 'package:tm_app/views/detail/widgets/tender_detail_action.dart'; import 'package:tm_app/views/detail/widgets/tender_detail_card.dart'; import 'package:tm_app/views/detail/widgets/tender_detail_header.dart'; -import '../../../core/routes/app_routes.dart'; import '../../shared/desktop_navigation_widget.dart'; import '../strings/tender_details_strings.dart'; @@ -115,27 +114,6 @@ class _TenderDetailDesktopPageState extends State { children: [ DesktopNavigationWidget( currentIndex: 1, // Home index - onTabChanged: (index) { - // Navigate to different screens based on index - switch (index) { - case 0: - Router.neglect( - context, - () => HomeRouteData().go(context), - ); - viewModel.updateHome(); - break; - case 1: - break; - case 2: - // Navigate to profile - Router.neglect( - context, - () => ProfileRouteData().go(context), - ); - break; - } - }, ), Expanded( child: SingleChildScrollView( diff --git a/lib/views/detail/pages/detail_tablet_page.dart b/lib/views/detail/pages/detail_tablet_page.dart index 80ace76..7e7f980 100644 --- a/lib/views/detail/pages/detail_tablet_page.dart +++ b/lib/views/detail/pages/detail_tablet_page.dart @@ -1,6 +1,5 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/utils/size_config.dart'; @@ -10,7 +9,6 @@ import 'package:tm_app/views/detail/widgets/tender_detail_card.dart'; import 'package:tm_app/views/detail/widgets/tender_detail_header.dart'; import 'package:tm_app/views/shared/tablet_navigation_widget.dart'; -import '../../../core/routes/app_routes.dart'; import '../../shared/tender_app_bar.dart'; import '../strings/tender_details_strings.dart'; @@ -105,22 +103,6 @@ class _TenderDetailTabletPageState extends State { drawer: TabletNavigationWidget( currentIndex: 1, // Home is index 0 - onTabChanged: (index) { - // Handle navigation to other tabs - switch (index) { - case 0: - Router.neglect(context, () => HomeRouteData().go(context)); - viewModel.updateHome(); - break; - case 1: - break; - case 2: - // Navigate to profile - context.pop(); - Router.neglect(context, () => ProfileRouteData().go(context)); - break; - } - }, ), body: Consumer( builder: (context, tenderViewModel, child) { diff --git a/lib/views/detail/widgets/tender_detail_action.dart b/lib/views/detail/widgets/tender_detail_action.dart index 12f1e17..e02e909 100644 --- a/lib/views/detail/widgets/tender_detail_action.dart +++ b/lib/views/detail/widgets/tender_detail_action.dart @@ -162,19 +162,33 @@ class TenderDetailActions extends StatelessWidget { submissionMode: 'self-apply', ); } else { - showDialog( - context: context, - builder: (context) { - return SelectSubmissionDialog( - onConfirm: (String value) { - viewModel.submitTenderApproval( - tenderId: detail.id!, - submissionMode: value, + (MediaQuery.sizeOf(context).width > 600) + ? showDialog( + context: context, + builder: (context) { + return SelectSubmissionDialog( + onConfirm: (String value) { + viewModel.submitTenderApproval( + tenderId: detail.id!, + submissionMode: value, + ); + }, + ); + }, + ) + : showModalBottomSheet( + context: context, + builder: (context) { + return SelectSubmissionBottomSheet( + onConfirm: (String value) { + viewModel.submitTenderApproval( + tenderId: detail.id!, + submissionMode: value, + ); + }, ); }, ); - }, - ); } }, width: 120.0.w(), diff --git a/lib/views/home/pages/d_home_page.dart b/lib/views/home/pages/d_home_page.dart index d121f33..b9b684f 100644 --- a/lib/views/home/pages/d_home_page.dart +++ b/lib/views/home/pages/d_home_page.dart @@ -31,66 +31,35 @@ class DesktopHomePage extends StatelessWidget { if (homeViewModel.tenderApprovalsStateResponse != null && homeViewModel.data != null && homeViewModel.feedbackStats != null) { - 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, - () => TendersRouteData().go(context), - ); - break; - case 2: - // Navigate to profile - Router.neglect( - context, - () => ProfileRouteData().go(context), - ); - 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), - SizedBox(height: 32.0.h()), - Padding( - padding: EdgeInsets.symmetric( - horizontal: 15.0.w(), - ), - child: _firstTenderCardsRow( - context, - homeViewModel, - ), - ), - SizedBox(height: 32.0.h()), - _yourTenderText(homeViewModel), - SizedBox(height: 8.0.h()), - _bottomListView(homeViewModel), - ], + return SingleChildScrollView( + child: Column( + children: [ + DesktopNavigationWidget( + currentIndex: 0, // Home index + ), + SizedBox( + width: 780, + child: Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + SizedBox(height: 55), + // SizedBox(width: 780, child: NotificationCard()), + SizedBox(height: 40.0), + _progressBarsRow(homeViewModel), + SizedBox(height: 32.0.h()), + Padding( + padding: EdgeInsets.symmetric(horizontal: 15.0.w()), + child: _firstTenderCardsRow(context, homeViewModel), ), - ), + SizedBox(height: 32.0.h()), + _yourTenderText(homeViewModel), + SizedBox(height: 8.0.h()), + _bottomListView(homeViewModel), + ], ), ), - ), - ], + ], + ), ); } return const Center( diff --git a/lib/views/home/pages/t_home_page.dart b/lib/views/home/pages/t_home_page.dart index 239b469..f9e7cd1 100644 --- a/lib/views/home/pages/t_home_page.dart +++ b/lib/views/home/pages/t_home_page.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:tm_app/core/routes/app_routes.dart'; import 'package:tm_app/core/theme/colors.dart'; @@ -27,24 +26,6 @@ class TabletHomePage extends StatelessWidget { drawer: TabletNavigationWidget( currentIndex: 0, // Home is index 0 - onTabChanged: (index) { - // Handle navigation to other tabs - switch (index) { - case 0: - // Already on home - break; - case 1: - // Navigate to tenders - context.pop(); - Router.neglect(context, () => TendersRouteData().go(context)); - break; - case 2: - // Navigate to profile - context.pop(); - Router.neglect(context, () => ProfileRouteData().go(context)); - break; - } - }, ), body: Consumer( builder: (context, homeViewModel, child) { diff --git a/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart b/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart index 8c697ab..1d7b251 100644 --- a/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart +++ b/lib/views/liked_tenders/pages/liked_tenders_desktop_page.dart @@ -8,8 +8,8 @@ import 'package:tm_app/data/services/model/tender_approvals_data/tender_approval import 'package:tm_app/view_models/liked_tenders_view_model.dart'; import 'package:tm_app/views/liked_tenders/widgets/liked_tenders_list_item.dart'; -import '../../../core/routes/app_routes.dart'; import '../../shared/desktop_navigation_widget.dart'; +import '../strings/liked_tenders_strings.dart'; class LikedTendersDesktopPage extends StatefulWidget { const LikedTendersDesktopPage({super.key}); @@ -20,220 +20,221 @@ class LikedTendersDesktopPage extends StatefulWidget { } class _LikedTendersDesktopPageState extends State { + late final LikedTendersViewModel viewModel; + @override + void initState() { + viewModel = context.read(); + super.initState(); + } + @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColors.backgroundColor, - body: Column( - children: [ - DesktopNavigationWidget( - currentIndex: 1, - onTabChanged: (index) { - switch (index) { - case 0: - Router.neglect(context, () => HomeRouteData().go(context)); - break; - case 1: - break; - case 2: - Router.neglect(context, () => ProfileRouteData().go(context)); - break; - } - }, - ), - Expanded( - child: SizedBox( - width: 740, - child: Consumer( - builder: (context, viewModel, child) { - if (viewModel.isLoading && - (viewModel.data?.data?.feedback ?? []).isEmpty) { - return const Center( - child: CircularProgressIndicator( - color: AppColors.secondary50, - ), - ); - } + return PopScope( + onPopInvokedWithResult: (didPop, result) { + WidgetsBinding.instance.addPostFrameCallback((_) { + viewModel.updateHome(); + }); + }, + child: Scaffold( + backgroundColor: AppColors.backgroundColor, + body: Column( + children: [ + DesktopNavigationWidget(currentIndex: 1), + Expanded( + child: SizedBox( + width: 740, + child: Consumer( + builder: (context, viewModel, child) { + if (viewModel.isLoading && + (viewModel.data?.data?.feedback ?? []).isEmpty) { + return const Center( + child: CircularProgressIndicator( + color: AppColors.secondary50, + ), + ); + } - if (viewModel.errorMessage != null) { - return Center(child: Text(viewModel.errorMessage!)); - } + if (viewModel.errorMessage != null) { + return Center(child: Text(viewModel.errorMessage!)); + } - final feedback = viewModel.data?.data?.feedback ?? []; + final feedback = viewModel.data?.data?.feedback ?? []; - if (feedback.isEmpty) { - return const Center( - child: Text('You haven’t liked any tenders yet.'), - ); - } + if (feedback.isEmpty) { + return const Center( + child: Text(LikedTendersStrings.noLikedTenders), + ); + } - final currentPage = viewModel.currentPage; - final totalPages = viewModel.data?.data?.meta?.pages ?? 1; + final currentPage = viewModel.currentPage; + final totalPages = viewModel.data?.data?.meta?.pages ?? 1; - return Column( - children: [ - Expanded( - child: RefreshIndicator( - onRefresh: () async { - await viewModel.getLikedTenders(reset: true); - }, - child: ListView.builder( - padding: EdgeInsets.symmetric( - horizontal: 24.0.w(), - vertical: 15.0.h(), - ), - itemCount: feedback.length, - itemBuilder: (context, index) { - final item = feedback[index]; - TenderApprovalsData? approval; - bool hasApproval = viewModel - .hasTenderApprovalForTender(item.tenderId!); - if (hasApproval) { - approval = viewModel.getApprovalStatusForTender( - item.tenderId!, - ); - } else { - approval = null; - } - return Padding( - padding: EdgeInsets.only(bottom: 20.0.h()), - child: Dismissible( - key: ValueKey(item.tenderId ?? index), - direction: DismissDirection.endToStart, - background: Container( - alignment: Alignment.centerRight, - padding: EdgeInsets.symmetric( - horizontal: 20.0.w(), - ), - child: SvgPicture.asset( - AssetsManager.trash, - ), - ), - onDismissed: (_) { - if (item.tenderId != null) { - viewModel.removeTenderById( + return Column( + children: [ + Expanded( + child: RefreshIndicator( + onRefresh: () async { + await viewModel.getLikedTenders(reset: true); + }, + child: ListView.builder( + padding: EdgeInsets.symmetric( + horizontal: 24.0.w(), + vertical: 15.0.h(), + ), + itemCount: feedback.length, + itemBuilder: (context, index) { + final item = feedback[index]; + TenderApprovalsData? approval; + bool hasApproval = viewModel + .hasTenderApprovalForTender(item.tenderId!); + if (hasApproval) { + approval = viewModel + .getApprovalStatusForTender( item.tenderId!, ); - } - }, - child: LikedListItem( - tender: item.tender!, - approval: approval, - isDesktop: true, - ), - ), - ); - }, - ), - ), - ), - - SizedBox(height: 10.0.h()), - - Row( - children: [ - const Spacer(), - Text( - 'Page', - style: TextStyle( - fontSize: 13.0.sp(), - fontWeight: FontWeight.w300, - color: AppColors.grey60, - ), - ), - SizedBox(width: 10.0.w()), - - InkWell( - onTap: () async { - final selectedPage = await showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: const Text('Select Page'), - content: SizedBox( - width: 200, - height: 300, - child: ListView.builder( - itemCount: totalPages, - itemBuilder: (context, index) { - final pageNumber = index + 1; - return ListTile( - title: Text('Page $pageNumber'), - onTap: - () => Navigator.pop( - context, - pageNumber, - ), - ); - }, + } else { + approval = null; + } + return Padding( + padding: EdgeInsets.only(bottom: 20.0.h()), + child: Dismissible( + key: ValueKey(item.tenderId ?? index), + direction: DismissDirection.endToStart, + background: Container( + alignment: Alignment.centerRight, + padding: EdgeInsets.symmetric( + horizontal: 20.0.w(), + ), + child: SvgPicture.asset( + AssetsManager.trash, ), ), - ); - }, - ); - - if (selectedPage != null) { - await viewModel.jumpToPage(selectedPage); - } - }, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: AppColors.grey30, - width: 1, - ), - borderRadius: BorderRadius.circular(4), - ), - child: Row( - children: [ - SizedBox(width: 5.0.w()), - Text( - '$currentPage', - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w500, - color: AppColors.grey70, + onDismissed: (_) { + if (item.tenderId != null) { + viewModel.removeTenderById( + item.tenderId!, + ); + } + }, + child: LikedListItem( + tender: item.tender!, + approval: approval, + isDesktop: true, ), ), - SizedBox(width: 5.0.w()), - SvgPicture.asset( - AssetsManager.arrowdownSmall, - ), - SizedBox(width: 5.0.w()), - ], + ); + }, + ), + ), + ), + + SizedBox(height: 10.0.h()), + + Row( + children: [ + const Spacer(), + Text( + 'Page', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w300, + color: AppColors.grey60, ), ), - ), + SizedBox(width: 10.0.w()), - SizedBox(width: 5.0.w()), - Text( - 'Of', - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - SizedBox(width: 5.0.w()), - Text( - '$totalPages', - style: TextStyle( - fontSize: 13.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - ], - ), + InkWell( + onTap: () async { + final selectedPage = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text('Select Page'), + content: SizedBox( + width: 200, + height: 300, + child: ListView.builder( + itemCount: totalPages, + itemBuilder: (context, index) { + final pageNumber = index + 1; + return ListTile( + title: Text('Page $pageNumber'), + onTap: + () => Navigator.pop( + context, + pageNumber, + ), + ); + }, + ), + ), + ); + }, + ); - SizedBox(height: 30.0.h()), - ], - ); - }, + if (selectedPage != null) { + await viewModel.jumpToPage(selectedPage); + } + }, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: AppColors.grey30, + width: 1, + ), + borderRadius: BorderRadius.circular(4), + ), + child: Row( + children: [ + SizedBox(width: 5.0.w()), + Text( + '$currentPage', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w500, + color: AppColors.grey70, + ), + ), + SizedBox(width: 5.0.w()), + SvgPicture.asset( + AssetsManager.arrowdownSmall, + ), + SizedBox(width: 5.0.w()), + ], + ), + ), + ), + + SizedBox(width: 5.0.w()), + Text( + 'Of', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + SizedBox(width: 5.0.w()), + Text( + '$totalPages', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + ], + ), + + SizedBox(height: 30.0.h()), + ], + ); + }, + ), ), ), - ), - ], + ], + ), ), ); } diff --git a/lib/views/liked_tenders/pages/liked_tenders_mobile_page.dart b/lib/views/liked_tenders/pages/liked_tenders_mobile_page.dart index e727c63..0dfc95c 100644 --- a/lib/views/liked_tenders/pages/liked_tenders_mobile_page.dart +++ b/lib/views/liked_tenders/pages/liked_tenders_mobile_page.dart @@ -1,3 +1,4 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; import 'package:provider/provider.dart'; @@ -19,9 +20,11 @@ class LikedTendersMobilePage extends StatefulWidget { class _LikedTendersMobilePageState extends State { late final ScrollController _scrollController; + late final LikedTendersViewModel viewModel; @override void initState() { + viewModel = context.read(); super.initState(); _scrollController = ScrollController()..addListener(_onScroll); } @@ -48,109 +51,124 @@ class _LikedTendersMobilePageState extends State { @override Widget build(BuildContext context) { - return Scaffold( - backgroundColor: AppColors.backgroundColor, - appBar: appBar(context: context, title: LikedTendersStrings.likedTenders), - body: Column( - children: [ - Expanded( - child: Consumer( - builder: (context, viewModel, child) { - if (viewModel.isLoading && - (viewModel.data?.data?.feedback ?? []).isEmpty) { - return const Center( - child: CircularProgressIndicator( - color: AppColors.secondary50, - ), - ); - } + return PopScope( + onPopInvokedWithResult: (didPop, result) { + if (kIsWeb) { + WidgetsBinding.instance.addPostFrameCallback((_) { + viewModel.updateHome(); + }); + } + }, + child: Scaffold( + backgroundColor: AppColors.backgroundColor, + appBar: appBar( + context: context, + title: LikedTendersStrings.likedTenders, + ), + body: Column( + children: [ + Expanded( + child: Consumer( + builder: (context, viewModel, child) { + if (viewModel.isLoading && + (viewModel.data?.data?.feedback ?? []).isEmpty) { + return const Center( + child: CircularProgressIndicator( + color: AppColors.secondary50, + ), + ); + } - if (viewModel.errorMessage != null) { - return Center(child: Text(viewModel.errorMessage!)); - } + if (viewModel.errorMessage != null) { + return Center(child: Text(viewModel.errorMessage!)); + } - final feedback = viewModel.data?.data?.feedback ?? []; + final feedback = viewModel.data?.data?.feedback ?? []; - if (feedback.isEmpty) { - return const Center( - child: Text('You haven’t liked any tenders yet.'), - ); - } + if (feedback.isEmpty) { + return const Center( + child: Text(LikedTendersStrings.noLikedTenders), + ); + } - final itemCount = - feedback.length + (viewModel.isLoadingMore ? 1 : 0); + final itemCount = + feedback.length + (viewModel.isLoadingMore ? 1 : 0); - return RefreshIndicator( - onRefresh: () async { - await viewModel.getLikedTenders(reset: true); - }, - child: ListView.builder( - controller: _scrollController, - padding: EdgeInsets.symmetric( - horizontal: 24.0.w(), - vertical: 15.0.h(), - ), - itemCount: itemCount, - itemBuilder: (context, index) { - if (index < feedback.length) { - final item = feedback[index]; - TenderApprovalsData? approval; - bool hasApproval = viewModel.hasTenderApprovalForTender( - item.tenderId!, - ); - if (hasApproval) { - approval = viewModel.getApprovalStatusForTender( - item.tenderId!, + return RefreshIndicator( + onRefresh: () async { + await viewModel.getLikedTenders(reset: true); + }, + child: ListView.builder( + controller: _scrollController, + padding: EdgeInsets.symmetric( + horizontal: 24.0.w(), + vertical: 15.0.h(), + ), + itemCount: itemCount, + itemBuilder: (context, index) { + if (index < feedback.length) { + final item = feedback[index]; + TenderApprovalsData? approval; + bool hasApproval = viewModel + .hasTenderApprovalForTender(item.tenderId!); + if (hasApproval) { + approval = viewModel.getApprovalStatusForTender( + item.tenderId!, + ); + } else { + approval = null; + } + + return Padding( + padding: EdgeInsets.only(bottom: 20.0.h()), + child: Dismissible( + key: ValueKey(item.tenderId ?? index), + direction: DismissDirection.endToStart, + background: Container( + alignment: Alignment.centerRight, + padding: EdgeInsets.symmetric( + horizontal: 20.0.w(), + ), + child: SvgPicture.asset( + AssetsManager.trash, + width: 32.0.w(), + height: 32.0.h(), + ), + ), + onDismissed: (_) { + if (item.tenderId != null) { + viewModel.removeTenderById(item.tenderId!); + } + }, + child: LikedListItem( + tender: item.tender!, + approval: approval, + ), + ), ); } else { - approval = null; + return Padding( + padding: EdgeInsets.symmetric(vertical: 20.0.h()), + child: Center( + child: SizedBox( + width: 24.0.w(), + height: 24.0.h(), + child: CircularProgressIndicator( + color: AppColors.secondary50, + strokeWidth: 2, + ), + ), + ), + ); } - - return Padding( - padding: EdgeInsets.only(bottom: 20.0.h()), - child: Dismissible( - key: ValueKey(item.tenderId ?? index), - direction: DismissDirection.endToStart, - background: Container( - alignment: Alignment.centerRight, - padding: EdgeInsets.symmetric( - horizontal: 20.0.w(), - ), - child: SvgPicture.asset(AssetsManager.trash,width: 32.0.w(),height: 32.0.h(),), - ), - onDismissed: (_) { - if (item.tenderId != null) { - viewModel.removeTenderById(item.tenderId!); - } - }, - child: LikedListItem( - tender: item.tender!, - approval: approval, - ), - ), - ); - } else { - return Padding( - padding: EdgeInsets.symmetric(vertical: 20.0.h()), - child: Center( - child: SizedBox( - width: 24.0.w(), - height: 24.0.h(), - child: CircularProgressIndicator( - color: AppColors.secondary50, - strokeWidth: 2, - ), - ), - ), - ); - } - }, - ), - ); - }, + }, + ), + ); + }, + ), ), - ), - ], + ], + ), ), ); } diff --git a/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart b/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart index f185b33..15c3489 100644 --- a/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart +++ b/lib/views/liked_tenders/pages/liked_tenders_tablet_page.dart @@ -1,9 +1,8 @@ +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:tm_app/core/constants/assets.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/view_models/liked_tenders_view_model.dart'; @@ -22,226 +21,230 @@ class LikedTendersTabletPage extends StatefulWidget { } class _LikedTendersTabletPageState extends State { + late final LikedTendersViewModel viewModel; + @override + void initState() { + viewModel = context.read(); + super.initState(); + } + @override Widget build(BuildContext context) { final GlobalKey key = GlobalKey(); - return Scaffold( - key: key, - backgroundColor: AppColors.backgroundColor, - appBar: tabletAppBar(title: LikedTendersStrings.likedTenders, key: key), - drawer: TabletNavigationWidget( - currentIndex: 1, - onTabChanged: (index) { - switch (index) { - case 0: - Router.neglect(context, () => HomeRouteData().go(context)); - break; - case 1: - break; - case 2: - context.pop(); - Router.neglect(context, () => ProfileRouteData().go(context)); - break; - } - }, - ), - body: Center( - child: SizedBox( - width: 720, - child: Column( - children: [ - Expanded( - child: Consumer( - builder: (context, viewModel, child) { - if (viewModel.isLoading && - (viewModel.data?.data?.feedback ?? []).isEmpty) { - return const Center( - child: CircularProgressIndicator( - color: AppColors.secondary50, - ), - ); - } + return PopScope( + onPopInvokedWithResult: (didPop, result) { + if (kIsWeb) { + WidgetsBinding.instance.addPostFrameCallback((_) { + viewModel.updateHome(); + }); + } + }, + child: Scaffold( + key: key, + backgroundColor: AppColors.backgroundColor, + appBar: tabletAppBar(title: LikedTendersStrings.likedTenders, key: key), + drawer: TabletNavigationWidget(currentIndex: 1), + body: Center( + child: SizedBox( + width: 720, + child: Column( + children: [ + Expanded( + child: Consumer( + builder: (context, viewModel, child) { + if (viewModel.isLoading && + (viewModel.data?.data?.feedback ?? []).isEmpty) { + return const Center( + child: CircularProgressIndicator( + color: AppColors.secondary50, + ), + ); + } - if (viewModel.errorMessage != null) { - return Center(child: Text(viewModel.errorMessage!)); - } + if (viewModel.errorMessage != null) { + return Center(child: Text(viewModel.errorMessage!)); + } - final feedback = viewModel.data?.data?.feedback ?? []; + final feedback = viewModel.data?.data?.feedback ?? []; - if (feedback.isEmpty) { - return const Center( - child: Text('You haven’t liked any tenders yet.'), - ); - } + if (feedback.isEmpty) { + return const Center( + child: Text(LikedTendersStrings.noLikedTenders), + ); + } - final currentPage = viewModel.currentPage; - final totalPages = viewModel.data?.data?.meta?.pages ?? 1; + final currentPage = viewModel.currentPage; + final totalPages = viewModel.data?.data?.meta?.pages ?? 1; - return Column( - children: [ - Expanded( - child: RefreshIndicator( - onRefresh: () async { - await viewModel.getLikedTenders(reset: true); - }, - child: ListView.builder( - padding: EdgeInsets.symmetric( - horizontal: 24.0.w(), - vertical: 15.0.h(), - ), - itemCount: feedback.length, - itemBuilder: (context, index) { - final item = feedback[index]; - TenderApprovalsData? approval; - bool hasApproval = viewModel - .hasTenderApprovalForTender(item.tenderId!); - if (hasApproval) { - approval = viewModel - .getApprovalStatusForTender( + return Column( + children: [ + Expanded( + child: RefreshIndicator( + onRefresh: () async { + await viewModel.getLikedTenders(reset: true); + }, + child: ListView.builder( + padding: EdgeInsets.symmetric( + horizontal: 24.0.w(), + vertical: 15.0.h(), + ), + itemCount: feedback.length, + itemBuilder: (context, index) { + final item = feedback[index]; + TenderApprovalsData? approval; + bool hasApproval = viewModel + .hasTenderApprovalForTender( item.tenderId!, ); - } else { - approval = null; - } - return Padding( - padding: EdgeInsets.only(bottom: 20.0.h()), - child: Dismissible( - key: ValueKey(item.tenderId ?? index), - direction: DismissDirection.endToStart, - background: Container( - alignment: Alignment.centerRight, - padding: EdgeInsets.symmetric( - horizontal: 20.0.w(), - ), - child: SvgPicture.asset( - AssetsManager.trash, - width: 32.0.w(),height: 32.0.h(), - ), - ), - onDismissed: (_) { - if (item.tenderId != null) { - viewModel.removeTenderById( + if (hasApproval) { + approval = viewModel + .getApprovalStatusForTender( item.tenderId!, ); - } - }, - child: LikedListItem( - tender: item.tender!, - approval: approval!, - ), - ), - ); - }, - ), - ), - ), - - SizedBox(height: 10.0.h()), - - Row( - children: [ - const Spacer(), - Text( - 'Page', - style: TextStyle( - fontSize: 13.0.sp(), - fontWeight: FontWeight.w300, - color: AppColors.grey60, - ), - ), - SizedBox(width: 10.0.w()), - - InkWell( - onTap: () async { - final selectedPage = await showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: const Text('Select Page'), - content: SizedBox( - width: 200, - height: 300, - child: ListView.builder( - itemCount: totalPages, - itemBuilder: (context, index) { - final pageNumber = index + 1; - return ListTile( - title: Text('Page $pageNumber'), - onTap: - () => Navigator.pop( - context, - pageNumber, - ), - ); - }, + } else { + approval = null; + } + return Padding( + padding: EdgeInsets.only(bottom: 20.0.h()), + child: Dismissible( + key: ValueKey(item.tenderId ?? index), + direction: DismissDirection.endToStart, + background: Container( + alignment: Alignment.centerRight, + padding: EdgeInsets.symmetric( + horizontal: 20.0.w(), + ), + child: SvgPicture.asset( + AssetsManager.trash, + width: 32.0.w(), + height: 32.0.h(), ), ), - ); - }, - ); - - if (selectedPage != null) { - await viewModel.jumpToPage(selectedPage); - } - }, - child: Container( - decoration: BoxDecoration( - border: Border.all( - color: AppColors.grey30, - width: 1, - ), - borderRadius: BorderRadius.circular(4), - ), - child: Row( - children: [ - SizedBox(width: 5.0.w()), - Text( - '$currentPage', - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w500, - color: AppColors.grey70, + onDismissed: (_) { + if (item.tenderId != null) { + viewModel.removeTenderById( + item.tenderId!, + ); + } + }, + child: LikedListItem( + tender: item.tender!, + approval: approval!, ), ), - SizedBox(width: 5.0.w()), - SvgPicture.asset( - AssetsManager.arrowdownSmall, - ), - SizedBox(width: 5.0.w()), - ], + ); + }, + ), + ), + ), + + SizedBox(height: 10.0.h()), + + Row( + children: [ + const Spacer(), + Text( + 'Page', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w300, + color: AppColors.grey60, ), ), - ), + SizedBox(width: 10.0.w()), - SizedBox(width: 5.0.w()), - Text( - 'Of', - style: TextStyle( - fontSize: 14.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - SizedBox(width: 5.0.w()), - Text( - '$totalPages', - style: TextStyle( - fontSize: 13.0.sp(), - fontWeight: FontWeight.w400, - color: AppColors.grey60, - ), - ), - SizedBox(width: 30.0.w()), - ], - ), + InkWell( + onTap: () async { + final selectedPage = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text('Select Page'), + content: SizedBox( + width: 200, + height: 300, + child: ListView.builder( + itemCount: totalPages, + itemBuilder: (context, index) { + final pageNumber = index + 1; + return ListTile( + title: Text('Page $pageNumber'), + onTap: + () => Navigator.pop( + context, + pageNumber, + ), + ); + }, + ), + ), + ); + }, + ); - SizedBox(height: 30.0.h()), - ], - ); - }, + if (selectedPage != null) { + await viewModel.jumpToPage(selectedPage); + } + }, + child: Container( + decoration: BoxDecoration( + border: Border.all( + color: AppColors.grey30, + width: 1, + ), + borderRadius: BorderRadius.circular(4), + ), + child: Row( + children: [ + SizedBox(width: 5.0.w()), + Text( + '$currentPage', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w500, + color: AppColors.grey70, + ), + ), + SizedBox(width: 5.0.w()), + SvgPicture.asset( + AssetsManager.arrowdownSmall, + ), + SizedBox(width: 5.0.w()), + ], + ), + ), + ), + + SizedBox(width: 5.0.w()), + Text( + 'Of', + style: TextStyle( + fontSize: 14.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + SizedBox(width: 5.0.w()), + Text( + '$totalPages', + style: TextStyle( + fontSize: 13.0.sp(), + fontWeight: FontWeight.w400, + color: AppColors.grey60, + ), + ), + SizedBox(width: 30.0.w()), + ], + ), + + SizedBox(height: 30.0.h()), + ], + ); + }, + ), ), - ), - ], + ], + ), ), ), ), diff --git a/lib/views/liked_tenders/strings/liked_tenders_strings.dart b/lib/views/liked_tenders/strings/liked_tenders_strings.dart index 80d5b0a..7ec0c42 100644 --- a/lib/views/liked_tenders/strings/liked_tenders_strings.dart +++ b/lib/views/liked_tenders/strings/liked_tenders_strings.dart @@ -12,4 +12,5 @@ class LikedTendersStrings { static const startDate = 'YYYY/MM/DD'; static const endDate = 'YYYY/MM/DD'; static const approvedTenders = 'Approved tenders'; + static const noLikedTenders = 'You haven’t liked any tenders yet.'; } diff --git a/lib/views/liked_tenders/widgets/liked_tenders_list_item.dart b/lib/views/liked_tenders/widgets/liked_tenders_list_item.dart index 0e59862..09a1063 100644 --- a/lib/views/liked_tenders/widgets/liked_tenders_list_item.dart +++ b/lib/views/liked_tenders/widgets/liked_tenders_list_item.dart @@ -214,7 +214,7 @@ class LikedListItem extends StatelessWidget { submissionMode: 'self-apply', ); } else { - kIsWeb + (kIsWeb && MediaQuery.sizeOf(context).width > 600) ? showDialog( context: context, builder: (context) { diff --git a/lib/views/profile/pages/d_profile_page.dart b/lib/views/profile/pages/d_profile_page.dart index 05f7688..8d16838 100644 --- a/lib/views/profile/pages/d_profile_page.dart +++ b/lib/views/profile/pages/d_profile_page.dart @@ -72,28 +72,6 @@ class _DesktopProfilePageState extends State { children: [ DesktopNavigationWidget( currentIndex: 2, // Tenders index - onTabChanged: (index) { - // Navigate to different screens based on index - switch (index) { - case 0: - // Navigate to home - Router.neglect( - context, - () => HomeRouteData().go(context), - ); - break; - case 1: - // Navigate to profile - Router.neglect( - context, - () => TendersRouteData().go(context), - ); - break; - case 2: - // Already on profile - break; - } - }, ), SizedBox( width: 740, diff --git a/lib/views/profile/pages/t_profile_page.dart b/lib/views/profile/pages/t_profile_page.dart index 7b5ab57..0ce498f 100644 --- a/lib/views/profile/pages/t_profile_page.dart +++ b/lib/views/profile/pages/t_profile_page.dart @@ -1,6 +1,5 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; -import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:tm_app/core/constants/assets.dart'; import 'package:tm_app/core/constants/common_strings.dart'; @@ -75,25 +74,7 @@ class _TabletProfilePageState extends State { backgroundColor: AppColors.backgroundColor, appBar: tabletAppBar(title: ProfileStrings.profileTitle, key: key), - drawer: TabletNavigationWidget( - currentIndex: 2, - onTabChanged: (index) { - switch (index) { - case 0: - context.pop(); - Router.neglect(context, () => HomeRouteData().go(context)); - - break; - case 1: - context.pop(); - Router.neglect( - context, - () => TendersRouteData().go(context), - ); - break; - } - }, - ), + drawer: TabletNavigationWidget(currentIndex: 2), body: Padding( padding: EdgeInsets.symmetric( horizontal: 24.0.w(), diff --git a/lib/views/shared/desktop_navigation_widget.dart b/lib/views/shared/desktop_navigation_widget.dart index 9f88734..9ed5eab 100644 --- a/lib/views/shared/desktop_navigation_widget.dart +++ b/lib/views/shared/desktop_navigation_widget.dart @@ -1,21 +1,21 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:provider/provider.dart'; import 'package:tm_app/core/constants/assets.dart'; import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/utils/size_config.dart'; +import 'package:tm_app/view_models/home_view_model.dart'; +import 'package:tm_app/view_models/tenders_view_model.dart'; import 'package:tm_app/views/home/strings/home_strings.dart'; import 'package:tm_app/views/profile/strings/profile_strings.dart'; import 'package:tm_app/views/tenders/strings/tenders_strings.dart'; +import '../../core/routes/app_routes.dart'; + class DesktopNavigationWidget extends StatelessWidget { - const DesktopNavigationWidget({ - required this.currentIndex, - required this.onTabChanged, - super.key, - }); + const DesktopNavigationWidget({required this.currentIndex, super.key}); final int currentIndex; - final ValueChanged onTabChanged; @override Widget build(BuildContext context) { @@ -36,7 +36,14 @@ class DesktopNavigationWidget extends StatelessWidget { context: context, text: HomeStrings.home, isActive: currentIndex == 0, - onTap: () => onTabChanged(0), + onTap: () { + if (currentIndex == 0) { + return; + } else { + Router.neglect(context, () => HomeRouteData().go(context)); + context.read().init(); + } + }, iconPath: AssetsManager.home, activeIconPath: AssetsManager.homeActive, ), @@ -45,7 +52,14 @@ class DesktopNavigationWidget extends StatelessWidget { context: context, text: TendersStrings.tendersTitle, isActive: currentIndex == 1, - onTap: () => onTabChanged(1), + onTap: () { + if (currentIndex == 1) { + return; + } else { + Router.neglect(context, () => TendersRouteData().go(context)); + context.read().getTenders(); + } + }, iconPath: AssetsManager.tenders, activeIconPath: AssetsManager.tendersActive, ), @@ -54,7 +68,13 @@ class DesktopNavigationWidget extends StatelessWidget { context: context, text: ProfileStrings.profileTitle, isActive: currentIndex == 2, - onTap: () => onTabChanged(2), + onTap: () { + if (currentIndex == 2) { + return; + } else { + Router.neglect(context, () => ProfileRouteData().go(context)); + } + }, iconPath: AssetsManager.profile, activeIconPath: AssetsManager.profileActive, ), diff --git a/lib/views/shared/tablet_navigation_widget.dart b/lib/views/shared/tablet_navigation_widget.dart index 60cde79..5b50dd9 100644 --- a/lib/views/shared/tablet_navigation_widget.dart +++ b/lib/views/shared/tablet_navigation_widget.dart @@ -1,21 +1,22 @@ import 'package:flutter/material.dart'; import 'package:flutter_svg/svg.dart'; +import 'package:go_router/go_router.dart'; +import 'package:provider/provider.dart'; import 'package:tm_app/core/constants/assets.dart'; import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/utils/size_config.dart'; +import 'package:tm_app/view_models/home_view_model.dart'; +import 'package:tm_app/view_models/tenders_view_model.dart'; import 'package:tm_app/views/home/strings/home_strings.dart'; import 'package:tm_app/views/profile/strings/profile_strings.dart'; import 'package:tm_app/views/tenders/strings/tenders_strings.dart'; +import '../../core/routes/app_routes.dart'; + class TabletNavigationWidget extends StatelessWidget { - const TabletNavigationWidget({ - required this.currentIndex, - required this.onTabChanged, - super.key, - }); + const TabletNavigationWidget({required this.currentIndex, super.key}); final int currentIndex; - final ValueChanged onTabChanged; @override Widget build(BuildContext context) { @@ -30,7 +31,14 @@ class TabletNavigationWidget extends StatelessWidget { context: context, text: HomeStrings.home, isActive: currentIndex == 0, - onTap: () => onTabChanged(0), + onTap: () { + if (currentIndex == 0) { + return; + } else { + Router.neglect(context, () => HomeRouteData().go(context)); + context.read().init(); + } + }, iconPath: AssetsManager.home, activeIconPath: AssetsManager.homeActive, ), @@ -38,7 +46,14 @@ class TabletNavigationWidget extends StatelessWidget { context: context, text: TendersStrings.tendersTitle, isActive: currentIndex == 1, - onTap: () => onTabChanged(1), + onTap: () { + if (currentIndex == 1) { + return; + } else { + Router.neglect(context, () => TendersRouteData().go(context)); + context.read().getTenders(); + } + }, iconPath: AssetsManager.tenders, activeIconPath: AssetsManager.tendersActive, ), @@ -46,7 +61,14 @@ class TabletNavigationWidget extends StatelessWidget { context: context, text: ProfileStrings.profileTitle, isActive: currentIndex == 2, - onTap: () => onTabChanged(2), + onTap: () { + if (currentIndex == 2) { + return; + } else { + context.pop(); + Router.neglect(context, () => ProfileRouteData().go(context)); + } + }, iconPath: AssetsManager.profile, activeIconPath: AssetsManager.profileActive, ), diff --git a/lib/views/tenders/pages/d_tenders_page.dart b/lib/views/tenders/pages/d_tenders_page.dart index 071533e..6a71a5e 100644 --- a/lib/views/tenders/pages/d_tenders_page.dart +++ b/lib/views/tenders/pages/d_tenders_page.dart @@ -7,7 +7,6 @@ import 'package:tm_app/views/shared/desktop_navigation_widget.dart'; import 'package:tm_app/views/tenders/widgets/main_tenders_slider.dart'; import '../../../core/constants/common_strings.dart'; -import '../../../core/routes/app_routes.dart'; class DesktopTendersPage extends StatefulWidget { const DesktopTendersPage({super.key}); @@ -54,65 +53,41 @@ class _DesktopTendersPageState extends State { Widget build(BuildContext context) { return Scaffold( backgroundColor: AppColors.backgroundColor, - body: Column( - children: [ - DesktopNavigationWidget( - currentIndex: 1, // Tenders index - onTabChanged: (index) { - // Navigate to different screens based on index - switch (index) { - case 0: - // Navigate to home - Router.neglect(context, () => HomeRouteData().go(context)); - viewModel.updateHome(); - break; - case 1: - // Already on tenders - break; - case 2: - // Navigate to profile - Router.neglect(context, () => ProfileRouteData().go(context)); - break; - } - }, - ), - Expanded( - child: Center( - child: SingleChildScrollView( - child: Consumer( - builder: (context, viewModel, child) { - if (viewModel.isLoading) { - return Center( - child: CircularProgressIndicator( - color: AppColors.jellyBean, - ), - ); - } - if (viewModel.errorMessage != null) { - return Center(child: Text(viewModel.errorMessage!)); - } - if (viewModel.tendersResponse?.data?.tenders == null || - viewModel.tendersResponse!.data!.tenders!.isEmpty) { - return Center(child: Text(CommonStrings.noData)); - } - return SizedBox( - width: 740, - height: 800, - child: Padding( - padding: EdgeInsets.symmetric(vertical: 24.0.h()), - child: MainTendersSlider( - tenders: - viewModel.tendersResponse?.data?.tenders ?? [], - isDesktop: true, - ), - ), - ); - }, + body: SingleChildScrollView( + child: Consumer( + builder: (context, viewModel, child) { + if (viewModel.isLoading) { + return Center( + child: CircularProgressIndicator(color: AppColors.jellyBean), + ); + } + if (viewModel.errorMessage != null) { + return Center(child: Text(viewModel.errorMessage!)); + } + if (viewModel.tendersResponse?.data?.tenders == null || + viewModel.tendersResponse!.data!.tenders!.isEmpty) { + return Center(child: Text(CommonStrings.noData)); + } + return Column( + children: [ + DesktopNavigationWidget( + currentIndex: 1, // Tenders index ), - ), - ), - ), - ], + SizedBox( + width: 740, + height: 800, + child: Padding( + padding: EdgeInsets.symmetric(vertical: 24.0.h()), + child: MainTendersSlider( + tenders: viewModel.tendersResponse?.data?.tenders ?? [], + isDesktop: true, + ), + ), + ), + ], + ); + }, + ), ), ); } diff --git a/lib/views/tenders/pages/t_tenders_page.dart b/lib/views/tenders/pages/t_tenders_page.dart index 8f6f2e8..b7eac24 100644 --- a/lib/views/tenders/pages/t_tenders_page.dart +++ b/lib/views/tenders/pages/t_tenders_page.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:provider/provider.dart'; import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/utils/size_config.dart'; @@ -8,7 +7,6 @@ import 'package:tm_app/views/shared/tablet_navigation_widget.dart'; import 'package:tm_app/views/tenders/widgets/main_tenders_slider.dart'; import '../../../core/constants/common_strings.dart'; -import '../../../core/routes/app_routes.dart'; import '../../shared/tender_app_bar.dart'; import '../strings/tenders_strings.dart'; @@ -35,23 +33,7 @@ class _TabletTendersPageState extends State { key: key, backgroundColor: AppColors.backgroundColor, appBar: tabletAppBar(title: TendersStrings.tendersTitle, key: key), - drawer: TabletNavigationWidget( - currentIndex: 1, - onTabChanged: (index) { - switch (index) { - case 0: - context.pop(); - Router.neglect(context, () => HomeRouteData().go(context)); - viewModel.updateHome(); - break; - case 2: - context.pop(); - Router.neglect(context, () => ProfileRouteData().go(context)); - - break; - } - }, - ), + drawer: TabletNavigationWidget(currentIndex: 1), body: SingleChildScrollView( child: Consumer( builder: (context, viewModel, child) { diff --git a/lib/views/tenders/widgets/main_tenders_slider.dart b/lib/views/tenders/widgets/main_tenders_slider.dart index a13b439..eb2907c 100644 --- a/lib/views/tenders/widgets/main_tenders_slider.dart +++ b/lib/views/tenders/widgets/main_tenders_slider.dart @@ -91,7 +91,7 @@ class _MainTendersSliderState extends State { Widget _tendersPageView() { return SizedBox( width: double.infinity, - height: 719.0.h(), + height: 722.0.h(), child: PageView.builder( controller: pageController, scrollDirection: Axis.horizontal, @@ -145,8 +145,8 @@ class _MainTendersSliderState extends State { borderRadius: BorderRadius.circular(100), onTap: _goToPreviousPage, child: Container( - width: 32.0.w(), - height: 32.0.w(), + width: 32.0.h(), + height: 32.0.h(), decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all(color: AppColors.iconColor, width: 1.5), @@ -194,8 +194,8 @@ class _MainTendersSliderState extends State { borderRadius: BorderRadius.circular(100), onTap: _goToNextPage, child: Container( - width: 32.0.w(), - height: 32.0.w(), + width: 32.0.h(), + height: 32.0.h(), decoration: BoxDecoration( shape: BoxShape.circle, border: Border.all(color: AppColors.iconColor, width: 1.5), diff --git a/lib/views/your_tenders/pages/your_tenders_desktop_page.dart b/lib/views/your_tenders/pages/your_tenders_desktop_page.dart index 1009839..fbdaa71 100644 --- a/lib/views/your_tenders/pages/your_tenders_desktop_page.dart +++ b/lib/views/your_tenders/pages/your_tenders_desktop_page.dart @@ -8,7 +8,6 @@ import 'package:tm_app/views/your_tenders/widgets/liked_disliked_tenders_list.da import 'package:tm_app/views/your_tenders/widgets/tablet_desktop_appbar.dart'; import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart'; -import '../../../core/routes/app_routes.dart'; import '../../shared/desktop_navigation_widget.dart'; class YourTendersDesktopPage extends StatefulWidget { @@ -43,22 +42,6 @@ class _YourTendersDesktopPageState extends State children: [ DesktopNavigationWidget( currentIndex: 1, // Tenders index - onTabChanged: (index) { - // Navigate to different screens based on index - switch (index) { - case 0: - // Navigate to home - Router.neglect(context, () => HomeRouteData().go(context)); - break; - case 1: - // Already on tenders - break; - case 2: - // Navigate to profile - Router.neglect(context, () => ProfileRouteData().go(context)); - break; - } - }, ), Expanded( child: SizedBox( @@ -68,14 +51,6 @@ class _YourTendersDesktopPageState extends State SizedBox(height: 64.0), TabletDesktopAppbar(), SizedBox(height: 20.0), - - // MainTabBar( - // controller: controller, - // titles: [ - // AppStrings.approvedTenders, - // AppStrings.tenderSubmitted, - // ], - // ), FilterButton(platformType: PlatformType.tabletDesktop), Expanded( @@ -115,15 +90,10 @@ class _YourTendersDesktopPageState extends State isDesktop: true, ); } else { - return const Center(child: Text('No data available')); + return const Center( + child: Text(YourTendersStrings.noTenders), + ); } - // return TabBarView( - // controller: controller, - // children: [ - // // ApprovedTenders(tendersSubmitted: []), - - // ], - // ); }, ), ), diff --git a/lib/views/your_tenders/pages/your_tenders_mobile_page.dart b/lib/views/your_tenders/pages/your_tenders_mobile_page.dart index 9a4e065..80f92cc 100644 --- a/lib/views/your_tenders/pages/your_tenders_mobile_page.dart +++ b/lib/views/your_tenders/pages/your_tenders_mobile_page.dart @@ -85,7 +85,9 @@ class _YourTendersMobilePageState extends State { ) else const Expanded( - child: Center(child: Text('No data available')), + child: Center( + child: Text(YourTendersStrings.noTenders), + ), ), ], ); diff --git a/lib/views/your_tenders/pages/your_tenders_tablet_page.dart b/lib/views/your_tenders/pages/your_tenders_tablet_page.dart index 64cc1e3..cd39fb3 100644 --- a/lib/views/your_tenders/pages/your_tenders_tablet_page.dart +++ b/lib/views/your_tenders/pages/your_tenders_tablet_page.dart @@ -1,7 +1,5 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:provider/provider.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/view_models/your_tenders_view_model.dart'; @@ -46,21 +44,6 @@ class _YourTendersTabletPageState extends State appBar: tabletAppBar(title: YourTendersStrings.yourTenders, key: key), drawer: TabletNavigationWidget( currentIndex: 1, // Home is index 0 - onTabChanged: (index) { - // Handle navigation to other tabs - switch (index) { - case 0: - Router.neglect(context, () => HomeRouteData().go(context)); - break; - case 1: - break; - case 2: - // Navigate to profile - context.pop(); - Router.neglect(context, () => ProfileRouteData().go(context)); - break; - } - }, ), body: Center( child: SizedBox( @@ -114,9 +97,14 @@ class _YourTendersTabletPageState extends State isDesctop: false, ); } else if (viewModel.data != null) { - return TendersSubmitted(approvedTenders: viewModel.data!,isDesktop: false,); + return TendersSubmitted( + approvedTenders: viewModel.data!, + isDesktop: false, + ); } else { - return const Center(child: Text('No data available')); + return const Center( + child: Text(YourTendersStrings.noTenders), + ); } }, ), diff --git a/lib/views/your_tenders/strings/your_tenders_strings.dart b/lib/views/your_tenders/strings/your_tenders_strings.dart index d8929b5..2476151 100644 --- a/lib/views/your_tenders/strings/your_tenders_strings.dart +++ b/lib/views/your_tenders/strings/your_tenders_strings.dart @@ -13,4 +13,6 @@ class YourTendersStrings { static const startDate = 'YYYY/MM/DD'; static const endDate = 'YYYY/MM/DD'; static const approvedTenders = 'Approved tenders'; + static const noTenders = 'No data available'; + static const selectPublicationRangeDate = 'Select publication date range'; } diff --git a/lib/views/your_tenders/widgets/tenders_filter_dialog.dart b/lib/views/your_tenders/widgets/tenders_filter_dialog.dart index a0aa696..714fef2 100644 --- a/lib/views/your_tenders/widgets/tenders_filter_dialog.dart +++ b/lib/views/your_tenders/widgets/tenders_filter_dialog.dart @@ -115,7 +115,7 @@ class TendersFilterDialog extends StatelessWidget { ), SizedBox(height: 16.0.h()), Text( - 'Select date range', + YourTendersStrings.selectPublicationRangeDate, style: TextStyle( fontSize: 16.0.sp(), fontWeight: FontWeight.w600,