merge branches

This commit is contained in:
amirrezaghabeli
2025-08-18 08:28:18 +03:30
parent 0a54b613cd
commit 36f66bfca5
48 changed files with 2348 additions and 613 deletions
+24 -5
View File
@@ -1,20 +1,39 @@
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:tm_app/core/utils/size_config.dart';
import 'package:tm_app/view_models/tender_detail_view_model.dart';
import 'package:tm_app/views/detail/pages/detail_desktop_page.dart';
import 'package:tm_app/views/detail/pages/detail_mobile_page.dart';
import 'package:tm_app/views/detail/pages/detail_tablet_page.dart';
import 'package:tm_app/views/shared/responsive_builder.dart';
class TenderDetailScreen extends StatelessWidget {
const TenderDetailScreen({super.key});
class TenderDetailScreen extends StatefulWidget {
const TenderDetailScreen({required this.tenderId, super.key});
final String tenderId;
@override
State<TenderDetailScreen> createState() => _TenderDetailScreenState();
}
class _TenderDetailScreenState extends State<TenderDetailScreen> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
context.read<TenderDetailViewModel>().getTenderDetail(
id: widget.tenderId,
);
});
}
@override
Widget build(BuildContext context) {
SizeConfig.init(context);
return ResponsiveBuilder(
mobile: TenderDetailMobilePage(tenderId: 'JNDFKMDV-100JF'),
tablet: TenderDetailTabletPage(tenderId: 'JNDFKMDV-100JF'),
desktop: TenderDetailDesktopPage(tenderId: 'JNDFKMDV-100JF'),
mobile: TenderDetailMobilePage(tenderId: widget.tenderId),
tablet: TenderDetailTabletPage(tenderId: widget.tenderId),
desktop: TenderDetailDesktopPage(tenderId: widget.tenderId),
);
}
}
@@ -2,10 +2,10 @@ import 'package:flutter/material.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/data/services/model/tender_detail_response/tender_detail_response_model.dart';
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
class TenderDetailCard extends StatelessWidget {
final TenderDetailResponseModel detail;
final TenderData detail;
const TenderDetailCard({required this.detail, super.key});
@@ -1,7 +1,8 @@
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
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_detail_response/tender_detail_response_model.dart';
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import 'package:tm_app/views/detail/widgets/status_tag.dart';
import 'package:tm_app/views/detail/widgets/tender_detail_info_section.dart';
import 'package:tm_app/views/detail/widgets/tender_document_section.dart';
@@ -9,9 +10,13 @@ import 'package:tm_app/views/detail/widgets/tender_location_section.dart';
class TenderDetailHeader extends StatelessWidget {
final bool isScreenBig;
final TenderDetailResponseModel detail;
final TenderData detail;
const TenderDetailHeader({required this.isScreenBig, required this.detail, super.key});
const TenderDetailHeader({
required this.isScreenBig,
required this.detail,
super.key,
});
@override
Widget build(BuildContext context) {
@@ -29,7 +34,7 @@ class TenderDetailHeader extends StatelessWidget {
SizedBox(height: 12.0.h()),
_buildTitle(),
SizedBox(height: 10.0.h()),
Divider(color: AppColors.grey20,),
Divider(color: AppColors.grey20),
SizedBox(height: 5.0.h()),
TenderDetailInfoSection(isScreenBig: isScreenBig, detail: detail),
TenderLocationSection(detail: detail),
@@ -44,7 +49,7 @@ class TenderDetailHeader extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
detail.date ?? '',
unixToDate(detail.publicationDate),
style: TextStyle(
color: AppColors.grey60,
fontWeight: FontWeight.w400,
@@ -68,3 +73,14 @@ class TenderDetailHeader 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);
}
@@ -1,43 +1,44 @@
import 'package:flutter/material.dart';
import 'package:tm_app/core/constants/strings.dart';
import 'package:tm_app/data/services/model/tender_detail_response/tender_detail_response_model.dart';
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import 'package:tm_app/views/detail/widgets/deadline_item.dart';
import 'package:tm_app/views/detail/widgets/info_item.dart';
class TenderDetailInfoSection extends StatelessWidget {
final bool isScreenBig;
final TenderDetailResponseModel detail;
final TenderData detail;
const TenderDetailInfoSection({required this.isScreenBig, required this.detail, super.key});
const TenderDetailInfoSection({
required this.isScreenBig,
required this.detail,
super.key,
});
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
InfoItem(
title: AppStrings.tenderIdLabel,
value: detail.id ?? '',
),
InfoItem(title: AppStrings.tenderIdLabel, value: detail.id ?? ''),
DeadlineItem(
title: AppStrings.tenderDeadlineLabel,
approvalText: AppStrings.tenderApprovalText,
approvalDate: detail.approvalDate ?? '',
approvalDate: '',
submissionText: AppStrings.tenderSubmissionText,
submissionDate: detail.submissionDate ?? '',
submissionDate: '',
isScreenBig: isScreenBig,
),
InfoItem(
title: AppStrings.tenderClientLabel,
value: detail.client ?? '',
value: detail.buyerOrganization!.name ?? '',
),
InfoItem(
title: AppStrings.tenderDeliveryLocationsLabel,
value: detail.deliveryLocation ?? '',
value: detail.countryCode ?? '',
),
InfoItem(
title: AppStrings.tenderReferenceNumberLabel,
value: detail.referenceNumber ?? '',
value: detail.noticePublicationId ?? '',
),
],
);
@@ -3,27 +3,24 @@ import 'package:flutter_svg/flutter_svg.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/data/services/model/tender_detail_response/tender_detail_response_model.dart';
class TenderDocumentSection extends StatelessWidget {
final TenderDetailResponseModel detail;
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
const TenderDocumentSection({super.key, required this.detail});
class TenderDocumentSection extends StatelessWidget {
final TenderData detail;
const TenderDocumentSection({required this.detail, super.key});
@override
Widget build(BuildContext context) {
return InkWell(
onTap: () {
if (detail.documentUrl != null) {
//launchUrl(Uri.parse(detail.documentUrl!));
}
},
onTap: () {},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SvgPicture.asset(AssetsManager.export),
SizedBox(height: 6.0.h()),
Text(
detail.documentName ?? '',
'',
style: TextStyle(
fontWeight: FontWeight.w400,
fontSize: 16.0.sp(),
@@ -4,10 +4,11 @@ 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/data/services/model/tender_detail_response/tender_detail_response_model.dart';
import '../../../data/services/model/tender_data/tender_data.dart';
class TenderLocationSection extends StatelessWidget {
final TenderDetailResponseModel detail;
final TenderData detail;
const TenderLocationSection({required this.detail, super.key});
@@ -21,7 +22,7 @@ class TenderLocationSection extends StatelessWidget {
SizedBox(
height: 45.0.h(),
child: Text(
detail.locationTitle ?? '',
'',
style: TextStyle(
color: AppColors.grey80,
fontWeight: FontWeight.w600,
@@ -38,7 +39,7 @@ class TenderLocationSection extends StatelessWidget {
),
SizedBox(width: 4.0.w()),
Text(
detail.country ?? '',
detail.countryCode ?? '',
style: TextStyle(
color: AppColors.grey70,
fontSize: 14.0.sp(),
@@ -47,7 +48,7 @@ class TenderLocationSection extends StatelessWidget {
),
SizedBox(width: 4.0.w()),
Image.asset(
detail.flagAsset ?? AssetsManager.seFlag,
AssetsManager.seFlag,
height: 20.0.h(),
width: 20.0.w(),
),
@@ -60,7 +61,7 @@ class TenderLocationSection extends StatelessWidget {
),
SizedBox(height: 8.0.h()),
Text(
detail.locationDescription ?? '',
detail.description ?? '',
style: TextStyle(fontWeight: FontWeight.w400, fontSize: 14.0.sp()),
),
SizedBox(height: 16.0.h()),
+1 -1
View File
@@ -100,7 +100,7 @@ class DesktopHomePage extends StatelessWidget {
width: 178,
height: 148,
onTap: () {
YourTendersRouteData().push(context);
// YourTendersRouteData().push(context);
},
),
SizedBox(width: 10),
+64
View File
@@ -27,6 +27,7 @@ class TendersListItem extends StatelessWidget {
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
<<<<<<< HEAD
SizedBox(
width: double.infinity,
child: Text(
@@ -53,6 +54,30 @@ class TendersListItem extends StatelessWidget {
children: [
Text(
'${AppStrings.tenderDeadline} :',
=======
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
// tender.createdTime ?? '',
'',
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color: AppColors.grey60,
),
),
Container(
width: 91.0.w(),
height: 24.0.h(),
decoration: BoxDecoration(
color: AppColors.green20,
borderRadius: BorderRadius.circular(8),
),
alignment: Alignment.center,
child: Text(
'',
>>>>>>> tender_tender_detail
style: TextStyle(
fontSize: 15.0.sp(),
fontWeight: FontWeight.w500,
@@ -72,7 +97,11 @@ class TendersListItem extends StatelessWidget {
),
SizedBox(height: 12.0.h()),
Text(
<<<<<<< HEAD
tender.title!,
=======
'',
>>>>>>> tender_tender_detail
style: TextStyle(
overflow: TextOverflow.ellipsis,
fontSize: 16.0.sp(),
@@ -81,6 +110,7 @@ class TendersListItem extends StatelessWidget {
),
),
SizedBox(height: 8.0.h()),
<<<<<<< HEAD
SizedBox(
width: double.infinity,
child: Text(
@@ -93,6 +123,16 @@ class TendersListItem extends StatelessWidget {
fontWeight: FontWeight.w400,
color: AppColors.grey70,
),
=======
Text(
'',
maxLines: 3,
overflow: TextOverflow.ellipsis,
style: TextStyle(
fontSize: 14.0.sp(),
fontWeight: FontWeight.w400,
color: AppColors.grey70,
>>>>>>> tender_tender_detail
),
),
SizedBox(height: 18.0.h()),
@@ -104,7 +144,11 @@ class TendersListItem extends StatelessWidget {
SvgPicture.asset(AssetsManager.location),
SizedBox(width: 1.0.w()),
Text(
<<<<<<< HEAD
tender.countryCode!,
=======
'',
>>>>>>> tender_tender_detail
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
@@ -118,6 +162,7 @@ class TendersListItem extends StatelessWidget {
child: Image.asset(AssetsManager.seFlag, fit: BoxFit.cover),
),
Spacer(),
<<<<<<< HEAD
// Container(
// width: 96.0.w(),
// height: 24.0.h(),
@@ -135,6 +180,25 @@ class TendersListItem extends StatelessWidget {
// ),
// ),
// ),
=======
Container(
width: 96.0.w(),
height: 24.0.h(),
decoration: BoxDecoration(
color: AppColors.grey30,
borderRadius: BorderRadius.circular(88),
),
alignment: Alignment.center,
child: Text(
'',
style: TextStyle(
fontSize: 12.0.sp(),
fontWeight: FontWeight.w500,
color: AppColors.grey60,
),
),
),
>>>>>>> tender_tender_detail
],
),
],
+1 -1
View File
@@ -33,7 +33,7 @@ class DesktopTendersPage extends StatelessWidget {
child: Padding(
padding: EdgeInsets.symmetric(vertical: 24.0.h()),
child: MainTendersSlider(
tenders: viewModel.tendersResponse?.tenders ?? [],
tenders: viewModel.tendersResponse?.data?.tenders ?? [],
isDesktop: true,
),
),
+1 -1
View File
@@ -30,7 +30,7 @@ class MobileTendersPage extends StatelessWidget {
return Padding(
padding: EdgeInsets.symmetric(vertical: 24.0.h()),
child: MainTendersSlider(
tenders: viewModel.tendersResponse?.tenders ?? [],
tenders: viewModel.tendersResponse?.data?.tenders ?? [],
),
);
},
+1 -1
View File
@@ -28,7 +28,7 @@ class TabletTendersPage extends StatelessWidget {
return Padding(
padding: EdgeInsets.only(right: 24.0.w(), top: 128.0.h()),
child: MainTendersSlider(
tenders: viewModel.tendersResponse?.tenders ?? [],
tenders: viewModel.tendersResponse?.data?.tenders ?? [],
),
);
},
@@ -1,7 +1,7 @@
import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:tm_app/core/theme/colors.dart';
import 'package:tm_app/data/services/model/tender/tender_model.dart';
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import '../../../core/constants/assets.dart';
import '../../../core/utils/size_config.dart';
@@ -14,7 +14,7 @@ class MainTendersSlider extends StatefulWidget {
this.isDesktop = false,
});
final bool isDesktop;
final List<TenderModel> tenders;
final List<TenderData> tenders;
@override
State<MainTendersSlider> createState() => _MainTendersSliderState();
@@ -2,7 +2,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_svg/svg.dart';
import 'package:provider/provider.dart';
import 'package:tm_app/core/constants/strings.dart';
import 'package:tm_app/data/services/model/tender/tender_model.dart';
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import 'package:tm_app/view_models/tenders_view_model.dart';
import '../../../core/constants/assets.dart';
@@ -10,7 +10,7 @@ import '../../../core/theme/colors.dart';
import '../../../core/utils/size_config.dart';
class TenderActionButtonsRow extends StatelessWidget {
final TenderModel tender;
final TenderData tender;
final bool isDesktop;
const TenderActionButtonsRow({
@@ -48,7 +48,7 @@ class TenderActionButtonsRow extends StatelessWidget {
child: InkWell(
splashColor: Colors.transparent,
onTap: () {
viewModel.toggleReject(tender);
// viewModel.toggleReject(tender);
},
child: Column(
children: [
@@ -59,9 +59,10 @@ class TenderActionButtonsRow extends StatelessWidget {
shape: BoxShape.circle,
border: Border.all(
color:
tender.rejected ?? false
? AppColors.errorColor
: AppColors.grey60,
// tender.rejected ?? false
// ? AppColors.errorColor
// :
AppColors.grey60,
width: 1.5.w(),
),
),
@@ -69,9 +70,10 @@ class TenderActionButtonsRow extends StatelessWidget {
child: Icon(
Icons.close,
color:
tender.rejected ?? false
? AppColors.errorColor
: AppColors.grey60,
// tender.rejected ?? false
// ? AppColors.errorColor
// :
AppColors.grey60,
size: 16,
),
),
@@ -83,9 +85,10 @@ class TenderActionButtonsRow extends StatelessWidget {
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color:
tender.rejected ?? false
? AppColors.errorColor
: AppColors.grey60,
// tender.rejected ?? false
// ? AppColors.errorColor
// :
AppColors.grey60,
),
),
],
@@ -100,7 +103,7 @@ class TenderActionButtonsRow extends StatelessWidget {
child: InkWell(
splashColor: Colors.transparent,
onTap: () {
viewModel.toggleSubmit(tender);
// viewModel.toggleSubmit(tender);
},
child: Column(
children: [
@@ -111,9 +114,10 @@ class TenderActionButtonsRow extends StatelessWidget {
shape: BoxShape.circle,
border: Border.all(
color:
tender.submitted ?? false
? AppColors.successColor
: AppColors.grey60,
// tender.submitted ?? false
// ? AppColors.successColor
// :
AppColors.grey60,
width: 1.5.w(),
),
),
@@ -121,9 +125,10 @@ class TenderActionButtonsRow extends StatelessWidget {
child: SvgPicture.asset(
AssetsManager.tick,
colorFilter: ColorFilter.mode(
tender.submitted ?? false
? AppColors.successColor
: AppColors.grey60,
// tender.submitted ?? false
// ? AppColors.successColor
// :
AppColors.grey60,
BlendMode.srcATop,
),
),
@@ -136,9 +141,10 @@ class TenderActionButtonsRow extends StatelessWidget {
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color:
tender.submitted ?? false
? AppColors.successColor
: AppColors.grey60,
// tender.submitted ?? false
// ? AppColors.successColor
// :
AppColors.grey60,
),
),
],
@@ -153,7 +159,7 @@ class TenderActionButtonsRow extends StatelessWidget {
child: InkWell(
splashColor: Colors.transparent,
onTap: () {
viewModel.toggleDislike(tender);
// viewModel.toggleDislike(tender);
},
child: Column(
children: [
@@ -163,9 +169,10 @@ class TenderActionButtonsRow extends StatelessWidget {
fit: BoxFit.cover,
AssetsManager.dislike,
colorFilter: ColorFilter.mode(
tender.disliked ?? false
? AppColors.errorColor
: AppColors.grey50,
// tender.disliked ?? false
// ? AppColors.errorColor
// :
AppColors.grey50,
BlendMode.srcATop,
),
),
@@ -177,9 +184,10 @@ class TenderActionButtonsRow extends StatelessWidget {
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color:
tender.disliked ?? false
? AppColors.errorColor
: AppColors.grey50,
// tender.disliked ?? false
// ? AppColors.errorColor
// :
AppColors.grey50,
),
),
],
@@ -194,7 +202,7 @@ class TenderActionButtonsRow extends StatelessWidget {
child: InkWell(
splashColor: Colors.transparent,
onTap: () {
viewModel.toggleLike(tender);
// viewModel.toggleLike(tender);
},
child: Column(
children: [
@@ -204,9 +212,10 @@ class TenderActionButtonsRow extends StatelessWidget {
fit: BoxFit.cover,
AssetsManager.like,
colorFilter: ColorFilter.mode(
tender.liked ?? false
? AppColors.successColor
: AppColors.grey50,
// tender.liked ?? false
// ? AppColors.successColor
// :
AppColors.grey50,
BlendMode.srcATop,
),
),
@@ -218,9 +227,10 @@ class TenderActionButtonsRow extends StatelessWidget {
fontSize: 12.0.sp(),
fontWeight: FontWeight.w400,
color:
tender.liked ?? false
? AppColors.successColor
: AppColors.grey50,
// tender.liked ?? false
// ? AppColors.successColor
// :
AppColors.grey50,
),
),
],
+11 -10
View File
@@ -1,16 +1,17 @@
import 'package:flutter/material.dart';
import 'package:flutter/material.dart' hide DateUtils;
import 'package:flutter_svg/svg.dart';
import 'package:tm_app/core/constants/strings.dart';
import 'package:tm_app/core/routes/app_routes.dart';
import 'package:tm_app/data/services/model/tender/tender_model.dart';
import 'package:tm_app/data/services/model/tender_data/tender_data.dart';
import '../../../core/constants/assets.dart';
import '../../../core/theme/colors.dart';
import '../../../core/utils/date_utils.dart';
import '../../../core/utils/size_config.dart';
import 'tender_action_buttons_row.dart';
class TenderCard extends StatelessWidget {
final TenderModel tender;
final TenderData tender;
final bool isDesktop;
const TenderCard({required this.tender, super.key, this.isDesktop = false});
@@ -104,7 +105,7 @@ class TenderCard extends StatelessWidget {
Widget _dateText() {
return Text(
tender.createdTime ?? '',
DateUtils.unixToDate(tender.publicationDate ?? 0),
style: TextStyle(
color: AppColors.grey60,
fontSize: 12.0.sp(),
@@ -134,7 +135,7 @@ class TenderCard extends StatelessWidget {
),
),
Text(
tender.deadline ?? '',
DateUtils.unixToDate(tender.tenderDeadline ?? 0),
style: TextStyle(
color: AppColors.grey80,
fontSize: 14.0.sp(),
@@ -171,7 +172,7 @@ class TenderCard extends StatelessWidget {
Widget _idText() {
return Text(
tender.tenderId ?? '',
tender.id ?? '',
style: TextStyle(
color: AppColors.grey,
fontSize: 14.0.sp(),
@@ -193,7 +194,7 @@ class TenderCard extends StatelessWidget {
),
),
Text(
'${tender.profileMatch ?? 0}%',
'${45}%',
style: TextStyle(
color: AppColors.secondaryTextColor,
fontSize: 16.0.sp(),
@@ -214,7 +215,7 @@ class TenderCard extends StatelessWidget {
),
child: FractionallySizedBox(
alignment: Alignment.centerLeft,
widthFactor: (tender.profileMatch ?? 0) / 100,
widthFactor: (45) / 100,
child: Container(
decoration: BoxDecoration(
color: AppColors.secondary50,
@@ -232,7 +233,7 @@ class TenderCard extends StatelessWidget {
SvgPicture.asset(AssetsManager.location),
SizedBox(width: 4.0.w()),
Text(
tender.location ?? '',
tender.countryCode ?? '',
style: TextStyle(
color: AppColors.grey80,
fontSize: 14.0.sp(),
@@ -250,7 +251,7 @@ class TenderCard extends StatelessWidget {
Widget _seeMoreButton(BuildContext context) {
return InkWell(
onTap: () {
TenderDetailRouteData().push(context);
TenderDetailRouteData(tenderId: tender.id!).push(context);
},
child: Container(
width: 108.0.w(),
@@ -1,101 +0,0 @@
import 'package:flutter/material.dart';
class TenderModel {
final String date;
final String title;
final String description;
final String location;
final String countryFlag;
final String status;
final String projectStatus;
final Color? backgroundColor;
final Color? borderColor;
final String? statusIcon;
final Color? statusCardColor;
TenderModel({
required this.date,
required this.title,
required this.description,
required this.location,
required this.countryFlag,
required this.status,
required this.projectStatus,
this.backgroundColor,
this.borderColor,
this.statusIcon,
this.statusCardColor,
});
}
List<TenderModel> approvedTenders = [
TenderModel(
date: '2025-01-01',
title:
'Lorem ipsum dolor sit amet consectetur. Sed mi tortor eu purus senectus.',
description:
'Lorem ipsum dolor sit amet consectetur. Volutpat velit tincidunt amet diam. Placerat congue ut Sed facilisis faucibus porttitor. Proin suspendisse eu euismod sit lorem quis. ',
location: 'Stockholm, Sweden',
countryFlag: 'assets/icons/SE.png',
status: 'Completed',
projectStatus: 'Self Control',
),
TenderModel(
date: '2025-01-01',
title:
'Lorem ipsum dolor sit amet consectetur. Sed mi tortor eu purus senectus.',
description:
'Lorem ipsum dolor sit amet consectetur. Volutpat velit tincidunt amet diam. Placerat congue ut Sed facilisis faucibus porttitor. Proin suspendisse eu euismod sit lorem quis. ',
location: 'Stockholm, Sweden',
countryFlag: 'assets/icons/SE.png',
status: 'Completed',
projectStatus: 'Patner Ship',
),
TenderModel(
date: '2025-01-01',
title:
'Lorem ipsum dolor sit amet consectetur. Sed mi tortor eu purus senectus.',
description:
'Lorem ipsum dolor sit amet consectetur. Volutpat velit tincidunt amet diam. Placerat congue ut Sed facilisis faucibus porttitor. Proin suspendisse eu euismod sit lorem quis. ',
location: 'Stockholm, Sweden',
countryFlag: 'assets/icons/SE.png',
status: 'Completed',
projectStatus: 'Self Control',
),
];
List<TenderModel> tendersSubmitted = [
TenderModel(
date: '2025-01-01',
title:
'Lorem ipsum dolor sit amet consectetur. Sed mi tortor eu purus senectus.',
description:
'Lorem ipsum dolor sit amet consectetur. Volutpat velit tincidunt amet diam. Placerat congue ut Sed facilisis faucibus porttitor. Proin suspendisse eu euismod sit lorem quis. ',
location: 'Stockholm, Sweden',
countryFlag: 'assets/icons/SE.png',
status: 'Won',
projectStatus: 'Self Control',
),
TenderModel(
date: '2025-01-01',
title:
'Lorem ipsum dolor sit amet consectetur. Sed mi tortor eu purus senectus.',
description:
'Lorem ipsum dolor sit amet consectetur. Volutpat velit tincidunt amet diam. Placerat congue ut Sed facilisis faucibus porttitor. Proin suspendisse eu euismod sit lorem quis. ',
location: 'Stockholm, Sweden',
countryFlag: 'assets/icons/SE.png',
status: 'Reject',
projectStatus: 'Patner Ship',
),
TenderModel(
date: '2025-01-01',
title:
'Lorem ipsum dolor sit amet consectetur. Sed mi tortor eu purus senectus.',
description:
'Lorem ipsum dolor sit amet consectetur. Volutpat velit tincidunt amet diam. Placerat congue ut Sed facilisis faucibus porttitor. Proin suspendisse eu euismod sit lorem quis. ',
location: 'Stockholm, Sweden',
countryFlag: 'assets/icons/SE.png',
status: 'Won',
projectStatus: 'Self Control',
),
];