@ -27,12 +27,15 @@ import 'package:mc_common_app/models/general_models/widgets_models.dart';
import ' package:mc_common_app/repositories/ads_repo.dart ' ;
import ' package:mc_common_app/repositories/common_repo.dart ' ;
import ' package:mc_common_app/services/common_services.dart ' ;
import ' package:mc_common_app/theme/colors.dart ' ;
import ' package:mc_common_app/utils/date_helper.dart ' ;
import ' package:mc_common_app/utils/dialogs_and_bottomsheets.dart ' ;
import ' package:mc_common_app/utils/enums.dart ' ;
import ' package:mc_common_app/utils/navigator.dart ' ;
import ' package:mc_common_app/utils/utils.dart ' ;
import ' package:mc_common_app/view_models/base_view_model.dart ' ;
import ' package:mc_common_app/view_models/chat_view_model.dart ' ;
import ' package:mc_common_app/widgets/button/show_fill_button.dart ' ;
import ' package:mc_common_app/widgets/dropdown/dropdow_field.dart ' ;
import ' package:provider/provider.dart ' ;
@ -1243,26 +1246,153 @@ class AdVM extends BaseVM {
void onBackButtonPressed ( BuildContext context ) {
switch ( currentProgressStep ) {
case AdCreationStepsEnum . vehicleDetails:
isAdEditEnabled = false ;
isDraftEditEnabled = false ;
resetValues ( ) ;
pop ( context ) ;
/ / Check if user has entered any data
bool hasData = vehicleTypeId . selectedId ! = - 1 | |
vehicleBrandId . selectedId ! = - 1 | |
vehicleModelId . selectedId ! = - 1 | |
vehicleModelYearId . selectedId ! = - 1 | |
vehicleColorId . selectedId ! = - 1 | |
vehicleCategoryId . selectedId ! = - 1 | |
vehicleConditionId . selectedId ! = - 1 | |
vehicleMileageId . selectedId ! = - 1 | |
vehicleTransmissionId . selectedId ! = - 1 | |
vehicleCountryId . selectedId ! = - 1 | |
vehicleCityId . selectedId ! = - 1 | |
vehicleDemandAmount . isNotEmpty | |
vehicleVin . isNotEmpty | |
vehicleTitle . isNotEmpty | |
warrantyDuration . isNotEmpty | |
vehicleDescription . isNotEmpty | |
pickedPostingImages . isNotEmpty ;
if ( hasData ) {
/ / Show confirmation dialog if user has entered data
showSaveAsDraftConfirmationDialog (
context ,
onYes: ( ) async {
Navigator . pop ( context ) ;
await saveAdAsDraft ( context: context , stepNoEnum: AdCreationStepsEnum . vehicleDetails , bypassValidation: true ) ;
currentProgressStep = AdCreationStepsEnum . vehicleDetails ;
isAdEditEnabled = false ;
isDraftEditEnabled = false ;
resetValues ( ) ;
pop ( context ) ;
if ( AppState ( ) . currentAppType = = AppType . customer ) {
pop ( context ) ;
}
} ,
onNo: ( ) {
Navigator . pop ( context ) ;
isAdEditEnabled = false ;
isDraftEditEnabled = false ;
resetValues ( ) ;
pop ( context ) ;
} ,
) ;
} else {
/ / No data entered , go back directly
isAdEditEnabled = false ;
isDraftEditEnabled = false ;
resetValues ( ) ;
pop ( context ) ;
}
break ;
case AdCreationStepsEnum . damageParts:
currentProgressStep = AdCreationStepsEnum . vehicleDetails ;
notifyListeners ( ) ;
showSaveAsDraftConfirmationDialog (
context ,
onYes: ( ) async {
Navigator . pop ( context ) ;
await saveAdAsDraft ( context: context , stepNoEnum: AdCreationStepsEnum . damageParts , bypassValidation: true ) ;
currentProgressStep = AdCreationStepsEnum . vehicleDetails ;
isAdEditEnabled = false ;
isDraftEditEnabled = false ;
resetValues ( ) ;
pop ( context ) ;
if ( AppState ( ) . currentAppType = = AppType . customer ) {
pop ( context ) ;
}
} ,
onNo: ( ) {
Navigator . pop ( context ) ;
currentProgressStep = AdCreationStepsEnum . vehicleDetails ;
notifyListeners ( ) ;
} ,
) ;
break ;
case AdCreationStepsEnum . adDuration:
currentProgressStep = AdCreationStepsEnum . damageParts ;
notifyListeners ( ) ;
showSaveAsDraftConfirmationDialog (
context ,
onYes: ( ) async {
Navigator . pop ( context ) ;
await saveAdAsDraft ( context: context , stepNoEnum: AdCreationStepsEnum . adDuration , bypassValidation: true ) ;
currentProgressStep = AdCreationStepsEnum . vehicleDetails ;
isAdEditEnabled = false ;
isDraftEditEnabled = false ;
resetValues ( ) ;
pop ( context ) ;
if ( AppState ( ) . currentAppType = = AppType . customer ) {
pop ( context ) ;
}
} ,
onNo: ( ) {
Navigator . pop ( context ) ;
currentProgressStep = AdCreationStepsEnum . damageParts ;
notifyListeners ( ) ;
} ,
) ;
break ;
case AdCreationStepsEnum . reviewAd:
currentProgressStep = AdCreationStepsEnum . adDuration ;
notifyListeners ( ) ;
showSaveAsDraftConfirmationDialog (
context ,
onYes: ( ) async {
Navigator . pop ( context ) ;
await saveAdAsDraft ( context: context , stepNoEnum: AdCreationStepsEnum . reviewAd , bypassValidation: true ) ;
currentProgressStep = AdCreationStepsEnum . vehicleDetails ;
isAdEditEnabled = false ;
isDraftEditEnabled = false ;
resetValues ( ) ;
pop ( context ) ;
if ( AppState ( ) . currentAppType = = AppType . customer ) {
pop ( context ) ;
}
} ,
onNo: ( ) {
Navigator . pop ( context ) ;
currentProgressStep = AdCreationStepsEnum . adDuration ;
notifyListeners ( ) ;
} ,
) ;
break ;
}
}
void showSaveAsDraftConfirmationDialog ( BuildContext context , { required VoidCallback onYes , required VoidCallback onNo } ) {
actionConfirmationBottomSheet (
context: context ,
title: " Save As Draft " . toText ( fontSize: 28 , isBold: true , letterSpacing: - 1.44 ) ,
subtitle: " 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? " ,
actionButtonYes: Expanded (
child: ShowFillButton (
maxHeight: 55 ,
title: LocaleKeys . yes . tr ( ) ,
fontSize: 15 ,
onPressed: onYes ,
) ,
) ,
actionButtonNo: Expanded (
child: ShowFillButton (
maxHeight: 55 ,
isFilled: false ,
borderColor: MyColors . darkPrimaryColor ,
title: LocaleKeys . no . tr ( ) ,
txtColor: MyColors . darkPrimaryColor ,
fontSize: 15 ,
onPressed: onNo ,
) ,
) ,
) ;
}
Future < int > saveAdVehicleDetailsDraft ( { required bool isNew , required BuildContext context , required AdCreationStepsEnum stepNoEnum } ) async {
AppState appState = injector . get < AppState > ( ) ;
@ -1354,6 +1484,99 @@ class AdVM extends BaseVM {
}
}
Future < void > saveAdAsDraft ( { required BuildContext context , required AdCreationStepsEnum stepNoEnum , bool bypassValidation = false } ) async {
AppState appState = injector . get < AppState > ( ) ;
List < int > adsSelectedServices = [ ] ;
for ( var value in specialServiceCards ) {
adsSelectedServices . add ( value . serviceSelectedId ! . selectedId ) ;
}
Utils . showLoading ( context ) ;
try {
Ads ads = Ads (
id: ( previousAdDetails ! = null & & previousAdDetails ! . id ! = null ) ? previousAdDetails ! . id : 0 ,
adsDurationID: vehicleAdDurationId . selectedId = = - 1 ? 0 : vehicleAdDurationId . selectedId ,
startDate: selectionDurationStartDate . isNotEmpty ? selectionDurationStartDate : null ,
countryId: vehicleCountryId . selectedId ! = - 1 ? vehicleCountryId . selectedId : null ,
specialServiceIDs: adsSelectedServices ,
showContactDetail: isPhoneNumberShown ,
isOnWhatsApp: isNumberOnWhatsApp ,
) ;
List < VehiclePostingImages > vehicleImages = [ ] ;
for ( var image in pickedPostingImages ) {
vehicleImages . add ( await convertFileToVehiclePostingImages ( imageModel: image ) ) ;
}
List < VehiclePostingDamageParts > vehicleDamageImages = [ ] ;
for ( var card in vehicleDamageCards ) {
if ( card . partImages ! = null & & card . partImages ! . isNotEmpty ) {
for ( var image in card . partImages ! ) {
VehiclePostingDamageParts stringImage = await convertFileToVehiclePostingDamageParts (
imageModel: image ,
damagePartId: card . partSelectedId ! . selectedId ,
commentParam: card . damagePartDescription ? ? " " ,
) ;
vehicleDamageImages . add ( stringImage ) ;
}
}
}
VehiclePosting vehiclePosting = VehiclePosting (
id: ( previousAdDetails ! = null & & previousAdDetails ! . vehiclePostingID ! = null ) ? previousAdDetails ! . vehiclePostingID : null ,
userID: appState . getUser . data ! . userInfo ! . userId ,
vehicleType: vehicleTypeId . selectedId ! = - 1 ? vehicleTypeId . selectedId : null ,
vehicleModelID: vehicleModelId . selectedId ! = - 1 ? vehicleModelId . selectedId : null ,
vehicleModelYearID: vehicleModelYearId . selectedId ! = - 1 ? vehicleModelYearId . selectedId : null ,
vehicleColorID: vehicleColorId . selectedId ! = - 1 ? vehicleColorId . selectedId : null ,
vehicleCategoryID: vehicleCategoryId . selectedId ! = - 1 ? vehicleCategoryId . selectedId : null ,
vehicleConditionID: vehicleConditionId . selectedId ! = - 1 ? vehicleConditionId . selectedId : null ,
vehicleMileageID: vehicleMileageId . selectedId ! = - 1 ? vehicleMileageId . selectedId : null ,
vehicleTransmissionID: vehicleTransmissionId . selectedId ! = - 1 ? vehicleTransmissionId . selectedId : null ,
vehicleSellerTypeID: vehicleSellerTypeId . selectedId = = - 1 ? 1 : vehicleSellerTypeId . selectedId ,
cityID: vehicleCityId . selectedId ! = - 1 ? vehicleCityId . selectedId : null ,
price: vehicleDemandAmount . isNotEmpty ? int . tryParse ( vehicleDemandAmount ) : null ,
vehicleVIN: vehicleVin . isNotEmpty ? vehicleVin : null ,
vehicleDescription: vehicleDescription . isNotEmpty ? vehicleDescription : null ,
vehicleTitle: vehicleTitle . isNotEmpty ? vehicleTitle : null ,
vehicleDescriptionN: vehicleDescription . isNotEmpty ? vehicleDescription : null ,
isFinanceAvailable: financeAvailableStatus ,
warantyYears: warrantyDuration . isNotEmpty ? int . tryParse ( warrantyDuration ) : null ,
demandAmount: vehicleDemandAmount . isNotEmpty ? int . tryParse ( vehicleDemandAmount ) : null ,
vehiclePostingImages: vehicleImages ,
vehiclePostingDamageParts: vehicleDamageImages ,
phoneNo: ( isPhoneNumberShown & & adPhoneNumber . isNotEmpty ) ? adPhoneNumberDialCode + adPhoneNumber : null ,
whatsAppNo: ( isPhoneNumberShown & & isNumberOnWhatsApp & & adPhoneNumber . isNotEmpty ) ? adPhoneNumberDialCode + adPhoneNumber : null ,
odometer: odometer . isNotEmpty ? int . tryParse ( odometer ) : 0 ,
isInUsed: isInUsed ,
isAccidentFree: isAccidentFree ,
) ;
AdsCreationPayloadModel adsCreationPayloadModel = AdsCreationPayloadModel ( ads: ads , vehiclePosting: vehiclePosting ) ;
GenericRespModel respModel = await adsRepo . createOrUpdateDraftAd (
adsCreationPayloadModel: adsCreationPayloadModel ,
isCreateNew: previousAdDetails = = null | | previousAdDetails ! . id = = null ,
stepNo: stepNoEnum ,
) ;
Utils . hideLoading ( context ) ;
if ( respModel . messageStatus = = 1 ) {
Utils . showToast ( ' Saved as Draft ' ) ;
getMyDraftAds ( ) ;
} else {
Utils . showToast ( respModel . message ? ? " Failed to save draft " ) ;
}
} catch ( e ) {
Utils . hideLoading ( context ) ;
logger . e ( e . toString ( ) ) ;
Utils . showToast ( " Error saving draft: ${ e . toString ( ) } " ) ;
}
}
Future saveAdDamagePartDetailsDraft ( ) async { }
Future saveAdDurationsDraft ( ) async { }