Navigate recommended tenders label to tab
continuous-integration/drone/push Build is passing

This commit is contained in:
AmirReza Jamali
2026-06-28 11:42:45 +03:30
parent 984f2e5139
commit 17ccd9d464
8 changed files with 97 additions and 38 deletions
+3 -1
View File
@@ -200,7 +200,9 @@ class TendersRouteData extends GoRouteData with _$TendersRouteData {
@override @override
Widget build(BuildContext context, GoRouterState state) { Widget build(BuildContext context, GoRouterState state) {
return tendersProvider(child: const TendersScreen()); return tendersProvider(
child: TendersScreen(initialTab: state.uri.queryParameters['tab']),
);
} }
} }
+18 -10
View File
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tm_app/core/constants/assets.dart'; import 'package:tm_app/core/constants/assets.dart';
import 'package:tm_app/core/routes/app_routes.dart'; import 'package:tm_app/core/routes/app_routes.dart';
@@ -67,7 +68,7 @@ class DesktopHomePage extends StatelessWidget {
), ),
), ),
SizedBox(height: 32.0.h()), SizedBox(height: 32.0.h()),
_yourTenderText(homeViewModel), _yourTenderText(context, homeViewModel),
SizedBox(height: 8.0.h()), SizedBox(height: 8.0.h()),
_bottomListView(homeViewModel), _bottomListView(homeViewModel),
], ],
@@ -195,21 +196,28 @@ class DesktopHomePage extends StatelessWidget {
); );
} }
Widget _yourTenderText(HomeViewModel homeViewModel) { Widget _yourTenderText(BuildContext context, HomeViewModel homeViewModel) {
final isYourTenders = final isYourTenders =
(homeViewModel.data?.data?.tenders?.isNotEmpty ?? false); (homeViewModel.data?.data?.tenders?.isNotEmpty ?? false);
return ConstrainedBox( return ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 740), constraints: const BoxConstraints(maxWidth: 740),
child: Align( child: Align(
alignment: AlignmentDirectional.centerStart, alignment: AlignmentDirectional.centerStart,
child: Text( child: GestureDetector(
isYourTenders behavior: HitTestBehavior.opaque,
? HomeStrings.yourTenders onTap:
: HomeStrings.recommendedTenders, isYourTenders
style: TextStyle( ? null
fontSize: 18.0.sp(), : () => context.go('/tenders?tab=recommended'),
fontWeight: FontWeight.w700, child: Text(
color: AppColors.grey80, isYourTenders
? HomeStrings.yourTenders
: HomeStrings.recommendedTenders,
style: TextStyle(
fontSize: 18.0.sp(),
fontWeight: FontWeight.w700,
color: AppColors.grey80,
),
), ),
), ),
), ),
+16 -10
View File
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tm_app/core/constants/assets.dart'; import 'package:tm_app/core/constants/assets.dart';
import 'package:tm_app/core/routes/app_routes.dart'; import 'package:tm_app/core/routes/app_routes.dart';
@@ -50,7 +51,7 @@ class MobileHomePage extends StatelessWidget {
SizedBox(height: 8.0.h()), SizedBox(height: 8.0.h()),
_secondTenderCardsRow(homeViewModel, context), _secondTenderCardsRow(homeViewModel, context),
SizedBox(height: 40.0.h()), SizedBox(height: 40.0.h()),
_yourTenderText(homeViewModel), _yourTenderText(context, homeViewModel),
_bottomListView(homeViewModel), _bottomListView(homeViewModel),
], ],
), ),
@@ -169,19 +170,24 @@ class MobileHomePage extends StatelessWidget {
); );
} }
Widget _yourTenderText(HomeViewModel homeViewModel) { Widget _yourTenderText(BuildContext context, HomeViewModel homeViewModel) {
final isYourTenders = final isYourTenders =
(homeViewModel.data?.data?.tenders?.isNotEmpty ?? false); (homeViewModel.data?.data?.tenders?.isNotEmpty ?? false);
return Padding( return Padding(
padding: EdgeInsets.symmetric(horizontal: 24.0.w()), padding: EdgeInsets.symmetric(horizontal: 24.0.w()),
child: Text( child: GestureDetector(
isYourTenders behavior: HitTestBehavior.opaque,
? HomeStrings.yourTenders onTap:
: HomeStrings.recommendedTenders, isYourTenders ? null : () => context.go('/tenders?tab=recommended'),
style: TextStyle( child: Text(
fontSize: 18.0.sp(), isYourTenders
fontWeight: FontWeight.w700, ? HomeStrings.yourTenders
color: AppColors.grey80, : HomeStrings.recommendedTenders,
style: TextStyle(
fontSize: 18.0.sp(),
fontWeight: FontWeight.w700,
color: AppColors.grey80,
),
), ),
), ),
); );
+16 -8
View File
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:tm_app/core/routes/app_routes.dart'; import 'package:tm_app/core/routes/app_routes.dart';
import 'package:tm_app/core/theme/colors.dart'; import 'package:tm_app/core/theme/colors.dart';
@@ -65,7 +66,7 @@ class TabletHomePage extends StatelessWidget {
SizedBox(height: 8.0.h()), SizedBox(height: 8.0.h()),
_secondTenderCardsRow(homeViewModel, context), _secondTenderCardsRow(homeViewModel, context),
SizedBox(height: 32.0.h()), SizedBox(height: 32.0.h()),
_yourTenderText(homeViewModel), _yourTenderText(context, homeViewModel),
SizedBox(height: 8.0.h()), SizedBox(height: 8.0.h()),
_bottomListView(homeViewModel), _bottomListView(homeViewModel),
], ],
@@ -201,15 +202,22 @@ class TabletHomePage extends StatelessWidget {
); );
} }
Widget _yourTenderText(HomeViewModel homeViewModel) { Widget _yourTenderText(BuildContext context, HomeViewModel homeViewModel) {
final isYourTenders = final isYourTenders =
(homeViewModel.data?.data?.tenders?.isNotEmpty ?? false); (homeViewModel.data?.data?.tenders?.isNotEmpty ?? false);
return Text( return GestureDetector(
isYourTenders ? HomeStrings.yourTenders : HomeStrings.recommendedTenders, behavior: HitTestBehavior.opaque,
style: TextStyle( onTap:
fontSize: 18.0.sp(), isYourTenders ? null : () => context.go('/tenders?tab=recommended'),
fontWeight: FontWeight.w700, child: Text(
color: AppColors.grey80, isYourTenders
? HomeStrings.yourTenders
: HomeStrings.recommendedTenders,
style: TextStyle(
fontSize: 18.0.sp(),
fontWeight: FontWeight.w700,
color: AppColors.grey80,
),
), ),
); );
} }
+12 -2
View File
@@ -21,7 +21,9 @@ import '../../../core/utils/app_toast.dart';
import '../../../view_models/auth_view_model.dart'; import '../../../view_models/auth_view_model.dart';
class DesktopTendersPage extends StatefulWidget { class DesktopTendersPage extends StatefulWidget {
const DesktopTendersPage({super.key}); const DesktopTendersPage({required this.initialSelectedTab, super.key});
final int initialSelectedTab;
@override @override
State<DesktopTendersPage> createState() => _DesktopTendersPageState(); State<DesktopTendersPage> createState() => _DesktopTendersPageState();
@@ -36,10 +38,19 @@ class _DesktopTendersPageState extends State<DesktopTendersPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_selectedTab = widget.initialSelectedTab;
viewModel = context.read<TendersViewModel>(); viewModel = context.read<TendersViewModel>();
viewModel.addListener(_viewModelListener); viewModel.addListener(_viewModelListener);
} }
@override
void didUpdateWidget(covariant DesktopTendersPage oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.initialSelectedTab != widget.initialSelectedTab) {
_selectedTab = widget.initialSelectedTab;
}
}
void _viewModelListener() { void _viewModelListener() {
if (viewModel.feedbackErrorMessage != null) { if (viewModel.feedbackErrorMessage != null) {
AppToast.error(context, viewModel.feedbackErrorMessage!); AppToast.error(context, viewModel.feedbackErrorMessage!);
@@ -276,4 +287,3 @@ class _ActionButtons extends StatelessWidget {
); );
} }
} }
+12 -1
View File
@@ -13,7 +13,9 @@ import '../widgets/recommended_tenders_view.dart';
import '../widgets/tenders_tab_bar.dart'; import '../widgets/tenders_tab_bar.dart';
class MobileTendersPage extends StatefulWidget { class MobileTendersPage extends StatefulWidget {
const MobileTendersPage({super.key}); const MobileTendersPage({required this.initialSelectedTab, super.key});
final int initialSelectedTab;
@override @override
State<MobileTendersPage> createState() => _MobileTendersPageState(); State<MobileTendersPage> createState() => _MobileTendersPageState();
@@ -28,10 +30,19 @@ class _MobileTendersPageState extends State<MobileTendersPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_selectedTab = widget.initialSelectedTab;
viewModel = context.read<TendersViewModel>(); viewModel = context.read<TendersViewModel>();
viewModel.addListener(_viewModelListener); viewModel.addListener(_viewModelListener);
} }
@override
void didUpdateWidget(covariant MobileTendersPage oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.initialSelectedTab != widget.initialSelectedTab) {
_selectedTab = widget.initialSelectedTab;
}
}
void _viewModelListener() { void _viewModelListener() {
if (viewModel.feedbackErrorMessage != null) { if (viewModel.feedbackErrorMessage != null) {
AppToast.error(context, viewModel.feedbackErrorMessage!); AppToast.error(context, viewModel.feedbackErrorMessage!);
+12 -1
View File
@@ -13,7 +13,9 @@ import '../widgets/recommended_tenders_view.dart';
import '../widgets/tenders_tab_bar.dart'; import '../widgets/tenders_tab_bar.dart';
class TabletTendersPage extends StatefulWidget { class TabletTendersPage extends StatefulWidget {
const TabletTendersPage({super.key}); const TabletTendersPage({required this.initialSelectedTab, super.key});
final int initialSelectedTab;
@override @override
State<TabletTendersPage> createState() => _TabletTendersPageState(); State<TabletTendersPage> createState() => _TabletTendersPageState();
@@ -28,9 +30,18 @@ class _TabletTendersPageState extends State<TabletTendersPage> {
@override @override
void initState() { void initState() {
super.initState(); super.initState();
_selectedTab = widget.initialSelectedTab;
viewModel = context.read<TendersViewModel>(); viewModel = context.read<TendersViewModel>();
} }
@override
void didUpdateWidget(covariant TabletTendersPage oldWidget) {
super.didUpdateWidget(oldWidget);
if (oldWidget.initialSelectedTab != widget.initialSelectedTab) {
_selectedTab = widget.initialSelectedTab;
}
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final GlobalKey<ScaffoldState> key = GlobalKey(); final GlobalKey<ScaffoldState> key = GlobalKey();
+8 -5
View File
@@ -10,7 +10,9 @@ import 'm_tenders_page.dart';
import 't_tenders_page.dart'; import 't_tenders_page.dart';
class TendersScreen extends StatefulWidget { class TendersScreen extends StatefulWidget {
const TendersScreen({super.key}); const TendersScreen({this.initialTab, super.key});
final String? initialTab;
@override @override
State<TendersScreen> createState() => _TendersScreenState(); State<TendersScreen> createState() => _TendersScreenState();
@@ -48,10 +50,11 @@ class _TendersScreenState extends State<TendersScreen> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
SizeConfig.init(context); SizeConfig.init(context);
return const ResponsiveBuilder( final initialSelectedTab = widget.initialTab == 'recommended' ? 1 : 0;
mobile: MobileTendersPage(), return ResponsiveBuilder(
tablet: TabletTendersPage(), mobile: MobileTendersPage(initialSelectedTab: initialSelectedTab),
desktop: DesktopTendersPage(), tablet: TabletTendersPage(initialSelectedTab: initialSelectedTab),
desktop: DesktopTendersPage(initialSelectedTab: initialSelectedTab),
); );
} }
} }