check web and tablet for logic
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
class AppConfig {
|
||||
// این فلگ نشان میدهد که آیا برنامه در حالت Development است یا خیر.
|
||||
// میتوانید این مقدار را با استفاده از environment variables در زمان بیلد تغییر دهید.
|
||||
@@ -8,23 +10,24 @@ class AppConfig {
|
||||
|
||||
// این متد بر اساس محیط فعال، URL مناسب را برمیگرداند.
|
||||
static String get apiBaseUrl {
|
||||
return 'http://10.0.2.2:8081';
|
||||
// return 'http:127.0.0.1';
|
||||
// return 'http://10.0.2.2:8081';
|
||||
// return '192.168.1.103:8081';
|
||||
// if (isDevelopment) {
|
||||
// // Handle different platforms for local development
|
||||
// if (kIsWeb) {
|
||||
// // For web, use localhost
|
||||
// return 'http://localhost:8081';
|
||||
// } else if (Platform.isAndroid) {
|
||||
// // For Android emulator, use 10.0.2.2 (special IP for host machine)
|
||||
// return 'http://10.0.2.2:8081';
|
||||
// } else if (Platform.isIOS) {
|
||||
// // For iOS simulator, use localhost
|
||||
// return 'http://localhost:8081';
|
||||
// } else {
|
||||
// // For other platforms (desktop), use localhost
|
||||
// return 'http://localhost:8081';
|
||||
// }
|
||||
if (kIsWeb) {
|
||||
// For web, use localhost
|
||||
return 'http://localhost:8081';
|
||||
} else {
|
||||
// For Android emulator, use 10.0.2.2 (special IP for host machine)
|
||||
return 'http://10.0.2.2:8081';
|
||||
}
|
||||
// else if (Platform.isIOS) {
|
||||
// // For iOS simulator, use localhost
|
||||
// return 'http://localhost:8081';
|
||||
// } else {
|
||||
// // For other platforms (desktop), use localhost
|
||||
// return 'http://localhost:8081';
|
||||
// }
|
||||
// } else {
|
||||
// // Production URL - replace with your actual production server
|
||||
// return 'https://your-production-server.com';
|
||||
|
||||
@@ -1,6 +1,10 @@
|
||||
class AssetsManager {
|
||||
AssetsManager._();
|
||||
|
||||
//logo
|
||||
static const logoSmall = 'assets/icons/logo_small.svg';
|
||||
static const logoBig = 'assets/icons/logo_big.svg';
|
||||
|
||||
//bottom navigation
|
||||
static const homeActive = 'assets/icons/home_active.svg';
|
||||
static const home = 'assets/icons/home.svg';
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter/foundation.dart';
|
||||
|
||||
class NetworkConnectivity {
|
||||
static final NetworkConnectivity _instance = NetworkConnectivity._internal();
|
||||
factory NetworkConnectivity() => _instance;
|
||||
@@ -7,15 +9,19 @@ class NetworkConnectivity {
|
||||
|
||||
/// Check if device has internet connectivity
|
||||
Future<bool> hasInternetConnection() async {
|
||||
try {
|
||||
// Try to reach a reliable host to check internet connectivity
|
||||
final result = await InternetAddress.lookup('google.com');
|
||||
return result.isNotEmpty && result[0].rawAddress.isNotEmpty;
|
||||
} on SocketException catch (_) {
|
||||
return false;
|
||||
} on Exception catch (_) {
|
||||
// If connectivity check fails, assume no connection
|
||||
return false;
|
||||
if (kIsWeb) {
|
||||
return true;
|
||||
} else {
|
||||
try {
|
||||
// Try to reach a reliable host to check internet connectivity
|
||||
final result = await InternetAddress.lookup('google.com');
|
||||
return result.isNotEmpty && result[0].rawAddress.isNotEmpty;
|
||||
} on SocketException catch (_) {
|
||||
return false;
|
||||
} on Exception catch (_) {
|
||||
// If connectivity check fails, assume no connection
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ import 'dart:io';
|
||||
import 'package:dio/dio.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
import '../config/app_config.dart';
|
||||
import '../utils/logger.dart';
|
||||
import '../utils/result.dart';
|
||||
import 'app_exceptions.dart';
|
||||
@@ -16,7 +17,7 @@ class NetworkManager {
|
||||
NetworkManager()
|
||||
: mainDio = Dio(
|
||||
BaseOptions(
|
||||
baseUrl: 'http://10.0.2.2:8081',
|
||||
baseUrl: AppConfig.apiBaseUrl,
|
||||
headers: {
|
||||
'Accept': 'application/json',
|
||||
'Content-Type': 'application/json',
|
||||
|
||||
@@ -38,7 +38,7 @@ class DesktopShellPage extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
SizedBox(width: 40),
|
||||
Image.asset(AssetsManager.logo, width: 59, height: 28),
|
||||
SvgPicture.asset(AssetsManager.logoSmall),
|
||||
Spacer(),
|
||||
_bottomNavigationItem(
|
||||
context: context,
|
||||
@@ -67,7 +67,7 @@ class DesktopShellPage extends StatelessWidget {
|
||||
activeIconPath: AssetsManager.profileActive,
|
||||
),
|
||||
Spacer(),
|
||||
SizedBox(width: 59),
|
||||
SizedBox(width: 68),
|
||||
],
|
||||
),
|
||||
);
|
||||
@@ -84,7 +84,7 @@ class DesktopShellPage extends StatelessWidget {
|
||||
return InkWell(
|
||||
onTap: onTap,
|
||||
child: SizedBox(
|
||||
width: 200.0,
|
||||
width: 100.0,
|
||||
height: 64,
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
|
||||
@@ -38,11 +38,7 @@ class TabletShellPage extends StatelessWidget {
|
||||
child: Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Image.asset(
|
||||
AssetsManager.logo,
|
||||
width: 59.0.w(),
|
||||
height: 28.0.h(),
|
||||
),
|
||||
SvgPicture.asset(AssetsManager.logoSmall),
|
||||
InkWell(
|
||||
onTap: () => _key.currentState!.openDrawer(),
|
||||
child: SvgPicture.asset(AssetsManager.menu),
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/flutter_svg.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/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/view_models/tender_detail_view_model.dart';
|
||||
@@ -10,15 +7,73 @@ 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';
|
||||
|
||||
class TenderDetailDesktopPage extends StatelessWidget {
|
||||
class TenderDetailDesktopPage extends StatefulWidget {
|
||||
final String tenderId;
|
||||
const TenderDetailDesktopPage({required this.tenderId, super.key});
|
||||
|
||||
@override
|
||||
State<TenderDetailDesktopPage> createState() =>
|
||||
_TenderDetailDesktopPageState();
|
||||
}
|
||||
|
||||
class _TenderDetailDesktopPageState extends State<TenderDetailDesktopPage> {
|
||||
late final TenderDetailViewModel viewModel;
|
||||
@override
|
||||
void initState() {
|
||||
viewModel = context.read<TenderDetailViewModel>();
|
||||
viewModel.addListener(_viewModelListener);
|
||||
super.initState();
|
||||
}
|
||||
|
||||
void _viewModelListener() {
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'approved' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(
|
||||
context,
|
||||
).showSnackBar(SnackBar(content: Text('tender approved successfully!')));
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'unapproved' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('tender approve removed sucessfully!')),
|
||||
);
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'rejected' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(
|
||||
context,
|
||||
).showSnackBar(SnackBar(content: Text('tender rejected sucessfully!')));
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'unrejected' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('tender reject removed sucessfully!')),
|
||||
);
|
||||
}
|
||||
// if (viewModel.errorMessage != null) {
|
||||
// ScaffoldMessenger.of(context).showSnackBar(
|
||||
// SnackBar(
|
||||
// backgroundColor: AppColors.errorColor,
|
||||
// content: Text(viewModel.errorMessage!),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
viewModel.removeListener(_viewModelListener);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: _buildAppBar(context),
|
||||
body: Consumer<TenderDetailViewModel>(
|
||||
builder: (context, tenderViewModel, child) {
|
||||
if (tenderViewModel.isLoading) {
|
||||
@@ -60,31 +115,4 @@ class TenderDetailDesktopPage extends StatelessWidget {
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
PreferredSizeWidget _buildAppBar(BuildContext context) {
|
||||
return PreferredSize(
|
||||
preferredSize: const Size.fromHeight(60),
|
||||
child: AppBar(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
elevation: 0,
|
||||
titleSpacing: 0,
|
||||
leading: IconButton(
|
||||
icon: SvgPicture.asset(
|
||||
AssetsManager.arrowLeft,
|
||||
height: 24.0.w(),
|
||||
width: 24.0.w(),
|
||||
),
|
||||
onPressed: () => Navigator.pop(context),
|
||||
),
|
||||
title: Text(
|
||||
AppStrings.tenderDetailTitle,
|
||||
style: TextStyle(
|
||||
color: AppColors.grey70,
|
||||
fontWeight: FontWeight.w600,
|
||||
fontSize: 20.0.sp(),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,10 +10,68 @@ 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';
|
||||
|
||||
class TenderDetailTabletPage extends StatelessWidget {
|
||||
class TenderDetailTabletPage extends StatefulWidget {
|
||||
final String tenderId;
|
||||
const TenderDetailTabletPage({required this.tenderId, super.key});
|
||||
|
||||
@override
|
||||
State<TenderDetailTabletPage> createState() => _TenderDetailTabletPageState();
|
||||
}
|
||||
|
||||
class _TenderDetailTabletPageState extends State<TenderDetailTabletPage> {
|
||||
late final TenderDetailViewModel viewModel;
|
||||
@override
|
||||
void initState() {
|
||||
viewModel = context.read<TenderDetailViewModel>();
|
||||
viewModel.addListener(_viewModelListener);
|
||||
super.initState();
|
||||
}
|
||||
|
||||
void _viewModelListener() {
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'approved' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(
|
||||
context,
|
||||
).showSnackBar(SnackBar(content: Text('tender approved successfully!')));
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'unapproved' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('tender approve removed sucessfully!')),
|
||||
);
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'rejected' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(
|
||||
context,
|
||||
).showSnackBar(SnackBar(content: Text('tender rejected sucessfully!')));
|
||||
}
|
||||
if (viewModel.status.isNotEmpty &&
|
||||
viewModel.status == 'unrejected' &&
|
||||
viewModel.approvalStatus == true) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(content: Text('tender reject removed sucessfully!')),
|
||||
);
|
||||
}
|
||||
// if (viewModel.errorMessage != null) {
|
||||
// ScaffoldMessenger.of(context).showSnackBar(
|
||||
// SnackBar(
|
||||
// backgroundColor: AppColors.errorColor,
|
||||
// content: Text(viewModel.errorMessage!),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
viewModel.removeListener(_viewModelListener);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
|
||||
@@ -24,23 +24,77 @@ class TenderDetailActions extends StatelessWidget {
|
||||
? Row(
|
||||
children: [
|
||||
Spacer(),
|
||||
BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderRejectButton,
|
||||
textColor: AppColors.red10,
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
borderWidth: 1,
|
||||
onPressed: () {},
|
||||
width: 120.0.w(),
|
||||
Consumer<TenderDetailViewModel>(
|
||||
builder: (context, viewModel, child) {
|
||||
return viewModel.isRejectApprovalLoading
|
||||
? BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderRejectButton,
|
||||
textColor: AppColors.red10,
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
borderWidth: 1,
|
||||
onPressed: () {},
|
||||
width: 120.0.w(),
|
||||
)
|
||||
: BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderRejectButton,
|
||||
textColor: AppColors.red10,
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
borderWidth: 1,
|
||||
onPressed: () {
|
||||
viewModel.rejectTenderApproval(
|
||||
tenderId: detail.id!,
|
||||
submissionMode: 'self-apply',
|
||||
);
|
||||
},
|
||||
width: 120.0.w(),
|
||||
);
|
||||
},
|
||||
),
|
||||
SizedBox(width: 5.0.w()),
|
||||
BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderSubmitButton,
|
||||
backgroundColor: AppColors.lightBlue,
|
||||
textColor: AppColors.mainBlue,
|
||||
onPressed: () {},
|
||||
width: 120.0.w(),
|
||||
Consumer<TenderDetailViewModel>(
|
||||
builder: (context, viewModel, child) {
|
||||
return viewModel.isSubmitApprovalLoading
|
||||
? BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderSubmitButton,
|
||||
backgroundColor: AppColors.lightBlue,
|
||||
textColor: AppColors.mainBlue,
|
||||
onPressed: () {},
|
||||
width: 120.0.w(),
|
||||
)
|
||||
: BaseButton(
|
||||
isEnabled: true,
|
||||
text: AppStrings.tenderSubmitButton,
|
||||
backgroundColor: AppColors.lightBlue,
|
||||
textColor: AppColors.mainBlue,
|
||||
onPressed: () {
|
||||
if (viewModel.status == 'approved') {
|
||||
viewModel.submitTenderApproval(
|
||||
tenderId: detail.id!,
|
||||
submissionMode: 'self-apply',
|
||||
);
|
||||
} else {
|
||||
showModalBottomSheet(
|
||||
isDismissible: true,
|
||||
context: context,
|
||||
builder: (context) {
|
||||
return SelectSubmissionBottomSheet(
|
||||
onConfirm: (value) {
|
||||
viewModel.submitTenderApproval(
|
||||
tenderId: detail.id!,
|
||||
submissionMode: value,
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
},
|
||||
width: 120.0.w(),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
)
|
||||
|
||||
@@ -6,7 +6,6 @@ import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/data/services/model/tender_approvals_state_response/tender_approvals_state_response.dart';
|
||||
import 'package:tm_app/view_models/home_view_model.dart';
|
||||
import 'package:tm_app/views/home/widgets/notification_card.dart';
|
||||
|
||||
import '../widgets.dart';
|
||||
|
||||
@@ -33,7 +32,7 @@ class DesktopHomePage extends StatelessWidget {
|
||||
crossAxisAlignment: CrossAxisAlignment.center,
|
||||
children: [
|
||||
SizedBox(height: 55),
|
||||
SizedBox(width: 780, child: NotificationCard()),
|
||||
// SizedBox(width: 780, child: NotificationCard()),
|
||||
SizedBox(height: 40.0),
|
||||
_progressBarsRow(homeViewModel.tenderApprovalsStateResponse!),
|
||||
SizedBox(height: 32.0.h()),
|
||||
@@ -70,7 +69,7 @@ class DesktopHomePage extends StatelessWidget {
|
||||
ProgressBarColumn(
|
||||
text: AppStrings.partnership,
|
||||
value: double.parse('$partnershipPercent'),
|
||||
amount: double.parse('$partnershipPercent').toString(),
|
||||
amount: double.parse('$partnershipPercent').toString(),
|
||||
circularProgressIndicatorWidth: 176,
|
||||
circularProgressIndicatorHeight: 176,
|
||||
),
|
||||
@@ -78,7 +77,8 @@ class DesktopHomePage extends StatelessWidget {
|
||||
ProgressBarColumn(
|
||||
text: AppStrings.selfApply,
|
||||
value: double.parse(selfApplyPercent.toString()),
|
||||
amount: double.parse(selfApplyPercent.toString()).toString(), circularProgressIndicatorWidth: 176,
|
||||
amount: double.parse(selfApplyPercent.toString()).toString(),
|
||||
circularProgressIndicatorWidth: 176,
|
||||
circularProgressIndicatorHeight: 176,
|
||||
),
|
||||
SizedBox(width: 106),
|
||||
@@ -104,18 +104,18 @@ class DesktopHomePage extends StatelessWidget {
|
||||
backgroundColor: AppColors.primary20,
|
||||
iconPath: 'assets/icons/arrows.svg',
|
||||
title: AppStrings.tenderSubmitted,
|
||||
amount: '0',
|
||||
// tenderApprovalsStateResponse
|
||||
// .data!
|
||||
// .approvalsBySubmission!
|
||||
// .selfApply
|
||||
// .toString(),
|
||||
amount: tenderApprovalsStateResponse.data!.approvedTenders.toString(),
|
||||
// tenderApprovalsStateResponse
|
||||
// .data!
|
||||
// .approvalsBySubmission!
|
||||
// .selfApply
|
||||
// .toString(),
|
||||
textColor: Color(0xFF0164FF),
|
||||
enableTap: true,
|
||||
width: 178,
|
||||
height: 148,
|
||||
onTap: () {
|
||||
// YourTendersRouteData().push(context);
|
||||
YourTendersRouteData().push(context);
|
||||
},
|
||||
),
|
||||
SizedBox(width: 10),
|
||||
@@ -123,7 +123,7 @@ class DesktopHomePage extends StatelessWidget {
|
||||
backgroundColor: AppColors.primary10,
|
||||
iconPath: 'assets/icons/thumb.svg',
|
||||
title: AppStrings.approvedTenders,
|
||||
amount: tenderApprovalsStateResponse.data!.approvedTenders.toString(),
|
||||
amount: '0',
|
||||
textColor: Color(0xFF24848E),
|
||||
enableTap: true,
|
||||
width: 178,
|
||||
|
||||
@@ -8,25 +8,13 @@ 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/home/widgets/notification_card.dart';
|
||||
import 'package:tm_app/views/shared/tender_app_bar.dart';
|
||||
|
||||
import '../widgets.dart';
|
||||
|
||||
class MobileHomePage extends StatefulWidget {
|
||||
class MobileHomePage extends StatelessWidget {
|
||||
const MobileHomePage({super.key});
|
||||
|
||||
@override
|
||||
State<MobileHomePage> createState() => _MobileHomePageState();
|
||||
}
|
||||
|
||||
class _MobileHomePageState extends State<MobileHomePage> {
|
||||
@override
|
||||
void initState() {
|
||||
// context.read<HomeViewModel>().init();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
@@ -49,8 +37,8 @@ class _MobileHomePageState extends State<MobileHomePage> {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
SizedBox(height: 18.0.h()),
|
||||
NotificationCard(),
|
||||
// SizedBox(height: 18.0.h()),
|
||||
// NotificationCard(),
|
||||
SizedBox(height: 32.0.h()),
|
||||
_progressBarsRow(homeViewModel.tenderApprovalsStateResponse!),
|
||||
SizedBox(height: 32.0.h()),
|
||||
@@ -128,7 +116,8 @@ class _MobileHomePageState extends State<MobileHomePage> {
|
||||
backgroundColor: AppColors.primary20,
|
||||
iconPath: AssetsManager.arrows,
|
||||
title: AppStrings.tenderSubmitted,
|
||||
amount: '0',
|
||||
amount:
|
||||
tenderApprovalsStateResponse.data!.approvedTenders.toString(),
|
||||
// tenderApprovalsStateResponse
|
||||
// .data!
|
||||
// .approvalsBySubmission!
|
||||
@@ -144,8 +133,8 @@ class _MobileHomePageState extends State<MobileHomePage> {
|
||||
backgroundColor: AppColors.primary10,
|
||||
iconPath: AssetsManager.thumb,
|
||||
title: AppStrings.approvedTenders,
|
||||
amount:
|
||||
tenderApprovalsStateResponse.data!.approvedTenders.toString(),
|
||||
amount: '0',
|
||||
|
||||
textColor: Color(0xFF24848E),
|
||||
enableTap: true,
|
||||
onTap: () {
|
||||
|
||||
@@ -7,7 +7,6 @@ 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/home/widgets/notification_card.dart';
|
||||
|
||||
import '../widgets.dart';
|
||||
|
||||
@@ -40,7 +39,7 @@ class TabletHomePage extends StatelessWidget {
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
NotificationCard(),
|
||||
// NotificationCard(),
|
||||
SizedBox(height: 40.0.h()),
|
||||
_progressBarsRow(homeViewModel.tenderApprovalsStateResponse!),
|
||||
SizedBox(height: 32.0.h()),
|
||||
@@ -80,15 +79,16 @@ class TabletHomePage extends StatelessWidget {
|
||||
ProgressBarColumn(
|
||||
text: AppStrings.partnership,
|
||||
value: double.parse('$partnershipPercent'),
|
||||
amount: double.parse('$partnershipPercent').toString(),
|
||||
amount: double.parse('$partnershipPercent').toString(),
|
||||
circularProgressIndicatorWidth: 176.0,
|
||||
circularProgressIndicatorHeight: 176.0,
|
||||
strokeWidth: 8.0,
|
||||
),
|
||||
Spacer(),
|
||||
ProgressBarColumn(
|
||||
text: AppStrings.selfApply,
|
||||
value: double.parse(selfApplyPercent.toString()),
|
||||
amount: double.parse(selfApplyPercent.toString()).toString(),
|
||||
amount: double.parse(selfApplyPercent.toString()).toString(),
|
||||
circularProgressIndicatorWidth: 176.0,
|
||||
circularProgressIndicatorHeight: 176.0,
|
||||
strokeWidth: 8.0,
|
||||
@@ -119,12 +119,13 @@ class TabletHomePage extends StatelessWidget {
|
||||
backgroundColor: AppColors.primary20,
|
||||
iconPath: 'assets/icons/arrows.svg',
|
||||
title: AppStrings.tenderSubmitted,
|
||||
amount: '0',
|
||||
// tenderApprovalsStateResponse
|
||||
// .data!
|
||||
// .approvalsBySubmission!
|
||||
// .selfApply
|
||||
// .toString(),
|
||||
amount:
|
||||
tenderApprovalsStateResponse.data!.approvedTenders.toString(),
|
||||
// tenderApprovalsStateResponse
|
||||
// .data!
|
||||
// .approvalsBySubmission!
|
||||
// .selfApply
|
||||
// .toString(),
|
||||
textColor: Color(0xFF0164FF),
|
||||
enableTap: true,
|
||||
width: double.infinity,
|
||||
@@ -140,8 +141,7 @@ class TabletHomePage extends StatelessWidget {
|
||||
backgroundColor: AppColors.primary10,
|
||||
iconPath: 'assets/icons/thumb.svg',
|
||||
title: AppStrings.approvedTenders,
|
||||
amount:
|
||||
tenderApprovalsStateResponse.data!.approvedTenders.toString(),
|
||||
amount: '0',
|
||||
|
||||
textColor: Color(0xFF24848E),
|
||||
enableTap: true,
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/routes/app_routes.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
@@ -58,8 +59,13 @@ class _LoginDesktopPageState extends State<LoginDesktopPage> {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
LoginLogo(width: 190.0.w(), height: 88.0.h()),
|
||||
SizedBox(height: 32.0.h()),
|
||||
SvgPicture.asset(
|
||||
AssetsManager.logoBig,
|
||||
width: 320,
|
||||
height: 50,
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
SizedBox(height: 72.0.h()),
|
||||
const LoginTitle(),
|
||||
SizedBox(height: 32.0.h()),
|
||||
LoginTextField(
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/routes/app_routes.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
@@ -54,7 +55,15 @@ class _LoginMobilePageState extends State<LoginMobilePage> {
|
||||
return Column(
|
||||
mainAxisSize: MainAxisSize.min,
|
||||
children: [
|
||||
LoginLogo(width: 190.0.w(), height: 88.0.h()),
|
||||
// LoginLogo(width: 190.0.w(), height: 88.0.h()),
|
||||
Padding(
|
||||
padding: EdgeInsets.symmetric(horizontal: 22.0.w()),
|
||||
child: SvgPicture.asset(
|
||||
AssetsManager.logoBig,
|
||||
width: double.infinity,
|
||||
height: 50.0.h(),
|
||||
),
|
||||
),
|
||||
SizedBox(height: 32.0.h()),
|
||||
const LoginTitle(),
|
||||
SizedBox(height: 32.0.h()),
|
||||
|
||||
@@ -21,7 +21,7 @@ class LoginTitle extends StatelessWidget {
|
||||
style: TextStyle(
|
||||
fontSize: 14.0.sp(),
|
||||
fontWeight: FontWeight.w400,
|
||||
color: AppColors.grey60,
|
||||
color: AppColors.grey60,
|
||||
),
|
||||
textAlign: TextAlign.center,
|
||||
),
|
||||
|
||||
@@ -1,8 +1,11 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
import 'package:tm_app/core/routes/app_routes.dart';
|
||||
import 'package:tm_app/view_models/profile_view_model.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/theme/colors.dart';
|
||||
import '../../../core/utils/size_config.dart';
|
||||
import '../widgets/theme_toggle.dart';
|
||||
@@ -63,40 +66,94 @@ class _DesktopProfilePageState extends State<DesktopProfilePage> {
|
||||
return Center(
|
||||
child: SizedBox(
|
||||
width: 740,
|
||||
height: 507,
|
||||
height: 662,
|
||||
child: Column(
|
||||
children: [
|
||||
SizedBox(height: 36.0.h()),
|
||||
TitleDescription(
|
||||
title: 'Company Name',
|
||||
description: 'Telecom Solutions GmbH',
|
||||
description: viewModel.companyProfileData!.name!,
|
||||
),
|
||||
TitleDescription(
|
||||
title: 'National ID',
|
||||
description: '12345678901',
|
||||
description: viewModel.companyProfileData!.id!,
|
||||
),
|
||||
TitleDescription(
|
||||
title: 'Registration No.',
|
||||
description: 'DE-55667788',
|
||||
description:
|
||||
viewModel.companyProfileData!.registrationNumber!,
|
||||
),
|
||||
TitleDescription(title: 'Business Type', description: '-'),
|
||||
TitleDescription(
|
||||
title: 'Business Type',
|
||||
description: 'Telecommunications',
|
||||
title: 'Founded',
|
||||
description:
|
||||
viewModel.companyProfileData!.foundedYear!.toString(),
|
||||
),
|
||||
TitleDescription(title: 'Founded', description: '2010'),
|
||||
SizedBox(height: 24.0.h()),
|
||||
// Theme Toggle
|
||||
Container(
|
||||
padding: EdgeInsets.symmetric(
|
||||
horizontal: 16.0.w(),
|
||||
vertical: 12.0.h(),
|
||||
Align(
|
||||
alignment: AlignmentDirectional.centerStart,
|
||||
child: Text(
|
||||
AppStrings.settings,
|
||||
style: TextStyle(
|
||||
fontSize: 20.0.sp(),
|
||||
fontWeight: FontWeight.w600,
|
||||
color: AppColors.grey70,
|
||||
),
|
||||
),
|
||||
decoration: BoxDecoration(
|
||||
color: AppColors.surfaceColor,
|
||||
borderRadius: BorderRadius.circular(8),
|
||||
border: Border.all(color: AppColors.borderColor),
|
||||
),
|
||||
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,
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
child: const ThemeToggle(),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
@@ -13,12 +13,7 @@ PreferredSizeWidget tenderMobileAppBar({required String title}) {
|
||||
titleSpacing: 0,
|
||||
automaticallyImplyLeading: false,
|
||||
actions: [
|
||||
Image.asset(
|
||||
AssetsManager.tenderLogo,
|
||||
width: 59.0.w(),
|
||||
height: 28.0.h(),
|
||||
fit: BoxFit.cover,
|
||||
),
|
||||
SvgPicture.asset(AssetsManager.logoSmall),
|
||||
SizedBox(width: 24.0.w()),
|
||||
],
|
||||
title: Padding(
|
||||
|
||||
@@ -5,9 +5,47 @@ import 'package:tm_app/core/utils/size_config.dart';
|
||||
import 'package:tm_app/view_models/tenders_view_model.dart';
|
||||
import 'package:tm_app/views/tenders/widgets/main_tenders_slider.dart';
|
||||
|
||||
class DesktopTendersPage extends StatelessWidget {
|
||||
class DesktopTendersPage extends StatefulWidget {
|
||||
const DesktopTendersPage({super.key});
|
||||
|
||||
@override
|
||||
State<DesktopTendersPage> createState() => _DesktopTendersPageState();
|
||||
}
|
||||
|
||||
class _DesktopTendersPageState extends State<DesktopTendersPage> {
|
||||
late final TendersViewModel viewModel;
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
viewModel = context.read<TendersViewModel>();
|
||||
viewModel.addListener(_viewModelListener);
|
||||
}
|
||||
|
||||
void _viewModelListener() {
|
||||
if (viewModel.feedbackErrorMessage != null) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
backgroundColor: AppColors.error,
|
||||
content: Text(viewModel.feedbackErrorMessage!),
|
||||
),
|
||||
);
|
||||
}
|
||||
if (viewModel.tenderApprovalErrorMessage != null) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
backgroundColor: AppColors.error,
|
||||
content: Text(viewModel.tenderApprovalErrorMessage!),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
viewModel.removeListener(_viewModelListener);
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return SafeArea(
|
||||
|
||||
@@ -33,13 +33,6 @@ class _MobileTendersPageState extends State<MobileTendersPage> {
|
||||
),
|
||||
);
|
||||
}
|
||||
// if (viewModel.errorMessage != null) {
|
||||
// ScaffoldMessenger.of(context).showSnackBar(
|
||||
// SnackBar(
|
||||
// content: Text(viewModel.errorMessage!),
|
||||
// ),
|
||||
// );
|
||||
// }
|
||||
if (viewModel.tenderApprovalErrorMessage != null) {
|
||||
ScaffoldMessenger.of(context).showSnackBar(
|
||||
SnackBar(
|
||||
|
||||
@@ -4,8 +4,8 @@ import 'package:tm_app/core/constants/strings.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/view_models/your_tenders_view_model.dart';
|
||||
import 'package:tm_app/views/shared/main_tab_bar.dart';
|
||||
import 'package:tm_app/views/shared/tender_app_bar.dart';
|
||||
import 'package:tm_app/views/your_tenders/widgets/approved_tenders.dart';
|
||||
import 'package:tm_app/views/your_tenders/widgets/tablet_desktop_appbar.dart';
|
||||
import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart';
|
||||
|
||||
class YourTendersDesktopPage extends StatefulWidget {
|
||||
@@ -40,12 +40,15 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
|
||||
return SafeArea(
|
||||
child: Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: tenderMobileAppBar(title: AppStrings.yourTenders),
|
||||
|
||||
body: Center(
|
||||
child: SizedBox(
|
||||
width: 740,
|
||||
child: Column(
|
||||
children: [
|
||||
SizedBox(height: 128.0),
|
||||
TabletDesktopAppbar(),
|
||||
SizedBox(height: 20.0),
|
||||
MainTabBar(
|
||||
controller: controller,
|
||||
titles: [
|
||||
@@ -71,13 +74,8 @@ class _YourTendersDesktopPageState extends State<YourTendersDesktopPage>
|
||||
return TabBarView(
|
||||
controller: controller,
|
||||
children: [
|
||||
ApprovedTenders(
|
||||
approvedTenders: viewModel.data!,
|
||||
),
|
||||
TendersSubmitted(
|
||||
tendersSubmitted:
|
||||
[],
|
||||
),
|
||||
ApprovedTenders(tendersSubmitted: []),
|
||||
TendersSubmitted(approvedTenders: viewModel.data!),
|
||||
],
|
||||
);
|
||||
},
|
||||
|
||||
@@ -64,12 +64,8 @@ class _YourTendersMobilePageState extends State<YourTendersMobilePage>
|
||||
return TabBarView(
|
||||
controller: controller,
|
||||
children: [
|
||||
ApprovedTenders(
|
||||
approvedTenders: viewModel.data!,
|
||||
),
|
||||
TendersSubmitted(
|
||||
tendersSubmitted: [],
|
||||
),
|
||||
ApprovedTenders(tendersSubmitted: []),
|
||||
TendersSubmitted(approvedTenders: viewModel.data!),
|
||||
],
|
||||
);
|
||||
},
|
||||
|
||||
@@ -2,10 +2,11 @@ import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.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';
|
||||
import 'package:tm_app/view_models/your_tenders_view_model.dart';
|
||||
import 'package:tm_app/views/shared/main_tab_bar.dart';
|
||||
import 'package:tm_app/views/shared/tender_app_bar.dart';
|
||||
import 'package:tm_app/views/your_tenders/widgets/approved_tenders.dart';
|
||||
import 'package:tm_app/views/your_tenders/widgets/tablet_desktop_appbar.dart';
|
||||
import 'package:tm_app/views/your_tenders/widgets/tenders_submitted.dart';
|
||||
|
||||
class YourTendersTabletPage extends StatefulWidget {
|
||||
@@ -40,12 +41,18 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
|
||||
return SafeArea(
|
||||
child: Scaffold(
|
||||
backgroundColor: AppColors.backgroundColor,
|
||||
appBar: tenderMobileAppBar(title: AppStrings.yourTenders),
|
||||
|
||||
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: [
|
||||
@@ -71,12 +78,8 @@ class _YourTendersTabletPageState extends State<YourTendersTabletPage>
|
||||
return TabBarView(
|
||||
controller: controller,
|
||||
children: [
|
||||
ApprovedTenders(
|
||||
approvedTenders: viewModel.data!,
|
||||
),
|
||||
TendersSubmitted(
|
||||
tendersSubmitted: [],
|
||||
),
|
||||
ApprovedTenders(tendersSubmitted: []),
|
||||
TendersSubmitted(approvedTenders: viewModel.data!),
|
||||
],
|
||||
);
|
||||
},
|
||||
|
||||
@@ -1,64 +1,63 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/data/services/model/tender_approvals_response/tender_approvals_response.dart';
|
||||
import 'package:tm_app/views/your_tenders/widgets/tender_card.dart';
|
||||
|
||||
class ApprovedTenders extends StatelessWidget {
|
||||
const ApprovedTenders({required this.approvedTenders, super.key});
|
||||
import '../../../data/services/model/your_tender_model/your_tender_model.dart';
|
||||
|
||||
final TenderApprovalsResponse approvedTenders;
|
||||
class ApprovedTenders extends StatelessWidget {
|
||||
const ApprovedTenders({required this.tendersSubmitted, super.key});
|
||||
|
||||
final List<YourTenderModel> tendersSubmitted;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return approvedTenders.data == null
|
||||
? const Center(child: Text('No approved projects yet.'))
|
||||
: ListView.builder(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
itemCount: approvedTenders.data!.length,
|
||||
itemBuilder: (context, index) {
|
||||
final tender = approvedTenders.data![index];
|
||||
return TenderCard(
|
||||
date: tender.createdAt!.toString(),
|
||||
title: tender.tender!.title!,
|
||||
description: tender.tender!.description!,
|
||||
location: tender.tender!.countryCode!,
|
||||
countryFlag: AssetsManager.seFlag,
|
||||
status: tender.status,
|
||||
countryCode: tender.tender!.countryCode!,
|
||||
projectStatus: tender.tender!.status!,
|
||||
backgroundColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green0
|
||||
: tender.status == 'approved'
|
||||
? AppColors.grey0
|
||||
: AppColors.red0.withValues(alpha: 0.2),
|
||||
borderColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green10
|
||||
: tender.status == 'approved'
|
||||
? AppColors.grey30
|
||||
: AppColors.red0,
|
||||
statusIcon:
|
||||
tender.status == 'Won'
|
||||
? AssetsManager.tickCircle
|
||||
: tender.status == 'approved'
|
||||
? null
|
||||
: AssetsManager.closeCircle,
|
||||
statusCardColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green20
|
||||
: tender.status == 'approved'
|
||||
? AppColors.green20
|
||||
: AppColors.red0,
|
||||
statusTextColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green30
|
||||
: tender.status == 'approved'
|
||||
? AppColors.green30
|
||||
: AppColors.red10,
|
||||
);
|
||||
},
|
||||
return ListView.builder(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
itemCount: tendersSubmitted.length,
|
||||
itemBuilder: (context, index) {
|
||||
final tender = tendersSubmitted[index];
|
||||
return TenderCard(
|
||||
date: tender.date,
|
||||
title: tender.title,
|
||||
description: tender.description,
|
||||
location: tender.location,
|
||||
countryFlag: tender.countryFlag,
|
||||
status: tender.status,
|
||||
countryCode: '',
|
||||
projectStatus: tender.projectStatus,
|
||||
backgroundColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green0
|
||||
: tender.status == 'Completed'
|
||||
? AppColors.grey0
|
||||
: AppColors.red0,
|
||||
borderColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green10
|
||||
: tender.status == 'Completed'
|
||||
? AppColors.grey30
|
||||
: AppColors.red10,
|
||||
statusIcon:
|
||||
tender.status == 'Won'
|
||||
? AssetsManager.tickCircle
|
||||
: tender.status == 'Completed'
|
||||
? null
|
||||
: AssetsManager.closeCircle,
|
||||
statusCardColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green20
|
||||
: tender.status == 'Completed'
|
||||
? AppColors.blue0
|
||||
: AppColors.red10,
|
||||
statusTextColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green30
|
||||
: tender.status == 'Completed'
|
||||
? AppColors.cyanTeal
|
||||
: AppColors.red20,
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_svg/svg.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:tm_app/core/utils/size_config.dart';
|
||||
|
||||
import '../../../core/constants/assets.dart';
|
||||
import '../../../core/constants/strings.dart';
|
||||
import '../../../core/theme/colors.dart';
|
||||
|
||||
class TabletDesktopAppbar extends StatelessWidget {
|
||||
const TabletDesktopAppbar({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Row(
|
||||
children: [
|
||||
InkWell(
|
||||
onTap: () => context.pop(),
|
||||
child: SvgPicture.asset(AssetsManager.arrowLeft),
|
||||
),
|
||||
SizedBox(width: 8.0.w()),
|
||||
Text(
|
||||
AppStrings.yourTendersTitle,
|
||||
style: TextStyle(
|
||||
fontSize: 20,
|
||||
fontWeight: FontWeight.w600,
|
||||
color: AppColors.grey70,
|
||||
),
|
||||
),
|
||||
],
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,62 +1,65 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:tm_app/core/constants/assets.dart';
|
||||
import 'package:tm_app/core/theme/colors.dart';
|
||||
import 'package:tm_app/data/services/model/your_tender_model/your_tender_model.dart';
|
||||
import 'package:tm_app/views/your_tenders/widgets/tender_card.dart';
|
||||
|
||||
class TendersSubmitted extends StatelessWidget {
|
||||
const TendersSubmitted({required this.tendersSubmitted, super.key});
|
||||
import '../../../data/services/model/tender_approvals_response/tender_approvals_response.dart';
|
||||
|
||||
final List<YourTenderModel> tendersSubmitted;
|
||||
class TendersSubmitted extends StatelessWidget {
|
||||
const TendersSubmitted({required this.approvedTenders, super.key});
|
||||
|
||||
final TenderApprovalsResponse approvedTenders;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return ListView.builder(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
itemCount: tendersSubmitted.length,
|
||||
itemBuilder: (context, index) {
|
||||
final tender = tendersSubmitted[index];
|
||||
return TenderCard(
|
||||
date: tender.date,
|
||||
title: tender.title,
|
||||
description: tender.description,
|
||||
location: tender.location,
|
||||
countryFlag: tender.countryFlag,
|
||||
status: tender.status,
|
||||
countryCode: '',
|
||||
projectStatus: tender.projectStatus,
|
||||
backgroundColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green0
|
||||
: tender.status == 'Completed'
|
||||
? AppColors.grey0
|
||||
: AppColors.red0,
|
||||
borderColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green10
|
||||
: tender.status == 'Completed'
|
||||
? AppColors.grey30
|
||||
: AppColors.red10,
|
||||
statusIcon:
|
||||
tender.status == 'Won'
|
||||
? AssetsManager.tickCircle
|
||||
: tender.status == 'Completed'
|
||||
? null
|
||||
: AssetsManager.closeCircle,
|
||||
statusCardColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green20
|
||||
: tender.status == 'Completed'
|
||||
? AppColors.blue0
|
||||
: AppColors.red10,
|
||||
statusTextColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green30
|
||||
: tender.status == 'Completed'
|
||||
? AppColors.cyanTeal
|
||||
: AppColors.red20,
|
||||
return approvedTenders.data == null
|
||||
? const Center(child: Text('No approved projects yet.'))
|
||||
: ListView.builder(
|
||||
padding: const EdgeInsets.only(top: 20),
|
||||
itemCount: approvedTenders.data!.length,
|
||||
itemBuilder: (context, index) {
|
||||
final tender = approvedTenders.data![index];
|
||||
return TenderCard(
|
||||
date: tender.createdAt!.toString(),
|
||||
title: tender.tender!.title!,
|
||||
description: tender.tender!.description!,
|
||||
location: tender.tender!.countryCode!,
|
||||
countryFlag: AssetsManager.seFlag,
|
||||
status: tender.status,
|
||||
countryCode: tender.tender!.countryCode!,
|
||||
projectStatus: tender.tender!.status!,
|
||||
backgroundColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green0
|
||||
: tender.status == 'approved'
|
||||
? AppColors.grey0
|
||||
: AppColors.red0.withValues(alpha: 0.2),
|
||||
borderColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green10
|
||||
: tender.status == 'approved'
|
||||
? AppColors.grey30
|
||||
: AppColors.red0,
|
||||
statusIcon:
|
||||
tender.status == 'Won'
|
||||
? AssetsManager.tickCircle
|
||||
: tender.status == 'approved'
|
||||
? null
|
||||
: AssetsManager.closeCircle,
|
||||
statusCardColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green20
|
||||
: tender.status == 'approved'
|
||||
? AppColors.green20
|
||||
: AppColors.red0,
|
||||
statusTextColor:
|
||||
tender.status == 'Won'
|
||||
? AppColors.green30
|
||||
: tender.status == 'approved'
|
||||
? AppColors.green30
|
||||
: AppColors.red10,
|
||||
);
|
||||
},
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user