|
|
|
|
@ -1526,7 +1526,7 @@ class AdVM extends BaseVM {
|
|
|
|
|
final isArabic = AppState().isArabic(context);
|
|
|
|
|
actionConfirmationBottomSheet(
|
|
|
|
|
context: context,
|
|
|
|
|
title:( isArabic ? "حفظ كمسودة" : "Save As Draft").toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
|
|
|
|
|
title: (isArabic ? "حفظ كمسودة" : "Save As Draft").toText(fontSize: 28, isBold: true, letterSpacing: -1.44),
|
|
|
|
|
subtitle: isArabic
|
|
|
|
|
? "سيتم حفظ إعلانك كمسودة، ويمكنك المتابعة لاحقًا من حيث توقفت. هل تريد الحفظ والرجوع؟"
|
|
|
|
|
: "Your ad will be saved as draft and you can continue later from where you left off. Do you want to save and go back?",
|
|
|
|
|
@ -2056,6 +2056,22 @@ class AdVM extends BaseVM {
|
|
|
|
|
isAccidentFree = false;
|
|
|
|
|
isAccidentFreeSet = false;
|
|
|
|
|
accidentFreeError = "";
|
|
|
|
|
// These error strings aren't part of a SelectionModel (unlike the dropdowns reset
|
|
|
|
|
// above), so they were never cleared here -- confirmed on a real device: once
|
|
|
|
|
// isVehicleDetailsValidated() set one of these, it stayed set and showed up on the
|
|
|
|
|
// very next ad creation, before the user had touched anything.
|
|
|
|
|
demandAmountError = "";
|
|
|
|
|
vehicleVinError = "";
|
|
|
|
|
vehicleTitleError = "";
|
|
|
|
|
warrantyError = "";
|
|
|
|
|
vehicleDescError = "";
|
|
|
|
|
vehicleImageError = "";
|
|
|
|
|
// Edit-mode flags also need resetting -- isAdEditEnabled in particular gates the
|
|
|
|
|
// minimum-image-count check in isVehicleDetailsValidated(), so leaving it stale as
|
|
|
|
|
// true would silently skip that requirement for a genuinely new ad.
|
|
|
|
|
isAdEditEnabled = false;
|
|
|
|
|
isDraftEditEnabled = false;
|
|
|
|
|
isExtendAdEditEnabled = false;
|
|
|
|
|
clearSpecialServiceCard();
|
|
|
|
|
updateFinanceAvailableStatus(false);
|
|
|
|
|
notifyListeners();
|
|
|
|
|
@ -3000,40 +3016,59 @@ class AdVM extends BaseVM {
|
|
|
|
|
await updateSelectionVehicleBrandId(SelectionModel(selectedId: vehicleBrands[index].id!, selectedOption: vehicleBrands[index].vehicleBrandDescription ?? ""));
|
|
|
|
|
}
|
|
|
|
|
updateSelectionVehicleModelId(SelectionModel(selectedId: previousAdDetails!.vehicle!.model!.id!, selectedOption: previousAdDetails!.vehicle!.model!.label ?? ""));
|
|
|
|
|
updateSelectionVehicleModelYearId(SelectionModel(selectedId: previousAdDetails!.vehicle!.modelyear!.id!, selectedOption: previousAdDetails!.vehicle!.modelyear!.label ?? ""));
|
|
|
|
|
updateSelectionVehicleColorId(SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.color!.id!, selectedOption: isArabic ? previousAdDetails!.vehicle!.color!.labelN.toString() : previousAdDetails!.vehicle!.color!.label ?? ""));
|
|
|
|
|
updateSelectionVehicleConditionId(SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.condition!.id!,
|
|
|
|
|
selectedOption: isArabic ? previousAdDetails!.vehicle!.condition!.labelN.toString() : previousAdDetails!.vehicle!.condition!.label ?? ""));
|
|
|
|
|
updateSelectionVehicleCategoryId(SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.category!.id!, selectedOption: isArabic ? previousAdDetails!.vehicle!.category!.labelN.toString() : previousAdDetails!.vehicle!.category!.label ?? ""));
|
|
|
|
|
updateSelectionVehicleMileageId(SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.mileage!.id!,
|
|
|
|
|
selectedOption: "${previousAdDetails!.vehicle!.mileage!.mileageStart} - ${previousAdDetails!.vehicle!.mileage!.mileageEnd}",
|
|
|
|
|
));
|
|
|
|
|
updateSelectionVehicleTransmissionId(SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.transmission!.id!,
|
|
|
|
|
selectedOption: isArabic ? previousAdDetails!.vehicle!.transmission!.labelN.toString() : previousAdDetails!.vehicle!.transmission!.label ?? ""));
|
|
|
|
|
updateSelectionVehicleSellerTypeId(SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.sellertype!.id!,
|
|
|
|
|
selectedOption: isArabic ? previousAdDetails!.vehicle!.sellertype!.labelN.toString() : previousAdDetails!.vehicle!.sellertype!.label ?? ""));
|
|
|
|
|
// Confirmed from a real draft API response: an unset nested field comes back as a
|
|
|
|
|
// non-null placeholder object ({"id": 0, "label": null, ...}), not an absent/null
|
|
|
|
|
// field -- same "0 means not set" convention the demandAmount/odometer/warantyYears
|
|
|
|
|
// fields below already account for. Blindly trusting .id! here (without this check)
|
|
|
|
|
// set selectedId to 0 instead of -1, which silently passed the `selectedId == -1`
|
|
|
|
|
// required-field check on Next even though nothing was selected. Always assigning
|
|
|
|
|
// (real value OR an explicit empty SelectionModel) rather than conditionally skipping
|
|
|
|
|
// also avoids leaking a stale selection left over from a previous ad-editing session.
|
|
|
|
|
updateSelectionVehicleModelYearId((previousAdDetails!.vehicle!.modelyear?.id ?? 0) > 0
|
|
|
|
|
? SelectionModel(selectedId: previousAdDetails!.vehicle!.modelyear!.id!, selectedOption: previousAdDetails!.vehicle!.modelyear!.label ?? "")
|
|
|
|
|
: SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""));
|
|
|
|
|
updateSelectionVehicleColorId((previousAdDetails!.vehicle!.color?.id ?? 0) > 0
|
|
|
|
|
? SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.color!.id!, selectedOption: isArabic ? previousAdDetails!.vehicle!.color!.labelN.toString() : previousAdDetails!.vehicle!.color!.label ?? "")
|
|
|
|
|
: SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""));
|
|
|
|
|
updateSelectionVehicleConditionId((previousAdDetails!.vehicle!.condition?.id ?? 0) > 0
|
|
|
|
|
? SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.condition!.id!,
|
|
|
|
|
selectedOption: isArabic ? previousAdDetails!.vehicle!.condition!.labelN.toString() : previousAdDetails!.vehicle!.condition!.label ?? "")
|
|
|
|
|
: SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""));
|
|
|
|
|
updateSelectionVehicleCategoryId((previousAdDetails!.vehicle!.category?.id ?? 0) > 0
|
|
|
|
|
? SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.category!.id!,
|
|
|
|
|
selectedOption: isArabic ? previousAdDetails!.vehicle!.category!.labelN.toString() : previousAdDetails!.vehicle!.category!.label ?? "")
|
|
|
|
|
: SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""));
|
|
|
|
|
updateSelectionVehicleMileageId((previousAdDetails!.vehicle!.mileage?.id ?? 0) > 0
|
|
|
|
|
? SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.mileage!.id!,
|
|
|
|
|
selectedOption: "${previousAdDetails!.vehicle!.mileage!.mileageStart} - ${previousAdDetails!.vehicle!.mileage!.mileageEnd}",
|
|
|
|
|
)
|
|
|
|
|
: SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""));
|
|
|
|
|
updateSelectionVehicleTransmissionId((previousAdDetails!.vehicle!.transmission?.id ?? 0) > 0
|
|
|
|
|
? SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.transmission!.id!,
|
|
|
|
|
selectedOption: isArabic ? previousAdDetails!.vehicle!.transmission!.labelN.toString() : previousAdDetails!.vehicle!.transmission!.label ?? "")
|
|
|
|
|
: SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""));
|
|
|
|
|
updateSelectionVehicleSellerTypeId((previousAdDetails!.vehicle!.sellertype?.id ?? 0) > 0
|
|
|
|
|
? SelectionModel(
|
|
|
|
|
selectedId: previousAdDetails!.vehicle!.sellertype!.id!,
|
|
|
|
|
selectedOption: isArabic ? previousAdDetails!.vehicle!.sellertype!.labelN.toString() : previousAdDetails!.vehicle!.sellertype!.label ?? "")
|
|
|
|
|
: SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""));
|
|
|
|
|
int indexCountry = vehicleCountries.indexWhere((element) => element.id == previousAdDetails!.vehicle!.countryID);
|
|
|
|
|
if (indexCountry != -1) {
|
|
|
|
|
updateSelectionVehicleCountryId(SelectionModel(selectedId: vehicleCountries[indexCountry].id!, selectedOption: vehicleCountries[indexCountry].countryName ?? ""));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
updateSelectionVehicleCityId(SelectionModel(selectedId: previousAdDetails!.vehicle!.cityID!, selectedOption: previousAdDetails!.vehicle!.cityName ?? ""));
|
|
|
|
|
vehicleDemandAmount = (previousAdDetails!.vehicle!.demandAmount == null || previousAdDetails!.vehicle!.demandAmount == 0)
|
|
|
|
|
? ""
|
|
|
|
|
: previousAdDetails!.vehicle!.demandAmount!.toInt().toString();
|
|
|
|
|
vehicleDemandAmount = (previousAdDetails!.vehicle!.demandAmount == null || previousAdDetails!.vehicle!.demandAmount == 0) ? "" : previousAdDetails!.vehicle!.demandAmount!.toInt().toString();
|
|
|
|
|
vehicleVin = previousAdDetails!.vehicle!.vehicleVIN ?? "";
|
|
|
|
|
vehicleTitle = previousAdDetails!.vehicle!.vehicleTitle ?? "";
|
|
|
|
|
vehicleDescription = previousAdDetails!.vehicle!.vehicleDescription ?? "";
|
|
|
|
|
financeAvailableStatus = previousAdDetails!.vehicle!.isFinanceAvailable ?? false;
|
|
|
|
|
odometer = (previousAdDetails!.vehicle!.odometer == null || previousAdDetails!.vehicle!.odometer == 0)
|
|
|
|
|
? ""
|
|
|
|
|
: previousAdDetails!.vehicle!.odometer.toString();
|
|
|
|
|
odometer = (previousAdDetails!.vehicle!.odometer == null || previousAdDetails!.vehicle!.odometer == 0) ? "" : previousAdDetails!.vehicle!.odometer.toString();
|
|
|
|
|
isInUsed = previousAdDetails!.vehicle!.isInUsed ?? 0;
|
|
|
|
|
isAccidentFree = previousAdDetails!.vehicle!.isAccidentFree ?? false;
|
|
|
|
|
isAccidentFreeSet = true;
|
|
|
|
|
@ -3098,9 +3133,7 @@ class AdVM extends BaseVM {
|
|
|
|
|
adPhoneNumber = previousAdDetails!.adOwnerDetails!.mobileNo ?? "";
|
|
|
|
|
|
|
|
|
|
isNumberOnWhatsApp = previousAdDetails!.whatsAppNo != null;
|
|
|
|
|
warrantyDuration = (previousAdDetails!.warrantyYears == null || previousAdDetails!.warrantyYears == "0")
|
|
|
|
|
? ""
|
|
|
|
|
: previousAdDetails!.warrantyYears!;
|
|
|
|
|
warrantyDuration = (previousAdDetails!.warrantyYears == null || previousAdDetails!.warrantyYears == "0") ? "" : previousAdDetails!.warrantyYears!;
|
|
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
|