Merge remote-tracking branch 'origin/faiz_development_common' into faiz_development_common

# Conflicts:
#	assets/langs/ar-SA.json
#	assets/langs/en-US.json
#	lib/generated/codegen_loader.g.dart
#	lib/generated/locale_keys.g.dart
aamir_dev
faizatflutter 1 year ago
commit 27c964fc1c

@ -749,6 +749,12 @@
"offerRejected": "تم رفض العرض.", "offerRejected": "تم رفض العرض.",
"offerAccepted": "تم قبول العرض.", "offerAccepted": "تم قبول العرض.",
"you": "أنتم", "you": "أنتم",
"youCannotDeactivateThisServiceRightNow": "لا يمكنك تعطيل هذه الخدمة الآن لأن لديك مواعيد معلقة لهذه الخدمة. تفاصيل آخر موعد هي:",
"done": "تم",
"notice": "إشعار",
"serviceDeactivated": "تم تعطيل الخدمة",
"totalNumberOfServices": "إجمالي عدد الخدمات:",
"noAvailableOfficesInCity": "لا توجد مكاتب متاحة في مدينتك لخدمتك.",
"searchByItem": "البحث حسب العنصر" "searchByItem": "البحث حسب العنصر"
} }

@ -747,5 +747,11 @@
"offerRejected": "Offer has been Rejected.", "offerRejected": "Offer has been Rejected.",
"offerAccepted": "Offer has been Accepted.", "offerAccepted": "Offer has been Accepted.",
"you": "You", "you": "You",
"youCannotDeactivateThisServiceRightNow": "You cannot deactivate this service right now because you have pending appointments for this service. The last appointment details are:",
"done": "Done",
"notice": "Notice",
"serviceDeactivated": "Service Deactivated",
"totalNumberOfServices": "Total number of services:",
"noAvailableOfficesInCity": "There are no available offices in your city for your service.",
"searchByItem": "Search By Item" "searchByItem": "Search By Item"
} }

@ -55,8 +55,10 @@ class ApiConsts {
static String servicesGet = "${baseUrlServices}api/ServiceProviders/Services_Get"; static String servicesGet = "${baseUrlServices}api/ServiceProviders/Services_Get";
static String serviceProviderServiceCreate = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Create"; static String serviceProviderServiceCreate = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Create";
static String serviceProviderServiceUpdate = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Update"; static String serviceProviderServiceUpdate = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Update";
static String serviceProviderServiceStatusUpdate = "${baseUrlServices}api/ServiceProviders/CategoryAndServiceDeactivateBySP";
static String getProviderServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get"; static String getProviderServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get";
static String setScheduleInactive = "${baseUrlServices}api/ServiceProviders/BranchAppointmentSchedule_IsActiveUpdate"; static String setScheduleInactive = "${baseUrlServices}api/ServiceProviders/BranchAppointmentSchedule_IsActiveUpdate";
static String serviceProviderAppointmentGetByCategoryOrService = "${baseUrlServices}api/ServiceProviders/ServiceProviderAppointment_GetByCategoryOrService";
static String serviceProviderServiceGet = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get"; static String serviceProviderServiceGet = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get";
static String branchesAndServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderDetail_Get"; static String branchesAndServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderDetail_Get";

@ -765,6 +765,13 @@ class CodegenLoader extends AssetLoader{
"offerRejected": "تم رفض العرض.", "offerRejected": "تم رفض العرض.",
"offerAccepted": "تم قبول العرض.", "offerAccepted": "تم قبول العرض.",
"you": "أنتم", "you": "أنتم",
"youCannotDeactivateThisServiceRightNow": "لا يمكنك تعطيل هذه الخدمة الآن لأن لديك مواعيد معلقة لهذه الخدمة. تفاصيل آخر موعد هي:",
"done": "تم",
"notice": "إشعار",
"serviceDeactivated": "تم تعطيل الخدمة",
"totalNumberOfServices": "إجمالي عدد الخدمات:",
"noAvailableOfficesInCity": "لا توجد مكاتب متاحة في مدينتك لخدمتك."
"you": "أنتم",
"searchByItem": "البحث حسب العنصر" "searchByItem": "البحث حسب العنصر"
}; };
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
@ -1516,6 +1523,13 @@ static const Map<String,dynamic> en_US = {
"offerRejected": "Offer has been Rejected.", "offerRejected": "Offer has been Rejected.",
"offerAccepted": "Offer has been Accepted.", "offerAccepted": "Offer has been Accepted.",
"you": "You", "you": "You",
"youCannotDeactivateThisServiceRightNow": "You cannot deactivate this service right now because you have pending appointments for this service. The last appointment details are:",
"done": "Done",
"notice": "Notice",
"serviceDeactivated": "Service Deactivated",
"totalNumberOfServices": "Total number of services:",
"noAvailableOfficesInCity": "There are no available offices in your city for your service."
"you": "You",
"searchByItem": "Search By Item" "searchByItem": "Search By Item"
}; };
static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; static const Map<String, Map<String,dynamic>> mapLocales = {"ar_SA": ar_SA, "en_US": en_US};

@ -728,6 +728,12 @@ abstract class LocaleKeys {
static const offerRejected = 'offerRejected'; static const offerRejected = 'offerRejected';
static const offerAccepted = 'offerAccepted'; static const offerAccepted = 'offerAccepted';
static const you = 'you'; static const you = 'you';
static const youCannotDeactivateThisServiceRightNow = 'youCannotDeactivateThisServiceRightNow';
static const done = 'done';
static const notice = 'notice';
static const serviceDeactivated = 'serviceDeactivated';
static const totalNumberOfServices = 'totalNumberOfServices';
static const noAvailableOfficesInCity = 'noAvailableOfficesInCity';
static const searchByItem = 'searchByItem'; static const searchByItem = 'searchByItem';
} }

@ -12,7 +12,7 @@ class SSPhotoOfficeScheduleModel {
String? areaName; String? areaName;
String? latitude; String? latitude;
String? longitude; String? longitude;
int? distanceKM; double? distanceKM;
int? totalItemsCount; int? totalItemsCount;
List<PhotoOfficeScheduleSlots>? photoOfficeScheduleSlots; List<PhotoOfficeScheduleSlots>? photoOfficeScheduleSlots;
List<CustomTimeDateSlotModel>? customTimeDateSlotList; List<CustomTimeDateSlotModel>? customTimeDateSlotList;

@ -0,0 +1,45 @@
class AppointmentBasicDetailsModel {
int? serviceSlotID;
String? slotDate;
String? startTime;
String? endTime;
int? appointmentStatusID;
String? appointmentStatusText;
int? serviceProviderID;
int? customerID;
AppointmentBasicDetailsModel({
this.serviceSlotID,
this.slotDate,
this.startTime,
this.endTime,
this.appointmentStatusID,
this.appointmentStatusText,
this.serviceProviderID,
this.customerID,
});
AppointmentBasicDetailsModel.fromJson(Map<String, dynamic> json) {
serviceSlotID = json['serviceSlotID'];
slotDate = json['slotDate'];
startTime = json['startTime'];
endTime = json['endTime'];
appointmentStatusID = json['appointmentStatusID'];
appointmentStatusText = json['appointmentStatusText'];
serviceProviderID = json['serviceProviderID'];
customerID = json['customerID'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = <String, dynamic>{};
data['serviceSlotID'] = serviceSlotID;
data['slotDate'] = slotDate;
data['startTime'] = startTime;
data['endTime'] = endTime;
data['appointmentStatusID'] = appointmentStatusID;
data['appointmentStatusText'] = appointmentStatusText;
data['serviceProviderID'] = serviceProviderID;
data['customerID'] = customerID;
return data;
}
}

@ -51,15 +51,17 @@ class CategoryData extends Equatable {
this.services, this.services,
this.branchId, this.branchId,
this.branchName, this.branchName,
this.isDeactivated,
}); });
int? id; int? id;
String? categoryName; String? categoryName;
String? categoryNameN; String? categoryNameN;
dynamic? serviceCategoryIconUrl; String? serviceCategoryIconUrl;
dynamic? serviceCategoryImageUrl; String? serviceCategoryImageUrl;
String? branchId; String? branchId;
String? branchName; String? branchName;
bool? isDeactivated;
List<ServiceModel>? services; List<ServiceModel>? services;
factory CategoryData.fromJson(Map<String, dynamic> json) => CategoryData( factory CategoryData.fromJson(Map<String, dynamic> json) => CategoryData(
@ -69,6 +71,7 @@ class CategoryData extends Equatable {
serviceCategoryIconUrl: json["serviceCategoryIconUrl"], serviceCategoryIconUrl: json["serviceCategoryIconUrl"],
serviceCategoryImageUrl: json["serviceCategoryImageUrl"], serviceCategoryImageUrl: json["serviceCategoryImageUrl"],
services: [], services: [],
isDeactivated: false,
); );
Map<String, dynamic> toJson() => { Map<String, dynamic> toJson() => {

@ -5,6 +5,8 @@ import 'package:mc_common_app/api/api_client.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependency_injection.dart'; import 'package:mc_common_app/config/dependency_injection.dart';
import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/appointments_models/appointment_basic_detail_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_detail_model.dart';
import 'package:mc_common_app/models/provider_branches_models/branch_review_model.dart'; import 'package:mc_common_app/models/provider_branches_models/branch_review_model.dart';
@ -16,6 +18,7 @@ import 'package:mc_common_app/models/provider_branches_models/provider_model.dar
import 'package:mc_common_app/models/provider_branches_models/provider_profile_model.dart'; import 'package:mc_common_app/models/provider_branches_models/provider_profile_model.dart';
import 'package:mc_common_app/models/services_models/item_model.dart'; import 'package:mc_common_app/models/services_models/item_model.dart';
import 'package:mc_common_app/models/services_models/service_model.dart'; import 'package:mc_common_app/models/services_models/service_model.dart';
import 'package:mc_common_app/utils/enums.dart';
abstract class BranchRepo { abstract class BranchRepo {
Future<GenericRespModel> createBranch({ Future<GenericRespModel> createBranch({
@ -70,6 +73,10 @@ abstract class BranchRepo {
Future<GenericRespModel> updateService(List<Map<String, dynamic>> map); Future<GenericRespModel> updateService(List<Map<String, dynamic>> map);
Future<GenericRespModel> updateServiceStatus({required int branchId, required List<int> serviceIds, required ServiceStatusEnum serviceStatusEnum});
Future<List<AppointmentBasicDetailsModel>> getAppointmentsByCategoryOrService({required int branchId, required int serviceId});
Future<GenericRespModel> getMatchedServices(int oldBranchId, int newBranchId, int categoryId); Future<GenericRespModel> getMatchedServices(int oldBranchId, int newBranchId, int categoryId);
Future<GenericRespModel> duplicateItems({required String providerBranchID, required List<int> items}); Future<GenericRespModel> duplicateItems({required String providerBranchID, required List<int> items});
@ -305,6 +312,45 @@ class BranchRepoImp implements BranchRepo {
return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceUpdate, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceUpdate, map, token: t);
} }
@override
Future<GenericRespModel> updateServiceStatus({required int branchId, required List<int> serviceIds, required ServiceStatusEnum serviceStatusEnum}) async {
List<String> ids = [];
for (var id in serviceIds) {
ids.add(id.toString());
}
int providerID = AppState().getUser.data!.userInfo!.providerId;
var map = {
"ServiceProviderID": providerID.toString(),
"ProviderBranchID": branchId.toString(),
"ProviderServiceIDs": ids,
"Status": serviceStatusEnum.getIdFromServiceStatusEnum().toString(),
};
String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceStatusUpdate, queryParameters: map, token: t);
}
@override
Future<List<AppointmentBasicDetailsModel>> getAppointmentsByCategoryOrService({required int branchId, required int serviceId}) async {
var map = {
"ProviderBranchID": branchId.toString(),
"ServiceProviderServiceID": serviceId.toString(),
};
String t = AppState().getUser.data!.accessToken ?? "";
GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json),
ApiConsts.serviceProviderAppointmentGetByCategoryOrService,
queryParameters: map,
token: t,
);
List<AppointmentBasicDetailsModel> basicAppointmentList = List.generate(genericRespModel.data.length, (index) => AppointmentBasicDetailsModel.fromJson(genericRespModel.data[index]));
return basicAppointmentList;
}
@override @override
Future<GenericRespModel> getMatchedServices(int oldBranchId, int newBranchId, int categoryId) async { Future<GenericRespModel> getMatchedServices(int oldBranchId, int newBranchId, int categoryId) async {
var postParams = { var postParams = {

@ -48,7 +48,7 @@ abstract class CommonRepo {
Future<SSCarCheckScheduleModel> getCarCheckServiceScheduleDetails({required double lat, required double long}); Future<SSCarCheckScheduleModel> getCarCheckServiceScheduleDetails({required double lat, required double long});
Future<List<SSPhotoOfficeScheduleModel>> getPhotographyServiceScheduleListByOffices({required double lat, required double long}); Future<List<SSPhotoOfficeScheduleModel>> getPhotographyServiceScheduleListByOffices({required double lat, required double long, required int cityID});
//TODO: Needs to remove common methods from AD's repo and delete all repeated methods. //TODO: Needs to remove common methods from AD's repo and delete all repeated methods.
Future<VehicleDetailsModel> getVehicleDetails({int? vehicleTypeId, int? vehicleBrandId}); Future<VehicleDetailsModel> getVehicleDetails({int? vehicleTypeId, int? vehicleBrandId});
@ -97,10 +97,11 @@ class CommonRepoImp implements CommonRepo {
} }
@override @override
Future<List<SSPhotoOfficeScheduleModel>> getPhotographyServiceScheduleListByOffices({required double lat, required double long}) async { Future<List<SSPhotoOfficeScheduleModel>> getPhotographyServiceScheduleListByOffices({required double lat, required double long, required int cityID}) async {
var params = { var params = {
"Latitude": lat.toString(), "Latitude": lat.toString(),
"Longitude": long.toString(), "Longitude": long.toString(),
"cityID": cityID.toString(),
}; };
GenericRespModel genericRespModel = await apiClient.getJsonForObject( GenericRespModel genericRespModel = await apiClient.getJsonForObject(
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,

@ -1395,8 +1395,9 @@ class AdVM extends BaseVM {
Future<void> getPhotographyServiceScheduleListByOffices({required double latitude, required double longitude, bool isNeedToRebuild = false}) async { Future<void> getPhotographyServiceScheduleListByOffices({required double latitude, required double longitude, bool isNeedToRebuild = false}) async {
if (isNeedToRebuild) setState(ViewState.busy); if (isNeedToRebuild) setState(ViewState.busy);
int cityID = AppState().getUser.data!.userInfo!.cityId ?? 1;
try { try {
photoSSSchedulesByOffices = await commonRepo.getPhotographyServiceScheduleListByOffices(lat: latitude, long: longitude); photoSSSchedulesByOffices = await commonRepo.getPhotographyServiceScheduleListByOffices(lat: latitude, long: longitude, cityID: cityID);
if (isNeedToRebuild) setState(ViewState.idle); if (isNeedToRebuild) setState(ViewState.idle);
} catch (e) { } catch (e) {
if (isNeedToRebuild) setState(ViewState.idle); if (isNeedToRebuild) setState(ViewState.idle);

@ -251,17 +251,6 @@ class AppointmentsVM extends BaseVM {
notifyListeners(); notifyListeners();
} }
// String pickedHomeLocation = "";
//
// void updatePickedHomeLocation(String value) {
// pickedHomeLocation = value;
// pickHomeLocationError = "";
// if (currentServiceSelection != null) {
// currentServiceSelection!.homeLocation = value;
// }
// notifyListeners();
// }
SelectionModel branchSelectedCategoryId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); SelectionModel branchSelectedCategoryId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
void updateProviderCategoryId(SelectionModel id) { void updateProviderCategoryId(SelectionModel id) {
@ -304,9 +293,6 @@ class AppointmentsVM extends BaseVM {
return; return;
} }
servicesInCurrentAppointment.forEach((i) {
log("hlo1: ${i.serviceDescription} ${i.servicelocationInfo.homeChargesInCurrentService}");
});
if (!(currentServiceSelection!.isAllowAppointmentHome ?? false)) { if (!(currentServiceSelection!.isAllowAppointmentHome ?? false)) {
updateIsHomeTapped(false); updateIsHomeTapped(false);
return; return;
@ -320,19 +306,8 @@ class AppointmentsVM extends BaseVM {
distanceToBranch: currentLocationInfoModel!.distanceToBranch, distanceToBranch: currentLocationInfoModel!.distanceToBranch,
homeChargesInCurrentService: double.parse(currentServiceSelection!.rangePricePerKm ?? "0.0"), homeChargesInCurrentService: double.parse(currentServiceSelection!.rangePricePerKm ?? "0.0"),
); );
// for (var service in servicesInCurrentAppointment) {
// service.servicelocationInfo.address = currentLocationInfoModel!.address;
// service.servicelocationInfo.latitude = currentLocationInfoModel!.latitude;
// service.servicelocationInfo.longitude = currentLocationInfoModel!.longitude;
// service.servicelocationInfo.distanceToBranch = currentLocationInfoModel!.distanceToBranch;
// }
} }
servicesInCurrentAppointment.forEach((i) {
log("hlo2: ${i.serviceDescription} ${i.servicelocationInfo.homeChargesInCurrentService}");
});
notifyListeners(); notifyListeners();
} }
@ -383,7 +358,7 @@ class AppointmentsVM extends BaseVM {
} }
applyFilterOnAppointmentsVM({required AppointmentStatusEnum appointmentStatusEnum, bool isNeedCustomerFilter = false}) { applyFilterOnAppointmentsVM({required AppointmentStatusEnum appointmentStatusEnum, bool isNeedCustomerFilter = false}) {
log("appointmentStatusEnum: ${appointmentStatusEnum}"); log("appointmentStatusEnum: $appointmentStatusEnum");
// isNeedCustomerFilter IS ONLY FOR THE PROVIDER APP // isNeedCustomerFilter IS ONLY FOR THE PROVIDER APP
if (appointmentsFilterOptions.isEmpty) return; if (appointmentsFilterOptions.isEmpty) return;
for (var value in appointmentsFilterOptions) { for (var value in appointmentsFilterOptions) {
@ -466,13 +441,15 @@ class AppointmentsVM extends BaseVM {
myAppointments = await appointmentRepo.getMyAppointmentsForCustomersByFilters(); myAppointments = await appointmentRepo.getMyAppointmentsForCustomersByFilters();
// myFilteredAppointments = myAppointments; // myFilteredAppointments = myAppointments;
setState(ViewState.idle);
applyFilterOnAppointmentsVM(appointmentStatusEnum: AppointmentStatusEnum.allAppointments);
myUpComingAppointments = myAppointments myUpComingAppointments = myAppointments
.where((element) => .where((element) =>
(element.appointmentStatusEnum == AppointmentStatusEnum.booked || element.appointmentStatusEnum == AppointmentStatusEnum.confirmed) && (element.appointmentStatusEnum == AppointmentStatusEnum.booked || element.appointmentStatusEnum == AppointmentStatusEnum.confirmed) &&
(DateHelper.parseStringToDate(element.appointmentDate!).isAfter(DateTime.now()))) (DateHelper.parseStringToDate(element.appointmentDate!).isAfter(DateTime.now())))
.toList(); .toList();
setState(ViewState.idle);
applyFilterOnAppointmentsVM(appointmentStatusEnum: AppointmentStatusEnum.allAppointments);
notifyListeners(); notifyListeners();
} }

@ -97,9 +97,9 @@ class ChatVM extends BaseVM {
notifyListeners(); notifyListeners();
} }
List<int> indexesForCancelSpecialCarOffer = [0, 1, 6, 10]; List<int> indexesForCancelSpecialCarOffer = [0, 1, 5, 6, 10];
List<int> indexesForCancelSparePartOffer = [2, 10]; List<int> indexesForCancelSparePartOffer = [2, 5, 10];
List<int> indexesForRejectOffer = [3, 4, 5, 10]; List<int> indexesForRejectOffer = [3, 4, 10];
List<int> indexesForDealNotCompleted = [7, 4, 8, 9, 10]; List<int> indexesForDealNotCompleted = [7, 4, 8, 9, 10];
List<OfferRequestCommentModel> offerRejectModelList = [ List<OfferRequestCommentModel> offerRejectModelList = [

@ -950,6 +950,14 @@ class RequestsVM extends BaseVM {
notifyListeners(); notifyListeners();
} }
bool isBase64String(String input) {
// This regex checks if the string is a valid Base64 string
final base64Regex = RegExp(r'^[A-Za-z0-9+/=]+$');
// Check if the string matches the Base64 pattern
return base64Regex.hasMatch(input) && (input.length % 4 == 0);
}
MessageImageModel convertFileToMessageImageModel({required ImageModel imageModel, required int offerId}) { MessageImageModel convertFileToMessageImageModel({required ImageModel imageModel, required int offerId}) {
MessageImageModel offerImages; MessageImageModel offerImages;
@ -961,15 +969,23 @@ class RequestsVM extends BaseVM {
reqOfferID: offerId, reqOfferID: offerId,
); );
} else { } else {
File file = File(imageModel.filePath!); File? file;
List<int> imageBytes = file.readAsBytesSync(); List<int> imageBytes = [];
String image = base64Encode(imageBytes); String image = '';
if (!isBase64String(imageModel.filePath!)) {
file = File(imageModel.filePath!);
imageBytes = file.readAsBytesSync();
image = base64Encode(imageBytes);
} else {
image = imageModel.filePath!;
}
offerImages = MessageImageModel( offerImages = MessageImageModel(
id: 0, id: 0,
imageStr: image, imageStr: image,
isFromNetwork: false, isFromNetwork: false,
reqOfferID: offerId, reqOfferID: offerId,
imagePath: file.path, imagePath: file?.path,
); );
} }

@ -1,4 +1,5 @@
import 'dart:convert'; import 'dart:convert';
import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
@ -6,8 +7,10 @@ import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/appointments_models/appointment_basic_detail_model.dart';
import 'package:mc_common_app/models/general_models/enums_model.dart'; import 'package:mc_common_app/models/general_models/enums_model.dart';
import 'package:mc_common_app/models/general_models/generic_resp_model.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/models/general_models/widgets_models.dart';
@ -24,12 +27,17 @@ import 'package:mc_common_app/models/user_models/country.dart';
import 'package:mc_common_app/repositories/branch_repo.dart'; import 'package:mc_common_app/repositories/branch_repo.dart';
import 'package:mc_common_app/repositories/common_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/services/common_services.dart';
import 'package:mc_common_app/theme/colors.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/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/ad_view_model.dart'; import 'package:mc_common_app/view_models/ad_view_model.dart';
import 'package:mc_common_app/view_models/base_view_model.dart'; import 'package:mc_common_app/view_models/base_view_model.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/info_bottom_sheet.dart';
import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class ServiceVM extends BaseVM { class ServiceVM extends BaseVM {
final BranchRepo branchRepo; final BranchRepo branchRepo;
@ -156,6 +164,7 @@ class ServiceVM extends BaseVM {
final BranchDetailModel currentBranch = branches!.data!.serviceProviderBranch!.firstWhere((element) => element.id == selectedBranchId); final BranchDetailModel currentBranch = branches!.data!.serviceProviderBranch!.firstWhere((element) => element.id == selectedBranchId);
for (var element in currentBranch.branchServices!) { for (var element in currentBranch.branchServices!) {
// TODO: Here , we need to add the category deactivated status.
categories.add( categories.add(
CategoryData( CategoryData(
id: element.categoryId, id: element.categoryId,
@ -201,7 +210,6 @@ class ServiceVM extends BaseVM {
} }
branchServicesFilterOptions[serviceStatusEnum.getIdFromServiceStatusEnum() - 1].isSelected = true; // -1 to match with the index branchServicesFilterOptions[serviceStatusEnum.getIdFromServiceStatusEnum() - 1].isSelected = true; // -1 to match with the index
} }
// Future<String?> selectFile(BuildContext context, int index) async { // Future<String?> selectFile(BuildContext context, int index) async {
@ -264,11 +272,7 @@ class ServiceVM extends BaseVM {
context, context,
allowMultiple: false, allowMultiple: false,
); );
if (files != null && files.any((element) => if (files != null && files.any((element) => element.path.split('.').last.toLowerCase() != 'pdf')) {
element.path
.split('.')
.last
.toLowerCase() != 'pdf')) {
Utils.showToast("Only PDF Files are allowed"); Utils.showToast("Only PDF Files are allowed");
return; return;
} }
@ -528,6 +532,92 @@ class ServiceVM extends BaseVM {
return await branchRepo.updateService(map); return await branchRepo.updateService(map);
} }
Future<List<AppointmentBasicDetailsModel>> getAppointmentsByServiceID({required BuildContext context, required int branchId, required int serviceId}) async {
try {
Utils.showLoading(context);
List<AppointmentBasicDetailsModel> appointmentList = await branchRepo.getAppointmentsByCategoryOrService(branchId: branchId, serviceId: serviceId);
// log("list: ${mResponse.}");
Utils.hideLoading(context);
return appointmentList;
} catch (e) {
Utils.hideLoading(context);
log(e.toString());
Utils.showToast(e.toString() ?? "");
return [];
}
}
Future<bool> updateServiceStatus({required BuildContext context, required ServiceStatusEnum serviceStatusEnum, required int branchId, required List<int> providerServiceIds}) async {
try {
Utils.showLoading(context);
GenericRespModel genericRespModel = await branchRepo.updateServiceStatus(branchId: branchId, serviceIds: providerServiceIds, serviceStatusEnum: serviceStatusEnum);
Utils.hideLoading(context);
Utils.showToast(genericRespModel.message ?? "");
return genericRespModel.messageStatus == 1;
} catch (e) {
Utils.hideLoading(context);
log(e.toString());
Utils.showToast(e.toString());
return false;
}
}
Future buildDealNotCompletedBottomSheetOptions({required BuildContext mainContext, required List<AppointmentBasicDetailsModel> appointments, required String branchName}) async {
return actionConfirmationBottomSheet(
isOnlyOneButton: true,
context: mainContext,
title: LocaleKeys.notice.tr().toText(fontSize: 26, isBold: true, letterSpacing: -1.44),
subtitle: LocaleKeys.youCannotDeactivateThisServiceRightNow.tr(),
checkBoxConfirmationWidget: ListView.builder(
shrinkWrap: true,
itemCount: appointments.length,
itemBuilder: (BuildContext context, int index) {
AppointmentBasicDetailsModel appointmentBasicDetailsModel = appointments[index];
return Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (appointmentBasicDetailsModel.appointmentStatusText != null && appointmentBasicDetailsModel.appointmentStatusText!.isNotEmpty) ...[
Utils.statusContainerChip(text: appointmentBasicDetailsModel.appointmentStatusText!, chipColor: MyColors.black),
],
6.height,
"${appointmentBasicDetailsModel.customerID}".toText(fontSize: 16, letterSpacing: -0.64),
showItem("${LocaleKeys.branchName.tr()}:", "${appointmentBasicDetailsModel.slotDate}"),
showItem("${LocaleKeys.date.tr()}:", "${appointmentBasicDetailsModel.slotDate}"),
showItem("${LocaleKeys.time.tr()}:", "${appointmentBasicDetailsModel.startTime} - ${appointmentBasicDetailsModel.startTime}"),
],
).toContainer(isShadowEnabled: true);
}),
actionButtonYes: Expanded(
child: ShowFillButton(
maxHeight: 55,
title: LocaleKeys.done.tr(),
fontSize: 15,
onPressed: () => Navigator.pop(mainContext),
),
),
actionButtonNo: Expanded(
child: ShowFillButton(
maxHeight: 55,
title: LocaleKeys.done.tr(),
fontSize: 15,
onPressed: () => Navigator.pop(mainContext),
),
),
);
}
Widget showItem(String title, String value) {
return Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
title.toText(color: MyColors.lightTextColor, letterSpacing: -0.48),
3.width,
Flexible(child: value.toText(isBold: true, overflow: TextOverflow.ellipsis)),
],
);
}
void updateSelectedBranchType(int status) { void updateSelectedBranchType(int status) {
selectedBranchStatus = status; selectedBranchStatus = status;
notifyListeners(); notifyListeners();
@ -657,9 +747,7 @@ class ServiceVM extends BaseVM {
File file = File(imageModel.filePath!); File file = File(imageModel.filePath!);
List<int> imageBytes = await file.readAsBytes(); List<int> imageBytes = await file.readAsBytes();
String image = base64Encode(imageBytes); String image = base64Encode(imageBytes);
String fileName = file.path String fileName = file.path.split('/').last;
.split('/')
.last;
branchPostingImages = BranchPostingImages( branchPostingImages = BranchPostingImages(
imageName: fileName, imageName: fileName,
imageStr: image, imageStr: image,

@ -293,6 +293,8 @@ class BuildAdDetailsActionButtonForMyAds extends StatelessWidget {
20.height, 20.height,
adVM.state == ViewState.busy adVM.state == ViewState.busy
? const Center(child: CircularProgressIndicator()) ? const Center(child: CircularProgressIndicator())
: adVM.photoSSSchedulesByOffices.isEmpty
? LocaleKeys.noAvailableOfficesInCity.tr().toText(fontSize: 14, height: 1.2)
: Builder( : Builder(
builder: (context) { builder: (context) {
List<DropValue> vehicleCitiesDrop = []; List<DropValue> vehicleCitiesDrop = [];
@ -300,10 +302,8 @@ class BuildAdDetailsActionButtonForMyAds extends StatelessWidget {
var element = adVM.photoSSSchedulesByOffices[i]; var element = adVM.photoSSSchedulesByOffices[i];
vehicleCitiesDrop.add(DropValue(element.photoOfficeID?.toInt() ?? 0, element.photoOfficeName ?? "", i.toString())); vehicleCitiesDrop.add(DropValue(element.photoOfficeID?.toInt() ?? 0, element.photoOfficeName ?? "", i.toString()));
} }
return DropdownField( return DropdownField(
(DropValue value) => adVM.updatePhotoOfficeSelectedId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)), (DropValue value) => adVM.updatePhotoOfficeSelectedId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)),
// here the item price is the index of the selected option
list: vehicleCitiesDrop, list: vehicleCitiesDrop,
dropdownValue: adVM.photoOfficeSelectedId.selectedId != -1 ? DropValue(adVM.photoOfficeSelectedId.selectedId, adVM.photoOfficeSelectedId.selectedOption, "") : null, dropdownValue: adVM.photoOfficeSelectedId.selectedId != -1 ? DropValue(adVM.photoOfficeSelectedId.selectedId, adVM.photoOfficeSelectedId.selectedOption, "") : null,
hint: LocaleKeys.selectOffice.tr(), hint: LocaleKeys.selectOffice.tr(),

@ -1,5 +1,5 @@
import 'dart:developer'; import 'dart:convert';
import 'dart:io'; import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
@ -33,9 +33,6 @@ class PickedFilesContainer extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
pickedFiles.forEach((i) {
log("isFromNetwork: ${i.isFromNetwork}");
});
return GridView.count( return GridView.count(
physics: const NeverScrollableScrollPhysics(), physics: const NeverScrollableScrollPhysics(),
shrinkWrap: true, shrinkWrap: true,
@ -95,8 +92,20 @@ class BuildFilesContainer extends StatelessWidget {
this.isPdf = false, this.isPdf = false,
}); });
bool isBase64String(String input) {
// This regex checks if the string is a valid Base64 string
final base64Regex = RegExp(r'^[A-Za-z0-9+/=]+$');
// Check if the string matches the Base64 pattern
return base64Regex.hasMatch(input) && (input.length % 4 == 0);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
Uint8List? bytes;
if ((image.isFromNetwork == null || image.isFromNetwork == false) && isBase64String(image.filePath ?? "")) {
bytes = (base64Decode(image.filePath!)) as Uint8List?;
}
return Stack( return Stack(
children: [ children: [
SizedBox( SizedBox(
@ -124,6 +133,13 @@ class BuildFilesContainer extends StatelessWidget {
width: 73, width: 73,
) )
.paddingAll(8) .paddingAll(8)
: isBase64String(image.filePath!)
? Image.memory(
bytes!,
fit: BoxFit.fill,
height: 72,
width: 70,
).paddingAll(8)
: image.filePath! : image.filePath!
.buildFileImage( .buildFileImage(
fit: BoxFit.fill, fit: BoxFit.fill,

@ -221,6 +221,7 @@ class _ChatViewState extends State<ChatView> {
size: 30, size: 30,
).onPress( ).onPress(
() { () {
requestVM.resetSendOfferBottomSheet();
RequestDetailPageArguments requestDetailArguments = RequestDetailPageArguments( RequestDetailPageArguments requestDetailArguments = RequestDetailPageArguments(
requestIndex: chatViewArgumentsForRequest!.requestIndex, requestIndex: chatViewArgumentsForRequest!.requestIndex,
requestModel: chatViewArgumentsForRequest!.requestModel!, requestModel: chatViewArgumentsForRequest!.requestModel!,

@ -742,13 +742,13 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
requestVM.updateIsDeliveryAvailableStatus((offer.isDeliveryAvailable ?? false)); requestVM.updateIsDeliveryAvailableStatus((offer.isDeliveryAvailable ?? false));
if (offer.reqOfferImages != null && offer.reqOfferImages!.isNotEmpty) { if (offer.reqOfferImages != null && offer.reqOfferImages!.isNotEmpty) {
for (var element in offer.reqOfferImages!) { for (var element in offer.reqOfferImages!) {
log("element: ${element.imageStr != null && element.imageStr!.isNotEmpty}");
if (element.imageUrl != null || element.imageStr != null) { if (element.imageUrl != null || element.imageStr != null) {
ImageModel imageModel = ImageModel( ImageModel imageModel = ImageModel(
id: element.id, id: element.id,
filePath: element.imageStr != null && element.imageStr!.isNotEmpty ? element.imageStr : element.imageUrl, filePath: element.imageStr != null && element.imageStr!.isNotEmpty ? element.imageStr : element.imageUrl,
isFromNetwork: element.imageStr != null && element.imageStr!.isNotEmpty ? false : true); isFromNetwork: element.imageStr != null && element.imageStr!.isNotEmpty ? false : true);
log("imageModelimageModel: ${imageModel.toString()}");
requestVM.addImageToPickedVehicleImages(imageModel); requestVM.addImageToPickedVehicleImages(imageModel);
} }
} }
@ -769,8 +769,8 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
], ],
), ),
] else if (AppState().currentAppType == AppType.provider && ] else if (AppState().currentAppType == AppType.provider &&
widget.chatMessageModel.reqOffer!.requestOfferStatusEnum == RequestOfferStatusEnum.offer &&
chatMessageTypeEnum == ChatMessageTypeEnum.offer && chatMessageTypeEnum == ChatMessageTypeEnum.offer &&
widget.chatMessageModel.reqOffer!.requestOfferStatusEnum == RequestOfferStatusEnum.offer &&
(widget.chatMessageModel.isMyMessage == true)) ...[ (widget.chatMessageModel.isMyMessage == true)) ...[
MyAssets.icEdit.buildSvg(color: MyColors.white, height: 15).onPress(() => onOfferEditIconPressed()), MyAssets.icEdit.buildSvg(color: MyColors.white, height: 15).onPress(() => onOfferEditIconPressed()),
], ],

@ -3,6 +3,7 @@ import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/requests_models/request_model.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart'; import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart';
@ -157,10 +158,24 @@ class MyRequestsFragment extends StatelessWidget {
}, },
child: RequestItem( child: RequestItem(
request: requestsVM.myFilteredRequests[index], request: requestsVM.myFilteredRequests[index],
appType: AppState().currentAppType,
requestIndex: index,
shouldShowStatuses: AppState().currentAppType == AppType.customer, shouldShowStatuses: AppState().currentAppType == AppType.customer,
), onTap: () async {
RequestModel request = requestsVM.myFilteredRequests[index];
requestsVM.updateCurrentSelectedRequest(request);
if (request.requestStatus == RequestStatusEnum.pending ||
request.requestStatus == RequestStatusEnum.cancelled ||
request.requestStatus == RequestStatusEnum.expired) {
return;
}
if (AppState().currentAppType == AppType.provider) {
RequestDetailPageArguments requestDetailPageArguments = RequestDetailPageArguments(requestIndex: index, requestModel: request);
navigateWithName(context, AppRoutes.requestsDetailPage, arguments: requestDetailPageArguments);
} else {
requestsVM.myFilteredRequests[index].offerCount = 0;
requestsVM.notifyListeners();
navigateWithName(context, AppRoutes.offersListPage, arguments: request.id);
}
}),
); );
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {

@ -80,6 +80,7 @@ class _OfferListPageState extends State<OfferListPage> {
fontSize: 16, fontSize: 16,
isBold: true, isBold: true,
), ),
if (offersModel.offerCount != null && offersModel.offerCount! > 0) ...[
Center( Center(
child: "${offersModel.offerCount}".toText( child: "${offersModel.offerCount}".toText(
color: Colors.white, color: Colors.white,
@ -94,6 +95,7 @@ class _OfferListPageState extends State<OfferListPage> {
height: 22, height: 22,
), ),
], ],
],
), ),
8.height, 8.height,
Row( Row(
@ -137,7 +139,10 @@ class _OfferListPageState extends State<OfferListPage> {
requestId: widget.requestId, requestId: widget.requestId,
providerOfferIndex: index, providerOfferIndex: index,
) )
.whenComplete(() => navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments)); .whenComplete(() {
chatVM.serviceProviderOffersList[index].offerCount = 0;
navigateWithName(context, AppRoutes.chatView, arguments: chatViewArguments);
});
}).toContainer(isShadowEnabled: true); }).toContainer(isShadowEnabled: true);
}, },
separatorBuilder: (context, index) => 16.height, separatorBuilder: (context, index) => 16.height,

@ -2,27 +2,22 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/requests_models/request_model.dart'; import 'package:mc_common_app/models/requests_models/request_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/enums.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/utils/utils.dart';
import 'package:mc_common_app/view_models/chat_view_model.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
class RequestItem extends StatelessWidget { class RequestItem extends StatelessWidget {
final RequestModel request; final RequestModel request;
final AppType appType;
final int requestIndex;
final bool shouldShowStatuses; final bool shouldShowStatuses;
final Function() onTap;
const RequestItem({super.key, required this.request, required this.appType, required this.requestIndex, this.shouldShowStatuses = true}); const RequestItem({super.key, required this.request, this.shouldShowStatuses = true, required this.onTap});
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
@ -65,7 +60,7 @@ class RequestItem extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.end, crossAxisAlignment: CrossAxisAlignment.end,
children: [ children: [
if (request.offerCount > 0 && appType == AppType.customer && request.requestStatus == RequestStatusEnum.submitted) ...[ if (request.offerCount > 0 && AppState().currentAppType == AppType.customer && request.requestStatus == RequestStatusEnum.submitted) ...[
Center( Center(
child: "${request.offerCount}".toText( child: "${request.offerCount}".toText(
color: Colors.white, color: Colors.white,
@ -112,17 +107,7 @@ class RequestItem extends StatelessWidget {
// ), // ),
], ],
).toContainer(isShadowEnabled: true).onPress(() async { ).toContainer(isShadowEnabled: true).onPress(() async {
RequestsVM requestsVM = context.read<RequestsVM>(); onTap();
requestsVM.updateCurrentSelectedRequest(request);
if (request.requestStatus == RequestStatusEnum.pending || request.requestStatus == RequestStatusEnum.cancelled || request.requestStatus == RequestStatusEnum.expired) {
return;
}
if (appType == AppType.provider) {
RequestDetailPageArguments requestDetailPageArguments = RequestDetailPageArguments(requestIndex: requestIndex, requestModel: request);
navigateWithName(context, AppRoutes.requestsDetailPage, arguments: requestDetailPageArguments);
} else {
navigateWithName(context, AppRoutes.offersListPage, arguments: request.id);
}
}); });
} }

@ -5,6 +5,7 @@ import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/requests_models/request_model.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart'; import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/requests_view_model.dart'; import 'package:mc_common_app/view_models/requests_view_model.dart';
@ -80,7 +81,24 @@ class _ProviderAcceptedRequestsViewState extends State<ProviderAcceptedRequestsV
) )
: ListView.separated( : ListView.separated(
itemBuilder: (context, index) { itemBuilder: (context, index) {
return RequestItem(request: requestsVM.providersAcceptedRequestsList[index], appType: AppState().currentAppType, requestIndex: index); return RequestItem(
request: requestsVM.providersAcceptedRequestsList[index],
onTap: () async {
RequestModel request = requestsVM.myFilteredRequests[index];
requestsVM.updateCurrentSelectedRequest(request);
if (request.requestStatus == RequestStatusEnum.pending ||
request.requestStatus == RequestStatusEnum.cancelled ||
request.requestStatus == RequestStatusEnum.expired) {
return;
}
if (AppState().currentAppType == AppType.provider) {
RequestDetailPageArguments requestDetailPageArguments = RequestDetailPageArguments(requestIndex: index, requestModel: request);
navigateWithName(context, AppRoutes.requestsDetailPage, arguments: requestDetailPageArguments);
} else {
navigateWithName(context, AppRoutes.offersListPage, arguments: request.id);
}
},
);
}, },
separatorBuilder: (context, index) { separatorBuilder: (context, index) {
return 16.height; return 16.height;

@ -57,14 +57,6 @@ class CustomSettingOptionsTile extends StatelessWidget {
), ),
isForLanguage isForLanguage
? LocaleKeys.english.tr().toText(fontSize: 12, isUnderLine: true, color: MyColors.primaryColor) ? LocaleKeys.english.tr().toText(fontSize: 12, isUnderLine: true, color: MyColors.primaryColor)
// const Icon(
// Icons.language,
// size: 18,
// color: MyColors.primaryColor,
// )
//
: showTrailingArrow : showTrailingArrow
? const Icon(Icons.arrow_forward, size: 18) ? const Icon(Icons.arrow_forward, size: 18)
: const SizedBox() : const SizedBox()

Loading…
Cancel
Save