|
|
|
@ -47,6 +47,25 @@ class BuildAdDetailsActionButtonForExploreAds extends StatelessWidget {
|
|
|
|
description: Column(
|
|
|
|
description: Column(
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
children: [
|
|
|
|
children: [
|
|
|
|
|
|
|
|
// Show instructions if available
|
|
|
|
|
|
|
|
if (adDetailsModel.reserveCustomerMessage != null && adDetailsModel.reserveCustomerMessage!.isNotEmpty) ...[
|
|
|
|
|
|
|
|
LocaleKeys.shippingManagementInstruction.tr().toText(fontSize: 16, isBold: true),
|
|
|
|
|
|
|
|
8.height,
|
|
|
|
|
|
|
|
Container(
|
|
|
|
|
|
|
|
padding: const EdgeInsets.all(12),
|
|
|
|
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
|
|
|
|
color: MyColors.lightGreyBgColor,
|
|
|
|
|
|
|
|
borderRadius: BorderRadius.circular(8),
|
|
|
|
|
|
|
|
border: Border.all(color: MyColors.borderColor),
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
child: adDetailsModel.reserveCustomerMessage!.toText(
|
|
|
|
|
|
|
|
fontSize: 14,
|
|
|
|
|
|
|
|
maxLines: 10,
|
|
|
|
|
|
|
|
height: 1.5,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
20.height,
|
|
|
|
|
|
|
|
],
|
|
|
|
Row(
|
|
|
|
Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
children: [
|
|
|
|
children: [
|
|
|
|
@ -91,7 +110,7 @@ class BuildAdDetailsActionButtonForExploreAds extends StatelessWidget {
|
|
|
|
Row(
|
|
|
|
Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
children: [
|
|
|
|
children: [
|
|
|
|
LocaleKeys.carInsuranceService.tr().toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor, fontWeight: FontWeight.w500),
|
|
|
|
LocaleKeys.carInsuranceService.tr().toText(fontSize: 14, color: MyColors.lightTextColor, fontWeight: FontWeight.w500),
|
|
|
|
LocaleKeys.toBeDecided.tr().toText(fontSize: 12, isBold: true),
|
|
|
|
LocaleKeys.toBeDecided.tr().toText(fontSize: 12, isBold: true),
|
|
|
|
],
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
@ -99,7 +118,7 @@ class BuildAdDetailsActionButtonForExploreAds extends StatelessWidget {
|
|
|
|
Row(
|
|
|
|
Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
children: [
|
|
|
|
children: [
|
|
|
|
LocaleKeys.registrationCarPlates.tr().toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor),
|
|
|
|
LocaleKeys.registrationCarPlates.tr().toText(fontSize: 14, color: MyColors.lightTextColor),
|
|
|
|
LocaleKeys.toBeDecided.tr().toText(fontSize: 12, isBold: true),
|
|
|
|
LocaleKeys.toBeDecided.tr().toText(fontSize: 12, isBold: true),
|
|
|
|
],
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
@ -107,7 +126,7 @@ class BuildAdDetailsActionButtonForExploreAds extends StatelessWidget {
|
|
|
|
Row(
|
|
|
|
Row(
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
children: [
|
|
|
|
children: [
|
|
|
|
LocaleKeys.homeDeliveryService.tr().toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor),
|
|
|
|
LocaleKeys.homeDeliveryService.tr().toText(fontSize: 14, color: MyColors.lightTextColor),
|
|
|
|
LocaleKeys.toBeDecided.tr().toText(fontSize: 12, isBold: true),
|
|
|
|
LocaleKeys.toBeDecided.tr().toText(fontSize: 12, isBold: true),
|
|
|
|
],
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
@ -262,7 +281,13 @@ class BuildAdDetailsActionButtonForExploreAds extends StatelessWidget {
|
|
|
|
case CreatedByRoleEnum.provider:
|
|
|
|
case CreatedByRoleEnum.provider:
|
|
|
|
return defaultActionForProviderAndCustomer(context, adDetailsModel);
|
|
|
|
return defaultActionForProviderAndCustomer(context, adDetailsModel);
|
|
|
|
case CreatedByRoleEnum.admin:
|
|
|
|
case CreatedByRoleEnum.admin:
|
|
|
|
return reserveAdAction(context, adDetailsModel);
|
|
|
|
// Check if admin ad is reservable
|
|
|
|
|
|
|
|
if (adDetailsModel.isReservable == true && adDetailsModel.adPostStatus != AdPostStatus.sold) {
|
|
|
|
|
|
|
|
return reserveAdAction(context, adDetailsModel);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
// Show contact buttons just like customer/provider ads
|
|
|
|
|
|
|
|
return defaultActionForProviderAndCustomer(context, adDetailsModel);
|
|
|
|
|
|
|
|
}
|
|
|
|
case CreatedByRoleEnum.allAds:
|
|
|
|
case CreatedByRoleEnum.allAds:
|
|
|
|
return const SizedBox.shrink();
|
|
|
|
return const SizedBox.shrink();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -760,7 +785,7 @@ class BuildAdDetailsActionButtonForMyAds extends StatelessWidget {
|
|
|
|
Future buildCancelReservationBottomSheet(BuildContext context, {required AdDetailsModel adDetails}) {
|
|
|
|
Future buildCancelReservationBottomSheet(BuildContext context, {required AdDetailsModel adDetails}) {
|
|
|
|
// Capture parent context that will remain valid
|
|
|
|
// Capture parent context that will remain valid
|
|
|
|
final BuildContext parentContext = context;
|
|
|
|
final BuildContext parentContext = context;
|
|
|
|
|
|
|
|
|
|
|
|
return showModalBottomSheet(
|
|
|
|
return showModalBottomSheet(
|
|
|
|
context: context,
|
|
|
|
context: context,
|
|
|
|
isScrollControlled: true,
|
|
|
|
isScrollControlled: true,
|
|
|
|
@ -799,18 +824,22 @@ class BuildAdDetailsActionButtonForMyAds extends StatelessWidget {
|
|
|
|
// Save reason before showing confirmation dialog
|
|
|
|
// Save reason before showing confirmation dialog
|
|
|
|
final String cancelReason = adVM.reservationCancelReason;
|
|
|
|
final String cancelReason = adVM.reservationCancelReason;
|
|
|
|
return actionConfirmationBottomSheet(
|
|
|
|
return actionConfirmationBottomSheet(
|
|
|
|
context: parentContext, // Use parent context
|
|
|
|
context: parentContext,
|
|
|
|
|
|
|
|
// Use parent context
|
|
|
|
title: LocaleKeys.doWantCancelReservation.tr().toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
|
|
|
|
title: LocaleKeys.doWantCancelReservation.tr().toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
|
|
|
|
subtitle: "yourAdVisibletoBuy.".tr(),
|
|
|
|
subtitle: LocaleKeys.yourAdVisibletoBuy.tr(),
|
|
|
|
actionButtonYes: Expanded(
|
|
|
|
actionButtonYes: Expanded(
|
|
|
|
child: ShowFillButton(
|
|
|
|
child: ShowFillButton(
|
|
|
|
maxHeight: 55,
|
|
|
|
maxHeight: 55,
|
|
|
|
title: LocaleKeys.yes.tr(),
|
|
|
|
title: LocaleKeys.yes.tr(),
|
|
|
|
fontSize: 15,
|
|
|
|
fontSize: 15,
|
|
|
|
onPressed: () async {
|
|
|
|
onPressed: () async {
|
|
|
|
Navigator.pop(parentContext); // Pop confirmation
|
|
|
|
Navigator.pop(parentContext); // Pop confirmation
|
|
|
|
// Call with parent context that's still valid
|
|
|
|
// Call with parent context that's still valid, pass reserve ID
|
|
|
|
await adVM.cancelMyAdReservation(parentContext, adId: adDetails.id!, reason: cancelReason);
|
|
|
|
await adVM.cancelMyAdReservation(parentContext,
|
|
|
|
|
|
|
|
adId: adDetails.id!,
|
|
|
|
|
|
|
|
adsReserveId: adDetails.adsReserveId ?? 0, // Pass reserve ID
|
|
|
|
|
|
|
|
reason: cancelReason);
|
|
|
|
},
|
|
|
|
},
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
@ -910,42 +939,93 @@ class BuildAdDetailsActionButtonForMyAds extends StatelessWidget {
|
|
|
|
),
|
|
|
|
),
|
|
|
|
15.height,
|
|
|
|
15.height,
|
|
|
|
LocaleKeys.attachFile.tr().toText(fontSize: 20, isBold: true, letterSpacing: -0.5),
|
|
|
|
LocaleKeys.attachFile.tr().toText(fontSize: 20, isBold: true, letterSpacing: -0.5),
|
|
|
|
if (adVM.pickedReceiptPdfFiles.isNotEmpty) ...[
|
|
|
|
16.height,
|
|
|
|
16.height,
|
|
|
|
if (adVM.pickedReceiptFile != null) ...[
|
|
|
|
PickedFilesContainer(
|
|
|
|
// Show selected file
|
|
|
|
pickedFiles: adVM.pickedReceiptPdfFiles,
|
|
|
|
Container(
|
|
|
|
onCrossPressedPrimary: adVM.removePdfFileFromList,
|
|
|
|
padding: const EdgeInsets.all(12),
|
|
|
|
onAddFilePressed: () {
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
context.read<AdVM>().pickPdfReceiptFile(context);
|
|
|
|
color: MyColors.lightGreyBgColor,
|
|
|
|
},
|
|
|
|
borderRadius: BorderRadius.circular(8),
|
|
|
|
isPdf: true,
|
|
|
|
border: Border.all(color: MyColors.borderColor),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
|
|
|
|
child: Row(
|
|
|
|
|
|
|
|
children: [
|
|
|
|
|
|
|
|
Icon(
|
|
|
|
|
|
|
|
adVM.pickedReceiptFile!.filePath!.endsWith('.pdf') ? Icons.picture_as_pdf : Icons.image,
|
|
|
|
|
|
|
|
size: 40,
|
|
|
|
|
|
|
|
color: MyColors.primaryColor,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
12.width,
|
|
|
|
|
|
|
|
Expanded(
|
|
|
|
|
|
|
|
child: Column(
|
|
|
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
|
|
|
children: [
|
|
|
|
|
|
|
|
adVM.pickedReceiptFile!.filePath!.split('/').last.toText(fontSize: 14, isBold: true, maxLines: 1),
|
|
|
|
|
|
|
|
4.height,
|
|
|
|
|
|
|
|
LocaleKeys.change.tr().toText(
|
|
|
|
|
|
|
|
fontSize: 12,
|
|
|
|
|
|
|
|
color: MyColors.lightTextColor,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
],
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
IconButton(
|
|
|
|
|
|
|
|
icon: const Icon(Icons.close, color: MyColors.redColor),
|
|
|
|
|
|
|
|
onPressed: () {
|
|
|
|
|
|
|
|
context.read<AdVM>().removeReceiptFile();
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
],
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
).onPress(() {
|
|
|
|
|
|
|
|
context.read<AdVM>().pickReceiptFile(context);
|
|
|
|
|
|
|
|
}),
|
|
|
|
] else ...[
|
|
|
|
] else ...[
|
|
|
|
|
|
|
|
// Show add file button (original design)
|
|
|
|
Row(
|
|
|
|
Row(
|
|
|
|
children: [
|
|
|
|
children: [
|
|
|
|
Container(
|
|
|
|
Container(
|
|
|
|
height: 90,
|
|
|
|
height: 90,
|
|
|
|
width: 90,
|
|
|
|
width: 90,
|
|
|
|
decoration: BoxDecoration(color: MyColors.greyButtonColor, border: Border.all(width: 2, color: MyColors.greyAddBorderColor)),
|
|
|
|
decoration: BoxDecoration(
|
|
|
|
|
|
|
|
color: MyColors.greyButtonColor,
|
|
|
|
|
|
|
|
border: Border.all(width: 2, color: MyColors.greyAddBorderColor),
|
|
|
|
|
|
|
|
),
|
|
|
|
margin: const EdgeInsets.all(8),
|
|
|
|
margin: const EdgeInsets.all(8),
|
|
|
|
alignment: Alignment.center,
|
|
|
|
alignment: Alignment.center,
|
|
|
|
child: Container(
|
|
|
|
child: Container(
|
|
|
|
height: 24,
|
|
|
|
height: 24,
|
|
|
|
width: 24,
|
|
|
|
width: 24,
|
|
|
|
decoration: const BoxDecoration(shape: BoxShape.circle, color: MyColors.darkTextColor),
|
|
|
|
decoration: const BoxDecoration(
|
|
|
|
|
|
|
|
shape: BoxShape.circle,
|
|
|
|
|
|
|
|
color: MyColors.darkTextColor,
|
|
|
|
|
|
|
|
),
|
|
|
|
child: const Icon(Icons.add, color: MyColors.white),
|
|
|
|
child: const Icon(Icons.add, color: MyColors.white),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
).onPress(() {
|
|
|
|
).onPress(() {
|
|
|
|
context.read<AdVM>().pickPdfReceiptFile(context);
|
|
|
|
context.read<AdVM>().pickReceiptFile(context);
|
|
|
|
}),
|
|
|
|
}),
|
|
|
|
],
|
|
|
|
],
|
|
|
|
),
|
|
|
|
),
|
|
|
|
],
|
|
|
|
],
|
|
|
|
|
|
|
|
if (adVM.receiptFileError.isNotEmpty) ...[
|
|
|
|
|
|
|
|
8.height,
|
|
|
|
|
|
|
|
adVM.receiptFileError.toText(
|
|
|
|
|
|
|
|
fontSize: 12,
|
|
|
|
|
|
|
|
color: MyColors.redColor,
|
|
|
|
|
|
|
|
),
|
|
|
|
|
|
|
|
],
|
|
|
|
15.height,
|
|
|
|
15.height,
|
|
|
|
ShowFillButton(
|
|
|
|
ShowFillButton(
|
|
|
|
title: LocaleKeys.submit.tr(),
|
|
|
|
title: LocaleKeys.submit.tr(),
|
|
|
|
onPressed: () {
|
|
|
|
onPressed: () {
|
|
|
|
//Upload Attachment
|
|
|
|
if (adVM.pickedReceiptFile == null) {
|
|
|
|
|
|
|
|
adVM.receiptFileError = LocaleKeys.selectAttachment.tr();
|
|
|
|
|
|
|
|
adVM.notifyListeners();
|
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
adVM.uploadBankReceipt(context, adId: adDetails.id!);
|
|
|
|
},
|
|
|
|
},
|
|
|
|
maxWidth: double.infinity,
|
|
|
|
maxWidth: double.infinity,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
@ -1035,6 +1115,9 @@ class BuildAdDetailsActionButtonForMyAds extends StatelessWidget {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return pendingForReviewAction(pendingText: LocaleKeys.waitingAdminsResponse.tr());
|
|
|
|
return pendingForReviewAction(pendingText: LocaleKeys.waitingAdminsResponse.tr());
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
case AdReserveStatus.paymentDoneByCustomer:
|
|
|
|
|
|
|
|
return pendingForReviewAction(pendingText: LocaleKeys.waitingAdminsResponse.tr());
|
|
|
|
|
|
|
|
|
|
|
|
case AdReserveStatus.fullPaymentVerified:
|
|
|
|
case AdReserveStatus.fullPaymentVerified:
|
|
|
|
return pendingForReviewAction(pendingText: LocaleKeys.paymentVerified.tr());
|
|
|
|
return pendingForReviewAction(pendingText: LocaleKeys.paymentVerified.tr());
|
|
|
|
|
|
|
|
|
|
|
|
@ -1045,8 +1128,6 @@ class BuildAdDetailsActionButtonForMyAds extends StatelessWidget {
|
|
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
@override
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
Widget build(BuildContext context) {
|
|
|
|
log("adDetailsModel.adPostStatus: ${adDetailsModel.adPostStatus}");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
switch (adDetailsModel.adPostStatus!) {
|
|
|
|
switch (adDetailsModel.adPostStatus!) {
|
|
|
|
case AdPostStatus.pendingForPayment:
|
|
|
|
case AdPostStatus.pendingForPayment:
|
|
|
|
return pendingForPaymentAction(context, ad: adDetailsModel);
|
|
|
|
return pendingForPaymentAction(context, ad: adDetailsModel);
|
|
|
|
|