From 17ccd9d464f3a397d67623c112cf8072663ca076 Mon Sep 17 00:00:00 2001 From: AmirReza Jamali Date: Sun, 28 Jun 2026 11:42:45 +0330 Subject: [PATCH] Navigate recommended tenders label to tab --- lib/core/routes/app_routes.dart | 4 ++- lib/views/home/pages/d_home_page.dart | 28 +++++++++++++-------- lib/views/home/pages/m_home_page.dart | 26 +++++++++++-------- lib/views/home/pages/t_home_page.dart | 24 ++++++++++++------ lib/views/tenders/pages/d_tenders_page.dart | 14 +++++++++-- lib/views/tenders/pages/m_tenders_page.dart | 13 +++++++++- lib/views/tenders/pages/t_tenders_page.dart | 13 +++++++++- lib/views/tenders/pages/tenders_screen.dart | 13 ++++++---- 8 files changed, 97 insertions(+), 38 deletions(-) diff --git a/lib/core/routes/app_routes.dart b/lib/core/routes/app_routes.dart index 354ce36..3cd6058 100644 --- a/lib/core/routes/app_routes.dart +++ b/lib/core/routes/app_routes.dart @@ -200,7 +200,9 @@ class TendersRouteData extends GoRouteData with _$TendersRouteData { @override Widget build(BuildContext context, GoRouterState state) { - return tendersProvider(child: const TendersScreen()); + return tendersProvider( + child: TendersScreen(initialTab: state.uri.queryParameters['tab']), + ); } } diff --git a/lib/views/home/pages/d_home_page.dart b/lib/views/home/pages/d_home_page.dart index 6d6a967..427a465 100644 --- a/lib/views/home/pages/d_home_page.dart +++ b/lib/views/home/pages/d_home_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.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'; @@ -67,7 +68,7 @@ class DesktopHomePage extends StatelessWidget { ), ), SizedBox(height: 32.0.h()), - _yourTenderText(homeViewModel), + _yourTenderText(context, homeViewModel), SizedBox(height: 8.0.h()), _bottomListView(homeViewModel), ], @@ -195,21 +196,28 @@ class DesktopHomePage extends StatelessWidget { ); } - Widget _yourTenderText(HomeViewModel homeViewModel) { + Widget _yourTenderText(BuildContext context, HomeViewModel homeViewModel) { final isYourTenders = (homeViewModel.data?.data?.tenders?.isNotEmpty ?? false); return ConstrainedBox( constraints: const BoxConstraints(maxWidth: 740), child: Align( alignment: AlignmentDirectional.centerStart, - child: Text( - isYourTenders - ? HomeStrings.yourTenders - : HomeStrings.recommendedTenders, - style: TextStyle( - fontSize: 18.0.sp(), - fontWeight: FontWeight.w700, - color: AppColors.grey80, + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: + isYourTenders + ? null + : () => context.go('/tenders?tab=recommended'), + child: Text( + isYourTenders + ? HomeStrings.yourTenders + : HomeStrings.recommendedTenders, + style: TextStyle( + fontSize: 18.0.sp(), + fontWeight: FontWeight.w700, + color: AppColors.grey80, + ), ), ), ), diff --git a/lib/views/home/pages/m_home_page.dart b/lib/views/home/pages/m_home_page.dart index 82563f8..907c60b 100644 --- a/lib/views/home/pages/m_home_page.dart +++ b/lib/views/home/pages/m_home_page.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.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'; @@ -50,7 +51,7 @@ class MobileHomePage extends StatelessWidget { SizedBox(height: 8.0.h()), _secondTenderCardsRow(homeViewModel, context), SizedBox(height: 40.0.h()), - _yourTenderText(homeViewModel), + _yourTenderText(context, homeViewModel), _bottomListView(homeViewModel), ], ), @@ -169,19 +170,24 @@ class MobileHomePage extends StatelessWidget { ); } - Widget _yourTenderText(HomeViewModel homeViewModel) { + Widget _yourTenderText(BuildContext context, HomeViewModel homeViewModel) { final isYourTenders = (homeViewModel.data?.data?.tenders?.isNotEmpty ?? false); return Padding( padding: EdgeInsets.symmetric(horizontal: 24.0.w()), - child: Text( - isYourTenders - ? HomeStrings.yourTenders - : HomeStrings.recommendedTenders, - style: TextStyle( - fontSize: 18.0.sp(), - fontWeight: FontWeight.w700, - color: AppColors.grey80, + child: GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: + isYourTenders ? null : () => context.go('/tenders?tab=recommended'), + child: Text( + isYourTenders + ? HomeStrings.yourTenders + : HomeStrings.recommendedTenders, + style: TextStyle( + fontSize: 18.0.sp(), + fontWeight: FontWeight.w700, + color: AppColors.grey80, + ), ), ), ); diff --git a/lib/views/home/pages/t_home_page.dart b/lib/views/home/pages/t_home_page.dart index feb700f..578d1f4 100644 --- a/lib/views/home/pages/t_home_page.dart +++ b/lib/views/home/pages/t_home_page.dart @@ -1,4 +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'; @@ -65,7 +66,7 @@ class TabletHomePage extends StatelessWidget { SizedBox(height: 8.0.h()), _secondTenderCardsRow(homeViewModel, context), SizedBox(height: 32.0.h()), - _yourTenderText(homeViewModel), + _yourTenderText(context, homeViewModel), SizedBox(height: 8.0.h()), _bottomListView(homeViewModel), ], @@ -201,15 +202,22 @@ class TabletHomePage extends StatelessWidget { ); } - Widget _yourTenderText(HomeViewModel homeViewModel) { + Widget _yourTenderText(BuildContext context, HomeViewModel homeViewModel) { final isYourTenders = (homeViewModel.data?.data?.tenders?.isNotEmpty ?? false); - return Text( - isYourTenders ? HomeStrings.yourTenders : HomeStrings.recommendedTenders, - style: TextStyle( - fontSize: 18.0.sp(), - fontWeight: FontWeight.w700, - color: AppColors.grey80, + return GestureDetector( + behavior: HitTestBehavior.opaque, + onTap: + isYourTenders ? null : () => context.go('/tenders?tab=recommended'), + child: Text( + isYourTenders + ? HomeStrings.yourTenders + : HomeStrings.recommendedTenders, + style: TextStyle( + fontSize: 18.0.sp(), + fontWeight: FontWeight.w700, + color: AppColors.grey80, + ), ), ); } diff --git a/lib/views/tenders/pages/d_tenders_page.dart b/lib/views/tenders/pages/d_tenders_page.dart index a8b8628..3131781 100644 --- a/lib/views/tenders/pages/d_tenders_page.dart +++ b/lib/views/tenders/pages/d_tenders_page.dart @@ -21,7 +21,9 @@ import '../../../core/utils/app_toast.dart'; import '../../../view_models/auth_view_model.dart'; class DesktopTendersPage extends StatefulWidget { - const DesktopTendersPage({super.key}); + const DesktopTendersPage({required this.initialSelectedTab, super.key}); + + final int initialSelectedTab; @override State createState() => _DesktopTendersPageState(); @@ -36,10 +38,19 @@ class _DesktopTendersPageState extends State { @override void initState() { super.initState(); + _selectedTab = widget.initialSelectedTab; viewModel = context.read(); viewModel.addListener(_viewModelListener); } + @override + void didUpdateWidget(covariant DesktopTendersPage oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.initialSelectedTab != widget.initialSelectedTab) { + _selectedTab = widget.initialSelectedTab; + } + } + void _viewModelListener() { if (viewModel.feedbackErrorMessage != null) { AppToast.error(context, viewModel.feedbackErrorMessage!); @@ -276,4 +287,3 @@ class _ActionButtons extends StatelessWidget { ); } } - diff --git a/lib/views/tenders/pages/m_tenders_page.dart b/lib/views/tenders/pages/m_tenders_page.dart index d80776e..a710f14 100644 --- a/lib/views/tenders/pages/m_tenders_page.dart +++ b/lib/views/tenders/pages/m_tenders_page.dart @@ -13,7 +13,9 @@ import '../widgets/recommended_tenders_view.dart'; import '../widgets/tenders_tab_bar.dart'; class MobileTendersPage extends StatefulWidget { - const MobileTendersPage({super.key}); + const MobileTendersPage({required this.initialSelectedTab, super.key}); + + final int initialSelectedTab; @override State createState() => _MobileTendersPageState(); @@ -28,10 +30,19 @@ class _MobileTendersPageState extends State { @override void initState() { super.initState(); + _selectedTab = widget.initialSelectedTab; viewModel = context.read(); viewModel.addListener(_viewModelListener); } + @override + void didUpdateWidget(covariant MobileTendersPage oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.initialSelectedTab != widget.initialSelectedTab) { + _selectedTab = widget.initialSelectedTab; + } + } + void _viewModelListener() { if (viewModel.feedbackErrorMessage != null) { AppToast.error(context, viewModel.feedbackErrorMessage!); diff --git a/lib/views/tenders/pages/t_tenders_page.dart b/lib/views/tenders/pages/t_tenders_page.dart index d036fbc..41f8e6b 100644 --- a/lib/views/tenders/pages/t_tenders_page.dart +++ b/lib/views/tenders/pages/t_tenders_page.dart @@ -13,7 +13,9 @@ import '../widgets/recommended_tenders_view.dart'; import '../widgets/tenders_tab_bar.dart'; class TabletTendersPage extends StatefulWidget { - const TabletTendersPage({super.key}); + const TabletTendersPage({required this.initialSelectedTab, super.key}); + + final int initialSelectedTab; @override State createState() => _TabletTendersPageState(); @@ -28,9 +30,18 @@ class _TabletTendersPageState extends State { @override void initState() { super.initState(); + _selectedTab = widget.initialSelectedTab; viewModel = context.read(); } + @override + void didUpdateWidget(covariant TabletTendersPage oldWidget) { + super.didUpdateWidget(oldWidget); + if (oldWidget.initialSelectedTab != widget.initialSelectedTab) { + _selectedTab = widget.initialSelectedTab; + } + } + @override Widget build(BuildContext context) { final GlobalKey key = GlobalKey(); diff --git a/lib/views/tenders/pages/tenders_screen.dart b/lib/views/tenders/pages/tenders_screen.dart index 7c564f4..de38f17 100644 --- a/lib/views/tenders/pages/tenders_screen.dart +++ b/lib/views/tenders/pages/tenders_screen.dart @@ -10,7 +10,9 @@ import 'm_tenders_page.dart'; import 't_tenders_page.dart'; class TendersScreen extends StatefulWidget { - const TendersScreen({super.key}); + const TendersScreen({this.initialTab, super.key}); + + final String? initialTab; @override State createState() => _TendersScreenState(); @@ -48,10 +50,11 @@ class _TendersScreenState extends State { @override Widget build(BuildContext context) { SizeConfig.init(context); - return const ResponsiveBuilder( - mobile: MobileTendersPage(), - tablet: TabletTendersPage(), - desktop: DesktopTendersPage(), + final initialSelectedTab = widget.initialTab == 'recommended' ? 1 : 0; + return ResponsiveBuilder( + mobile: MobileTendersPage(initialSelectedTab: initialSelectedTab), + tablet: TabletTendersPage(initialSelectedTab: initialSelectedTab), + desktop: DesktopTendersPage(initialSelectedTab: initialSelectedTab), ); } }