From 87ec0f296644cb3f86978edbf76b130f3f58b338 Mon Sep 17 00:00:00 2001 From: Rand Alshammari Date: Sun, 5 Jul 2026 09:39:55 +0300 Subject: [PATCH] fixed A & E --- lib/extensions/string_extensions.dart | 4 +- .../advertisment_models/ad_details_model.dart | 3 ++ lib/utils/date_helper.dart | 20 ++++++++-- lib/view_models/ad_view_model.dart | 7 ++-- .../ads_detail_view/ads_detail_view.dart | 26 ++++++++++--- .../components/ads_list_widget.dart | 33 ++++++++++++++--- .../advertisement/select_ad_type_view.dart | 9 +++-- lib/views/user/forget_password_page.dart | 12 +++++- lib/views/user/login_with_password_page.dart | 37 ++++++++++++++++++- 9 files changed, 126 insertions(+), 25 deletions(-) diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 2d2048f..2462395 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -678,11 +678,11 @@ extension BranchServiceEnumStatusToInt on ServiceStatusEnum { } extension DateTimeConversions on DateTime { - String getTimeAgo({bool numericDates = true}) { + String getTimeAgo({bool numericDates = true, bool isArabic = false,}) { final date2 = DateTime.now(); final difference = date2.difference(this); if ((difference.inDays / 7).floor() >= 2) { - return DateHelper.formatAsDayMonthYear(this); + return DateHelper.formatAsDayMonthYear(this, isArabic: isArabic,); } else if ((difference.inDays / 7).floor() >= 1) { return (numericDates) ? '1 week ago' : 'Last week'; } else if (difference.inDays >= 2) { diff --git a/lib/models/advertisment_models/ad_details_model.dart b/lib/models/advertisment_models/ad_details_model.dart index 8cafcf9..665fe68 100644 --- a/lib/models/advertisment_models/ad_details_model.dart +++ b/lib/models/advertisment_models/ad_details_model.dart @@ -15,6 +15,7 @@ class AdDetailsModel { // List? reserved; int? statusID; String? statuslabel; + String? statuslabelN; double? adsDurationPrice; double? adsDurationDiscount; double? adsDurationDiscountPrice; @@ -64,6 +65,7 @@ class AdDetailsModel { // this.reserved, this.statusID, this.statuslabel, + this.statuslabelN, this.adsDurationPrice, this.adsDurationDiscount, this.adsDurationDiscountPrice, @@ -124,6 +126,7 @@ class AdDetailsModel { } statusID = json['statusID']; statuslabel = json['statuslabel']; + statuslabelN = json['statuslabelN']; adsDurationPrice = json['adsDurationPrice']; adsDurationDiscount = json['adsDurationDiscount']; adsDurationDiscountPrice = json['adsDurationDiscountPrice']; diff --git a/lib/utils/date_helper.dart b/lib/utils/date_helper.dart index 9c11007..e332e15 100644 --- a/lib/utils/date_helper.dart +++ b/lib/utils/date_helper.dart @@ -21,8 +21,13 @@ class DateHelper { return formatter.format(date); } - static String formatAsTime(DateTime date) { - final formatter = DateFormat.jm(); + // static String formatAsTime(DateTime date) { + // final formatter = DateFormat.jm(); + // return formatter.format(date); + // } + static String formatAsTime(DateTime date, {bool isArabic = false,}) { + final formatter = DateFormat.jm( + isArabic ? 'ar' : 'en',); return formatter.format(date); } @@ -36,8 +41,15 @@ class DateHelper { return formatter.format(date); } - static String formatAsDayMonthYear(DateTime? date) { - final formatter = DateFormat('d MMM, y'); + // static String formatAsDayMonthYear(DateTime? date) { + // final formatter = DateFormat('d MMM, y'); + // return date != null ? formatter.format(date) : "N/A"; + // } + static String formatAsDayMonthYear(DateTime? date, + { bool isArabic = false,}) { + final formatter = DateFormat('d MMM, y', + isArabic ? 'ar' : 'en', + ); return date != null ? formatter.format(date) : "N/A"; } diff --git a/lib/view_models/ad_view_model.dart b/lib/view_models/ad_view_model.dart index 06479de..c3f32af 100644 --- a/lib/view_models/ad_view_model.dart +++ b/lib/view_models/ad_view_model.dart @@ -193,19 +193,20 @@ class AdVM extends BaseVM { exploreAdsFilterOptions.clear(); myAdsFilterOptions.clear(); for (int i = 0; i < myAdsStatusEnums.length; i++) { - myAdsFilterOptions.add(FilterListModel(title: myAdsStatusEnums[i].enumValueStr, isSelected: false, id: myAdsStatusEnums[i].enumValue)); + myAdsFilterOptions.add(FilterListModel(title: myAdsStatusEnums[i].enumValueStr, titleN: myAdsStatusEnums[i].enumValueStrN, isSelected: false, id: myAdsStatusEnums[i].enumValue)); } - myAdsFilterOptions.insert(0, FilterListModel(title: "All Ads", isSelected: true, id: 0)); + myAdsFilterOptions.insert(0, FilterListModel(title: "All Ads", titleN: "جميع الاعلانات", isSelected: true, id: 0)); for (int i = 0; i < vehicleBrandsForFilters.length; i++) { exploreAdsFilterOptions.add(FilterListModel( id: vehicleBrandsForFilters[i].id!, title: "${vehicleBrandsForFilters[i].vehicleBrandDescription}", + titleN: "${vehicleBrandsForFilters[i].vehicleBrandDescriptionN}", iconUrl: vehicleBrandsForFilters[i].imageUrl ?? "", isSelected: false, )); } - exploreAdsFilterOptions.insert(0, FilterListModel(title: "All Ads", isSelected: true, id: 0)); + exploreAdsFilterOptions.insert(0, FilterListModel(title: "All Ads", titleN: "جميع الاعلانات", isSelected: true, id: 0)); notifyListeners(); } diff --git a/lib/views/advertisement/ads_detail_view/ads_detail_view.dart b/lib/views/advertisement/ads_detail_view/ads_detail_view.dart index 8efc736..77a02fa 100644 --- a/lib/views/advertisement/ads_detail_view/ads_detail_view.dart +++ b/lib/views/advertisement/ads_detail_view/ads_detail_view.dart @@ -130,7 +130,9 @@ class _AdsDetailViewState extends State { "${widget.adDetails.vehicle!.mileage!.mileageEnd} ${LocaleKeys.km.tr()}".toText(fontSize: 12), ], ), - widget.adDetails.createdOn != null ? DateTime.parse(widget.adDetails.createdOn!).getTimeAgo().toText(fontSize: 10, color: MyColors.lightTextColor) : const SizedBox(), + widget.adDetails.createdOn != null + ? DateTime.parse(widget.adDetails.createdOn!).getTimeAgo(isArabic: isArabic).toText(fontSize: 10,color: MyColors.lightTextColor,): const SizedBox(), + //widget.adDetails.createdOn != null ? DateTime.parse(widget.adDetails.createdOn!).getTimeAgo().toText(fontSize: 10, color: MyColors.lightTextColor) : const SizedBox(), ], ), Row( @@ -366,12 +368,26 @@ class _AdsDetailViewState extends State { Widget buildAdStartEndDates() { String startDate = ""; String endDate = ""; + bool isArabic = AppState().isArabic(context); + final atText = isArabic ? "الساعة" : "at"; - if (widget.adDetails.startdate != null) { - startDate = "${DateHelper.formatAsDayMonthYear(DateTime.parse(widget.adDetails.startdate!))} at ${DateHelper.formatAsTime(DateTime.parse(widget.adDetails.startdate!))}"; + // if (widget.adDetails.startdate != null) { + // startDate = "${DateHelper.formatAsDayMonthYear(DateTime.parse(widget.adDetails.startdate!))} at ${DateHelper.formatAsTime(DateTime.parse(widget.adDetails.startdate!))}"; + // } + // if (widget.adDetails.enddate != null) { + // endDate = "${DateHelper.formatAsDayMonthYear(DateTime.parse(widget.adDetails.enddate!))} at ${DateHelper.formatAsTime(DateTime.parse(widget.adDetails.enddate!))}"; + // } + if (widget.adDetails.startdate != null) {startDate = "${DateHelper.formatAsDayMonthYear(DateTime.parse(widget.adDetails.startdate!), + isArabic: isArabic,)} $atText ${DateHelper.formatAsTime( + DateTime.parse(widget.adDetails.startdate!), + isArabic: isArabic, + )}"; } - if (widget.adDetails.enddate != null) { - endDate = "${DateHelper.formatAsDayMonthYear(DateTime.parse(widget.adDetails.enddate!))} at ${DateHelper.formatAsTime(DateTime.parse(widget.adDetails.enddate!))}"; + if (widget.adDetails.enddate != null) {endDate = "${DateHelper.formatAsDayMonthYear(DateTime.parse(widget.adDetails.enddate!), + isArabic: isArabic,)} $atText ${DateHelper.formatAsTime( + DateTime.parse(widget.adDetails.enddate!), + isArabic: isArabic, + )}"; } return Column( children: [ diff --git a/lib/views/advertisement/components/ads_list_widget.dart b/lib/views/advertisement/components/ads_list_widget.dart index 3317ded..a38905d 100644 --- a/lib/views/advertisement/components/ads_list_widget.dart +++ b/lib/views/advertisement/components/ads_list_widget.dart @@ -153,10 +153,31 @@ class AdCard extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ - if (isAdsFragment && adDetails.adPostStatus! == AdPostStatus.sold && adDetails.statuslabel != null && adDetails.statuslabel!.isNotEmpty) ...[ - Utils.statusContainerChip(text: adDetails.statuslabel ?? "", chipColor: Utils.getChipColorByAdStatus(adDetails.adPostStatus!)), - ] else if (isAdsFragment && !context.read().isExploreAdsTapped && adDetails.statuslabel != null && adDetails.statuslabel!.isNotEmpty) ...[ - Utils.statusContainerChip(text: adDetails.statuslabel ?? "", chipColor: Utils.getChipColorByAdStatus(adDetails.adPostStatus!)), + // if (isAdsFragment && adDetails.adPostStatus! == AdPostStatus.sold && adDetails.statuslabel != null && adDetails.statuslabel!.isNotEmpty) ...[ + // Utils.statusContainerChip(text: adDetails.statuslabel ?? "", chipColor: Utils.getChipColorByAdStatus(adDetails.adPostStatus!)), + // ] else if (isAdsFragment && !context.read().isExploreAdsTapped && adDetails.statuslabel != null && adDetails.statuslabel!.isNotEmpty) ...[ + // Utils.statusContainerChip(text: adDetails.statuslabel ?? "", chipColor: Utils.getChipColorByAdStatus(adDetails.adPostStatus!)), + // ], + if (isAdsFragment && + adDetails.adPostStatus! == AdPostStatus.sold && + adDetails.statuslabel != null && + adDetails.statuslabel!.isNotEmpty) ...[ + Utils.statusContainerChip( + text: isArabic + ? (adDetails.statuslabelN ?? "") + : (adDetails.statuslabel ?? ""), + chipColor: Utils.getChipColorByAdStatus(adDetails.adPostStatus!), + ), + ] else if (isAdsFragment && + !context.read().isExploreAdsTapped && + adDetails.statuslabel != null && + adDetails.statuslabel!.isNotEmpty) ...[ + Utils.statusContainerChip( + text: isArabic + ? (adDetails.statuslabelN ?? "") + : (adDetails.statuslabel ?? ""), + chipColor: Utils.getChipColorByAdStatus(adDetails.adPostStatus!), + ), ], (adDetails.vehicle!.vehicleTitle ?? "").toText( fontSize: 16, @@ -203,7 +224,9 @@ class AdCard extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.start, children: [ (adDetails.vehicle!.cityName ?? "").toText(color: MyColors.lightTextColor), - adDetails.createdOn != null ? DateTime.parse(adDetails.createdOn!).getTimeAgo().toText(color: MyColors.lightTextColor) : const SizedBox(), + // adDetails.createdOn != null ? DateTime.parse(adDetails.createdOn!).getTimeAgo().toText(color: MyColors.lightTextColor) : const SizedBox(), + adDetails.createdOn != null + ? DateTime.parse(adDetails.createdOn!).getTimeAgo(isArabic: isArabic).toText(color: MyColors.lightTextColor) : const SizedBox(), ], ), ], diff --git a/lib/views/advertisement/select_ad_type_view.dart b/lib/views/advertisement/select_ad_type_view.dart index 06b5602..82da2fa 100644 --- a/lib/views/advertisement/select_ad_type_view.dart +++ b/lib/views/advertisement/select_ad_type_view.dart @@ -70,15 +70,16 @@ class SelectAdTypeView extends StatelessWidget { children: [ Expanded( child: Consumer(builder: (BuildContext context, AdVM adVM, Widget? child) { + final isArabic = AppState().isArabic(context); return ListView.separated( itemCount: adVM.vehicleTypes.length, itemBuilder: (BuildContext context, int index) { VehicleTypeModel vehicleTypeModel = adVM.vehicleTypes[index]; return InkWell( onTap: () async { - adVM.updateSelectionVehicleTypeId(SelectionModel(selectedId: vehicleTypeModel.id!, selectedOption: vehicleTypeModel.vehicleTypeName ?? "", errorValue: "")); + adVM.updateSelectionVehicleTypeId(SelectionModel(selectedId: vehicleTypeModel.id!, selectedOption: isArabic ? vehicleTypeModel.vehicleTypeNameN ?? "" : vehicleTypeModel.vehicleTypeName ?? "", errorValue: "")); if (adVM.isAdEditEnabled) { - adVM.autoFillSelectedVehicleAdsDetails(); + adVM.autoFillSelectedVehicleAdsDetails(context); } if (AppState().currentAppType == AppType.provider) { if (isFromExtendAd && !adVM.isAdEditEnabled) { @@ -113,7 +114,9 @@ class SelectAdTypeView extends StatelessWidget { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - vehicleTypeModel.vehicleTypeName.toString().toText(fontSize: 18), + isArabic ? vehicleTypeModel.vehicleTypeNameN.toString().toText(fontSize: 18) + : vehicleTypeModel.vehicleTypeName.toString().toText(fontSize: 18), + // vehicleTypeModel.vehicleTypeName.toString().toText(fontSize: 18), getVehicleAdTypeIcon(vehicleTypeModel.vehicleTypeEnum!), ], ), diff --git a/lib/views/user/forget_password_page.dart b/lib/views/user/forget_password_page.dart index 51d7ca5..cedaf04 100644 --- a/lib/views/user/forget_password_page.dart +++ b/lib/views/user/forget_password_page.dart @@ -15,6 +15,8 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import '../../classes/app_state.dart'; + class ForgetPasswordPage extends StatefulWidget { const ForgetPasswordPage({Key? key}) : super(key: key); @@ -133,11 +135,19 @@ class _ForgetPasswordPageState extends State { } Widget getCountry() { + bool isArabic = AppState().isArabic(context); if (_country != null) { List dropList = []; _country!.data?.forEach( (element) { - dropList.add(DropValue(element.id ?? 0, "${element.countryName ?? ""} ${element.countryCode ?? ""}", element.countryCode ?? "")); + // dropList.add(DropValue(element.id ?? 0, "${element.countryName ?? ""} ${element.countryCode ?? ""}", element.countryCode ?? "")); + dropList.add( + DropValue( + element.id ?? 0, + "${isArabic ? (element.countryNameN ?? element.countryName ?? "") : (element.countryName ?? "")} ${element.countryCode ?? ""}", + element.countryCode ?? "", + ), + ); }, ); return Padding( diff --git a/lib/views/user/login_with_password_page.dart b/lib/views/user/login_with_password_page.dart index 6144d8e..12bb75f 100644 --- a/lib/views/user/login_with_password_page.dart +++ b/lib/views/user/login_with_password_page.dart @@ -179,15 +179,48 @@ class _LoginWithPasswordState extends State { ); } + // Widget getCountry(BuildContext context) { + // if (_country != null) { + // List dropList = []; + // _country!.data?.forEach((element) { + // dropList.add(DropValue(element.id ?? 0, "${element.countryName ?? ""} ${element.countryCode ?? ""}", element.countryCode ?? "")); + // }); + // return DropdownField( + // dropdownValue: tempCountry, + // (DropValue value) { + // countryCode = value.subValue; + // tempCountry = value; + // setState(() {}); + // }, + // list: dropList, + // hint: LocaleKeys.selectCountryCode.tr(), + // ); + // } else { + // return const Center( + // child: CircularProgressIndicator(), + // ); + // } + // } + Widget getCountry(BuildContext context) { + bool isArabic = AppState().isArabic(context); + if (_country != null) { List dropList = []; + _country!.data?.forEach((element) { - dropList.add(DropValue(element.id ?? 0, "${element.countryName ?? ""} ${element.countryCode ?? ""}", element.countryCode ?? "")); + dropList.add( + DropValue( + element.id ?? 0, + "${isArabic ? (element.countryNameN ?? element.countryName ?? "") : (element.countryName ?? "")} ${element.countryCode ?? ""}", + element.countryCode ?? "", + ), + ); }); + return DropdownField( dropdownValue: tempCountry, - (DropValue value) { + (DropValue value) { countryCode = value.subValue; tempCountry = value; setState(() {});