tablet navigation bar fixed

This commit is contained in:
amirrezaghabeli
2025-08-26 14:58:06 +03:30
parent 3bde47dbb3
commit 4f07facbb8
18 changed files with 628 additions and 479 deletions
@@ -57,7 +57,7 @@ class TenderDetailHeader extends StatelessWidget {
),
),
StatusTag(
text: detail.status ?? '',
text: detail.procurementTypeCode ?? '',
textColor: AppColors.cyanTeal,
backgroundColor: AppColors.cyanAqua,
),
@@ -1,4 +1,5 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:tm_app/core/constants/strings.dart';
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import 'package:tm_app/views/detail/widgets/deadline_item.dart';
@@ -19,13 +20,13 @@ class TenderDetailInfoSection extends StatelessWidget {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
InfoItem(title: AppStrings.tenderIdLabel, value: detail.id ?? ''),
InfoItem(title: AppStrings.tenderIdLabel, value: detail.tenderId ?? ''),
DeadlineItem(
title: AppStrings.tenderDeadlineLabel,
approvalText: AppStrings.tenderApprovalText,
approvalDate: '',
approvalDate: unixToDate(detail.submissionDeadline),
submissionText: AppStrings.tenderSubmissionText,
submissionDate: '',
submissionDate: unixToDate(detail.applicationDeadline),
isScreenBig: isScreenBig,
),
InfoItem(
@@ -33,8 +34,12 @@ class TenderDetailInfoSection extends StatelessWidget {
value: detail.buyerOrganization!.name ?? '',
),
InfoItem(
title: AppStrings.tenderDeliveryLocationsLabel,
value: detail.countryCode ?? '',
title: AppStrings.estimatedValue,
value: '${detail.estimatedValue} ${detail.currency ?? ''}',
),
InfoItem(
title: AppStrings.duration,
value: '${detail.duration} ${detail.durationUnit ?? ''}',
),
InfoItem(
title: AppStrings.tenderReferenceNumberLabel,
@@ -44,3 +49,16 @@ class TenderDetailInfoSection extends StatelessWidget {
);
}
}
String unixToDate(int? unixTimestamp, {String format = 'yyyy-MM-dd'}) {
if (unixTimestamp == null) {
return '';
}
// Convert seconds to milliseconds if needed
int timestampInMs =
unixTimestamp > 1000000000000 ? unixTimestamp : unixTimestamp * 1000;
final DateTime dateTime = DateTime.fromMillisecondsSinceEpoch(timestampInMs);
return DateFormat(format).format(dateTime);
}
+55 -1
View File
@@ -1,4 +1,6 @@
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/strings.dart';
import 'package:tm_app/core/routes/app_routes.dart';
@@ -7,7 +9,9 @@ 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/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/tablet_navigation_widget.dart';
import '../../../core/constants/assets.dart';
import '../widgets.dart';
class TabletHomePage extends StatelessWidget {
@@ -15,7 +19,57 @@ class TabletHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
final GlobalKey<ScaffoldState> key = GlobalKey();
return Scaffold(
key: key,
appBar: PreferredSize(
preferredSize: const Size.fromHeight(64),
child: AppBar(
backgroundColor: AppColors.backgroundColor,
elevation: 0,
titleSpacing: 0,
leading: Padding(
padding: EdgeInsetsDirectional.only(start: 24.0.w()),
child: SvgPicture.asset(AssetsManager.logoSmall),
),
actions: [
IconButton(
icon: Padding(
padding: EdgeInsetsDirectional.only(end: 24.0.w()),
child: SvgPicture.asset(
AssetsManager.menu,
height: 32.0.w(),
width: 32.0.w(),
),
),
onPressed: () => key.currentState!.openDrawer(),
),
],
),
),
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, () => context.go('/tenders'));
break;
case 2:
// Navigate to profile
context.pop();
Router.neglect(context, () => context.go('/profile'));
break;
}
},
),
body: Consumer<HomeViewModel>(
builder: (context, homeViewModel, child) {
if (homeViewModel.isLoading) {
@@ -32,7 +86,7 @@ class TabletHomePage extends StatelessWidget {
child: Padding(
padding: EdgeInsetsDirectional.fromSTEB(
24.0.w(),
120.0.h(),
24.0.h(),
24.0.w(),
24.0.h(),
),
+2 -2
View File
@@ -1,7 +1,7 @@
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/routes/app_routes.dart';
import 'package:tm_app/core/theme/colors.dart';
import '../../../core/constants/assets.dart';
@@ -28,7 +28,7 @@ class _LoginMobilePageState extends State<LoginMobilePage> {
void _viewModelListener() {
if (viewModel.loggedInUser != null) {
HomeRouteData().go(context);
Router.neglect(context, () => context.go('/home'));
}
if (viewModel.errorMessage != null) {
ScaffoldMessenger.of(
+11 -10
View File
@@ -1,6 +1,6 @@
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 '../../../core/constants/assets.dart';
@@ -28,12 +28,12 @@ class _LoginTabletPageState extends State<LoginTabletPage> {
void _viewModelListener() {
if (viewModel.loggedInUser != null) {
HomeRouteData().go(context);
Router.neglect(context, () => context.go('/home'));
}
if (viewModel.errorMessage != null) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(viewModel.errorMessage!)),
);
ScaffoldMessenger.of(
context,
).showSnackBar(SnackBar(content: Text(viewModel.errorMessage!)));
}
}
@@ -94,11 +94,12 @@ class _LoginTabletPageState extends State<LoginTabletPage> {
else
BaseButton(
isEnabled: viewModel.isLoginEnabled,
onPressed: viewModel.isLoginEnabled
? () async {
await viewModel.login();
}
: null,
onPressed:
viewModel.isLoginEnabled
? () async {
await viewModel.login();
}
: null,
),
],
);
+132 -138
View File
@@ -51,145 +51,139 @@ class _DesktopProfilePageState extends State<DesktopProfilePage> {
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
backgroundColor: AppColors.backgroundColor,
body: Consumer<ProfileViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
return Center(
child: CircularProgressIndicator(color: AppColors.secondary50),
);
}
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return Column(
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, () => context.go('/home'));
break;
case 1:
// Navigate to profile
Router.neglect(context, () => context.go('/tenders'));
break;
case 2:
// Already on profile
break;
}
},
),
SizedBox(
// color: Colors.amber.shade100,
width: 740,
// height: 662,
child: Column(
children: [
SizedBox(height: 36.0.h()),
TitleDescription(
title: 'Company Name',
description: viewModel.companyProfileData!.name!,
),
TitleDescription(
title: 'National ID',
description: viewModel.companyProfileData!.id!,
),
TitleDescription(
title: 'Registration No.',
description:
viewModel.companyProfileData!.registrationNumber!,
),
TitleDescription(
title: 'Business Type',
description: '-',
),
TitleDescription(
title: 'Founded',
description:
viewModel.companyProfileData!.foundedYear!
.toString(),
),
SizedBox(height: 24.0.h()),
// Theme Toggle
Align(
alignment: AlignmentDirectional.centerStart,
child: Text(
AppStrings.settings,
style: TextStyle(
fontSize: 20.0.sp(),
fontWeight: FontWeight.w600,
color: AppColors.grey70,
),
),
),
SizedBox(height: 36.0.h()),
Padding(
padding: EdgeInsets.symmetric(horizontal: 8.0.w()),
child: Row(
children: [
Text(
AppStrings.appTheme,
style: TextStyle(
fontSize: 16.0.sp(),
fontWeight: FontWeight.w400,
color: AppColors.grey70,
),
),
Spacer(),
SvgPicture.asset(AssetsManager.sun),
SizedBox(width: 12.0.w()),
SizedBox(
width: 52.0.w(),
height: 32.0.h(),
child: ThemeToggle(),
),
SizedBox(width: 12.0.w()),
SvgPicture.asset(AssetsManager.moon),
],
),
),
SizedBox(height: 24.0.h()),
Divider(color: AppColors.dividerColor, thickness: 1),
SizedBox(height: 24.0.h()),
// Spacer(),
Align(
alignment: Alignment.centerRight,
child: InkWell(
onTap: () => viewModel.logout(),
child: Container(
width: 156,
height: 56.0.h(),
decoration: BoxDecoration(
color: AppColors.primary20,
borderRadius: BorderRadius.circular(100),
),
alignment: Alignment.center,
child: Text(
'Logout',
style: TextStyle(
fontSize: 14.0.sp(),
fontWeight: FontWeight.w500,
color: AppColors.primaryColor,
),
),
),
),
),
],
),
),
],
return Scaffold(
backgroundColor: AppColors.backgroundColor,
body: Consumer<ProfileViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
return Center(
child: CircularProgressIndicator(color: AppColors.secondary50),
);
},
),
}
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return Column(
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, () => context.go('/home'));
break;
case 1:
// Navigate to profile
Router.neglect(context, () => context.go('/tenders'));
break;
case 2:
// Already on profile
break;
}
},
),
SizedBox(
// color: Colors.amber.shade100,
width: 740,
// height: 662,
child: Column(
children: [
SizedBox(height: 36.0.h()),
TitleDescription(
title: 'Company Name',
description: viewModel.companyProfileData!.name!,
),
TitleDescription(
title: 'National ID',
description: viewModel.companyProfileData!.id!,
),
TitleDescription(
title: 'Registration No.',
description:
viewModel.companyProfileData!.registrationNumber!,
),
TitleDescription(title: 'Business Type', description: '-'),
TitleDescription(
title: 'Founded',
description:
viewModel.companyProfileData!.foundedYear!.toString(),
),
SizedBox(height: 24.0.h()),
// Theme Toggle
Align(
alignment: AlignmentDirectional.centerStart,
child: Text(
AppStrings.settings,
style: TextStyle(
fontSize: 20.0.sp(),
fontWeight: FontWeight.w600,
color: AppColors.grey70,
),
),
),
SizedBox(height: 36.0.h()),
Padding(
padding: EdgeInsets.symmetric(horizontal: 8.0.w()),
child: Row(
children: [
Text(
AppStrings.appTheme,
style: TextStyle(
fontSize: 16.0.sp(),
fontWeight: FontWeight.w400,
color: AppColors.grey70,
),
),
Spacer(),
SvgPicture.asset(AssetsManager.sun),
SizedBox(width: 12.0.w()),
SizedBox(
width: 52.0.w(),
height: 32.0.h(),
child: ThemeToggle(),
),
SizedBox(width: 12.0.w()),
SvgPicture.asset(AssetsManager.moon),
],
),
),
SizedBox(height: 24.0.h()),
Divider(color: AppColors.dividerColor, thickness: 1),
SizedBox(height: 24.0.h()),
// Spacer(),
Align(
alignment: Alignment.centerRight,
child: InkWell(
onTap: () => viewModel.logout(),
child: Container(
width: 156,
height: 56.0.h(),
decoration: BoxDecoration(
color: AppColors.primary20,
borderRadius: BorderRadius.circular(100),
),
alignment: Alignment.center,
child: Text(
'Logout',
style: TextStyle(
fontSize: 14.0.sp(),
fontWeight: FontWeight.w500,
color: AppColors.primaryColor,
),
),
),
),
),
],
),
),
],
);
},
),
);
}
@@ -1,13 +1,16 @@
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/strings.dart';
import 'package:tm_app/core/routes/app_routes.dart';
import 'package:tm_app/view_models/home_view_model.dart';
import 'package:tm_app/view_models/profile_view_model.dart';
import '../../../core/theme/colors.dart';
import '../../../core/utils/size_config.dart';
import '../../shared/tablet_navigation_widget.dart';
import '../widgets/theme_toggle.dart';
import '../widgets/title_description.dart';
@@ -49,6 +52,7 @@ class _TabletProfilePageState extends State<TabletProfilePage> {
@override
Widget build(BuildContext context) {
final GlobalKey<ScaffoldState> key = GlobalKey();
return Consumer<ProfileViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
@@ -62,7 +66,49 @@ class _TabletProfilePageState extends State<TabletProfilePage> {
return SafeArea(
child: Scaffold(
key: key,
backgroundColor: AppColors.backgroundColor,
appBar: PreferredSize(
preferredSize: const Size.fromHeight(64),
child: AppBar(
backgroundColor: AppColors.backgroundColor,
elevation: 0,
titleSpacing: 0,
leading: Padding(
padding: EdgeInsetsDirectional.only(start: 24.0.w()),
child: SvgPicture.asset(AssetsManager.logoSmall),
),
actions: [
IconButton(
icon: Padding(
padding: EdgeInsetsDirectional.only(end: 24.0.w()),
child: SvgPicture.asset(
AssetsManager.menu,
height: 32.0.w(),
width: 32.0.w(),
),
),
onPressed: () => key.currentState!.openDrawer(),
),
],
),
),
drawer: TabletNavigationWidget(
currentIndex: 2,
onTabChanged: (index) {
switch (index) {
case 0:
context.pop();
Router.neglect(context, () => context.go('/home'));
context.read<HomeViewModel>().init();
break;
case 1:
context.pop();
Router.neglect(context, () => context.go('/tenders'));
break;
}
},
),
body: Padding(
padding: EdgeInsets.symmetric(
horizontal: 24.0.w(),
@@ -0,0 +1,98 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:tm_app/core/constants/assets.dart';
import 'package:tm_app/core/constants/strings.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/core/utils/size_config.dart';
class TabletNavigationWidget extends StatelessWidget {
const TabletNavigationWidget({
required this.currentIndex,
required this.onTabChanged,
super.key,
});
final int currentIndex;
final ValueChanged<int> onTabChanged;
@override
Widget build(BuildContext context) {
return Container(
width: 200.0.w(),
height: double.infinity,
color: AppColors.backgroundColor,
child: Column(
children: [
SizedBox(height: 48.0.h()),
_navigationItem(
context: context,
text: AppStrings.home,
isActive: currentIndex == 0,
onTap: () => onTabChanged(0),
iconPath: AssetsManager.home,
activeIconPath: AssetsManager.homeActive,
),
_navigationItem(
context: context,
text: AppStrings.tendersTitle,
isActive: currentIndex == 1,
onTap: () => onTabChanged(1),
iconPath: AssetsManager.tenders,
activeIconPath: AssetsManager.tendersActive,
),
_navigationItem(
context: context,
text: AppStrings.profile,
isActive: currentIndex == 2,
onTap: () => onTabChanged(2),
iconPath: AssetsManager.profile,
activeIconPath: AssetsManager.profileActive,
),
],
),
);
}
Widget _navigationItem({
required BuildContext context,
required String text,
required bool isActive,
required VoidCallback onTap,
required String iconPath,
required String activeIconPath,
}) {
return InkWell(
onTap: onTap,
child: Container(
width: 200.0.w(),
height: 64.0.h(),
decoration: BoxDecoration(color: AppColors.backgroundColor),
child: Padding(
padding: EdgeInsetsDirectional.only(start: 24.0.w()),
child: Row(
children: [
SvgPicture.asset(isActive ? activeIconPath : iconPath),
SizedBox(width: 12.0.w()),
Text(
text,
style: TextStyle(
fontSize: 14.0.sp(),
fontWeight: isActive ? FontWeight.w600 : FontWeight.w400,
color: isActive ? AppColors.primaryColor : AppColors.grey60,
),
),
Spacer(),
Container(
width: 4.0.w(),
height: 64.0.h(),
decoration: BoxDecoration(
color: isActive ? AppColors.primaryColor : Colors.transparent,
),
),
],
),
),
),
);
}
}
+53 -55
View File
@@ -51,66 +51,64 @@ class _DesktopTendersPageState extends State<DesktopTendersPage> {
@override
Widget build(BuildContext context) {
return SafeArea(
child: 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, () => context.go('/home'));
context.read<HomeViewModel>().init();
break;
case 1:
// Already on tenders
break;
case 2:
// Navigate to profile
// context.go('/profile');
Router.neglect(context, () => context.go('/profile'));
break;
}
},
),
Expanded(
child: Center(
child: SingleChildScrollView(
child: Consumer<TendersViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
return Center(
child: CircularProgressIndicator(
color: AppColors.jellyBean,
),
);
}
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return SizedBox(
width: 740,
height: 800,
child: Padding(
padding: EdgeInsets.symmetric(vertical: 24.0.h()),
child: MainTendersSlider(
tenders:
viewModel.tendersResponse?.data?.tenders ?? [],
isDesktop: true,
),
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, () => context.go('/home'));
context.read<HomeViewModel>().init();
break;
case 1:
// Already on tenders
break;
case 2:
// Navigate to profile
// context.go('/profile');
Router.neglect(context, () => context.go('/profile'));
break;
}
},
),
Expanded(
child: Center(
child: SingleChildScrollView(
child: Consumer<TendersViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
return Center(
child: CircularProgressIndicator(
color: AppColors.jellyBean,
),
);
},
),
}
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return SizedBox(
width: 740,
height: 800,
child: Padding(
padding: EdgeInsets.symmetric(vertical: 24.0.h()),
child: MainTendersSlider(
tenders:
viewModel.tendersResponse?.data?.tenders ?? [],
isDesktop: true,
),
),
);
},
),
),
),
],
),
),
],
),
);
}
+69 -22
View File
@@ -1,38 +1,85 @@
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/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/shared/tablet_navigation_widget.dart';
import 'package:tm_app/views/tenders/widgets/main_tenders_slider.dart';
import '../../../core/constants/assets.dart';
class TabletTendersPage extends StatelessWidget {
const TabletTendersPage({super.key});
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
backgroundColor: AppColors.backgroundColor,
body: SingleChildScrollView(
child: Consumer<TendersViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
return Center(
child: CircularProgressIndicator(color: AppColors.jellyBean),
);
}
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return Padding(
padding: EdgeInsets.only(right: 24.0.w(), top: 128.0.h()),
child: MainTendersSlider(
tenders: viewModel.tendersResponse?.data?.tenders ?? [],
),
);
},
final GlobalKey<ScaffoldState> key = GlobalKey();
return Scaffold(
key: key,
backgroundColor: AppColors.backgroundColor,
appBar: PreferredSize(
preferredSize: const Size.fromHeight(64),
child: AppBar(
backgroundColor: AppColors.backgroundColor,
elevation: 0,
titleSpacing: 0,
leading: Padding(
padding: EdgeInsetsDirectional.only(start: 24.0.w()),
child: SvgPicture.asset(AssetsManager.logoSmall),
),
actions: [
IconButton(
icon: Padding(
padding: EdgeInsetsDirectional.only(end: 24.0.w()),
child: SvgPicture.asset(
AssetsManager.menu,
height: 32.0.w(),
width: 32.0.w(),
),
),
onPressed: () => key.currentState!.openDrawer(),
),
],
),
),
drawer: TabletNavigationWidget(
currentIndex: 1,
onTabChanged: (index) {
switch (index) {
case 0:
context.pop();
Router.neglect(context, () => context.go('/home'));
context.read<HomeViewModel>().init();
break;
case 2:
context.pop();
Router.neglect(context, () => context.go('/profile'));
break;
}
},
),
body: SingleChildScrollView(
child: Consumer<TendersViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
return Center(
child: CircularProgressIndicator(color: AppColors.jellyBean),
);
}
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return Padding(
padding: EdgeInsets.only(right: 24.0.w(), top: 128.0.h()),
child: MainTendersSlider(
tenders: viewModel.tendersResponse?.data?.tenders ?? [],
),
);
},
),
),
);
@@ -40,80 +40,76 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
backgroundColor: AppColors.backgroundColor,
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, () => context.go('/home'));
break;
case 1:
// Already on tenders
break;
case 2:
// Navigate to profile
// context.go('/profile');
Router.neglect(context, () => context.go('/profile'));
break;
}
},
),
Expanded(
child: SizedBox(
width: 740,
child: Column(
children: [
SizedBox(height: 64.0),
TabletDesktopAppbar(),
SizedBox(height: 20.0),
MainTabBar(
controller: controller,
titles: [
AppStrings.approvedTenders,
AppStrings.tenderSubmitted,
],
),
Expanded(
child: Consumer<YourTendersViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
return const Center(
child: CircularProgressIndicator(
color: AppColors.secondary50,
),
);
}
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return TabBarView(
controller: controller,
children: [
ApprovedTenders(tendersSubmitted: []),
TendersSubmitted(
approvedTenders: viewModel.data!,
),
],
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, () => context.go('/home'));
break;
case 1:
// Already on tenders
break;
case 2:
// Navigate to profile
// context.go('/profile');
Router.neglect(context, () => context.go('/profile'));
break;
}
},
),
Expanded(
child: SizedBox(
width: 740,
child: Column(
children: [
SizedBox(height: 64.0),
TabletDesktopAppbar(),
SizedBox(height: 20.0),
MainTabBar(
controller: controller,
titles: [
AppStrings.approvedTenders,
AppStrings.tenderSubmitted,
],
),
Expanded(
child: Consumer<YourTendersViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
return const Center(
child: CircularProgressIndicator(
color: AppColors.secondary50,
),
);
},
),
}
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return TabBarView(
controller: controller,
children: [
ApprovedTenders(tendersSubmitted: []),
TendersSubmitted(approvedTenders: viewModel.data!),
],
);
},
),
],
),
),
],
),
),
],
),
),
],
),
);
}
@@ -38,55 +38,53 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
@override
Widget build(BuildContext context) {
return SafeArea(
child: Scaffold(
backgroundColor: AppColors.backgroundColor,
return Scaffold(
backgroundColor: AppColors.backgroundColor,
body: Center(
child: SizedBox(
width: 720,
child: Column(
children: [
SizedBox(height: 64.0.h()),
Padding(
padding: EdgeInsets.symmetric(horizontal: 8.0.w()),
child: TabletDesktopAppbar(),
),
SizedBox(height: 24.0.h()),
MainTabBar(
controller: controller,
titles: [
AppStrings.approvedTenders,
AppStrings.tenderSubmitted,
],
),
Expanded(
child: Consumer<YourTendersViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
return const Center(
child: CircularProgressIndicator(
color: AppColors.secondary50,
),
);
}
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return TabBarView(
controller: controller,
children: [
ApprovedTenders(tendersSubmitted: []),
TendersSubmitted(approvedTenders: viewModel.data!),
],
body: Center(
child: SizedBox(
width: 720,
child: Column(
children: [
SizedBox(height: 64.0.h()),
Padding(
padding: EdgeInsets.symmetric(horizontal: 8.0.w()),
child: TabletDesktopAppbar(),
),
SizedBox(height: 24.0.h()),
MainTabBar(
controller: controller,
titles: [
AppStrings.approvedTenders,
AppStrings.tenderSubmitted,
],
),
Expanded(
child: Consumer<YourTendersViewModel>(
builder: (context, viewModel, child) {
if (viewModel.isLoading) {
return const Center(
child: CircularProgressIndicator(
color: AppColors.secondary50,
),
);
},
),
}
if (viewModel.errorMessage != null) {
return Center(child: Text(viewModel.errorMessage!));
}
return TabBarView(
controller: controller,
children: [
ApprovedTenders(tendersSubmitted: []),
TendersSubmitted(approvedTenders: viewModel.data!),
],
);
},
),
],
),
),
],
),
),
),