Merge branch 'aamir_dev' into faiz_development_common

localization_aamir
Faiz Hashmi 2 years ago
commit 08cb3f4a85

@ -47,6 +47,7 @@ class ApiConsts {
static String ServiceProviderService_Create = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Create"; static String ServiceProviderService_Create = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Create";
static String ServiceProviderService_Update = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Update"; static String ServiceProviderService_Update = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Update";
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 ServiceProviderService_Get = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get"; static String ServiceProviderService_Get = "${baseUrlServices}api/ServiceProviders/ServiceProviderService_Get";
static String BranchesAndServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderDetail_Get"; static String BranchesAndServices = "${baseUrlServices}api/ServiceProviders/ServiceProviderDetail_Get";

@ -6,15 +6,9 @@ class AdsDurationModel {
int? countryID; int? countryID;
bool? isActive; bool? isActive;
String? countryName; String? countryName;
bool? isSelected;
AdsDurationModel( AdsDurationModel({this.id, this.name, this.days, this.price, this.countryID, this.isActive, this.countryName, this.isSelected});
{this.id,
this.name,
this.days,
this.price,
this.countryID,
this.isActive,
this.countryName});
AdsDurationModel.fromJson(Map<String, dynamic> json) { AdsDurationModel.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@ -24,6 +18,7 @@ class AdsDurationModel {
countryID = json['countryID']; countryID = json['countryID'];
isActive = json['isActive']; isActive = json['isActive'];
countryName = json['countryName']; countryName = json['countryName'];
isSelected = false;
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {

@ -60,6 +60,7 @@ class VehicleTypeModel {
String? vehicleTypeNameN; String? vehicleTypeNameN;
bool? isActive; bool? isActive;
VehicleType? vehicleTypeEnum; VehicleType? vehicleTypeEnum;
bool? isSelected;
VehicleTypeModel({ VehicleTypeModel({
this.id, this.id,
@ -67,6 +68,8 @@ class VehicleTypeModel {
this.vehicleTypeNameN, this.vehicleTypeNameN,
this.isActive, this.isActive,
this.vehicleTypeEnum = VehicleType.car, this.vehicleTypeEnum = VehicleType.car,
this.isSelected,
}); });
VehicleTypeModel.fromJson(Map<String, dynamic> json) { VehicleTypeModel.fromJson(Map<String, dynamic> json) {
@ -75,6 +78,7 @@ class VehicleTypeModel {
vehicleTypeNameN = json['vehicleTypeNameN']; vehicleTypeNameN = json['vehicleTypeNameN'];
isActive = json['isActive']; isActive = json['isActive'];
vehicleTypeEnum = (json['id'] as int).toVehicleTypeEnum(); vehicleTypeEnum = (json['id'] as int).toVehicleTypeEnum();
isSelected = false;
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {
@ -450,8 +454,9 @@ class VehicleBrandsModel {
String? vehicleBrandDescription; String? vehicleBrandDescription;
String? vehicleBrandDescriptionN; String? vehicleBrandDescriptionN;
bool? isActive; bool? isActive;
bool? isSelected;
VehicleBrandsModel({this.id, this.vehicleType, this.vehicleTypeVal, this.vehicleBrandDescription, this.vehicleBrandDescriptionN, this.isActive}); VehicleBrandsModel({this.id, this.vehicleType, this.vehicleTypeVal, this.vehicleBrandDescription, this.vehicleBrandDescriptionN, this.isActive, this.isSelected});
VehicleBrandsModel.fromJson(Map<String, dynamic> json) { VehicleBrandsModel.fromJson(Map<String, dynamic> json) {
id = json['id']; id = json['id'];
@ -460,6 +465,7 @@ class VehicleBrandsModel {
vehicleBrandDescription = json['vehicleBrand_Description']; vehicleBrandDescription = json['vehicleBrand_Description'];
vehicleBrandDescriptionN = json['vehicleBrand_DescriptionN']; vehicleBrandDescriptionN = json['vehicleBrand_DescriptionN'];
isActive = json['isActive']; isActive = json['isActive'];
isSelected = false;
} }
Map<String, dynamic> toJson() { Map<String, dynamic> toJson() {

@ -58,6 +58,7 @@ class ScheduleData {
final List<ServiceModel>? scheduleServices; final List<ServiceModel>? scheduleServices;
final List<ServiceModel>? selectedServices; final List<ServiceModel>? selectedServices;
String branchId; String branchId;
int? appointmentType;
ScheduleData({ ScheduleData({
this.id, this.id,
@ -77,6 +78,7 @@ class ScheduleData {
this.scheduleServices, this.scheduleServices,
this.selectedServices, this.selectedServices,
this.branchId = "", this.branchId = "",
this.appointmentType
}); });
factory ScheduleData.fromJson(Map<String, dynamic> json) => factory ScheduleData.fromJson(Map<String, dynamic> json) =>
@ -94,6 +96,7 @@ class ScheduleData {
address: json["address"], address: json["address"],
latitude: json["latitude"], latitude: json["latitude"],
longitude: json["longitude"], longitude: json["longitude"],
appointmentType: json["appointmentType"] == null ? null : json["appointmentType"],
weeklyOffDays: json["weeklyOffDays"] == null ? [] : List<WeeklyOffDay>.from(json["weeklyOffDays"]!.map((x) => WeeklyOffDay.fromJson(x))), weeklyOffDays: json["weeklyOffDays"] == null ? [] : List<WeeklyOffDay>.from(json["weeklyOffDays"]!.map((x) => WeeklyOffDay.fromJson(x))),
scheduleServices: json["scheduleServices"] == null ? [] : List<ServiceModel>.from(json["scheduleServices"]!.map((x) => ServiceModel.fromJson(x))), scheduleServices: json["scheduleServices"] == null ? [] : List<ServiceModel>.from(json["scheduleServices"]!.map((x) => ServiceModel.fromJson(x))),
selectedServices: [], selectedServices: [],
@ -114,6 +117,7 @@ class ScheduleData {
"address": address, "address": address,
"latitude": latitude, "latitude": latitude,
"longitude": longitude, "longitude": longitude,
"appointmentType": appointmentType,
"scheduleServices": scheduleServices == null ? [] : List<dynamic>.from(scheduleServices!.map((x) => x.toJson())), "scheduleServices": scheduleServices == null ? [] : List<dynamic>.from(scheduleServices!.map((x) => x.toJson())),
}; };

@ -55,7 +55,7 @@ class ServicesData {
String? descriptionN; String? descriptionN;
dynamic? serviceIconUrl; dynamic? serviceIconUrl;
dynamic? serviceImageUrl; dynamic? serviceImageUrl;
int? serviceCategoryId; dynamic? serviceCategoryId;
dynamic? categoryName; dynamic? categoryName;
bool? isSelected; bool? isSelected;

@ -111,9 +111,9 @@ class BranchRepoImp implements BranchRepo {
@override @override
Future<Services> fetchServicesByCategoryId({required int serviceCategoryId}) async { Future<Services> fetchServicesByCategoryId({required int serviceCategoryId}) async {
var postParams = {"ServiceCategoryID": serviceCategoryId}; var postParams = {"ServiceCategoryID": serviceCategoryId.toString()};
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: serviceCategoryId != -1 ? postParams : null, token: t); return await apiClient.getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: serviceCategoryId.toString() != "-1" ? postParams : null, token: t);
} }
@override @override

@ -18,6 +18,8 @@ abstract class ScheduleRepo {
Future<Schedule> getSchedules(String branchId); Future<Schedule> getSchedules(String branchId);
Future<MResponse> updateServicesInSchedule(Map map); Future<MResponse> updateServicesInSchedule(Map map);
Future<MResponse> setScheduleInActive(int scheduleId, int branchId);
} }
class ScheduleRepoImp implements ScheduleRepo { class ScheduleRepoImp implements ScheduleRepo {
@ -47,6 +49,17 @@ class ScheduleRepoImp implements ScheduleRepo {
return await injector.get<ApiClient>().getJsonForObject((json) => Schedule.fromJson(json), ApiConsts.getSchedule, token: t, queryParameters: map); return await injector.get<ApiClient>().getJsonForObject((json) => Schedule.fromJson(json), ApiConsts.getSchedule, token: t, queryParameters: map);
} }
@override
Future<MResponse> setScheduleInActive(int scheduleId, int branchId) async {
Map<String, dynamic> map = {
"id": scheduleId,
"serviceProviderBranchID": branchId,
"isActive": false,
};
String t = AppState().getUser.data!.accessToken ?? "";
return injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.setScheduleInactive, token: t, map);
}
@override @override
Future<MResponse> updateSchedule(Map map) async { Future<MResponse> updateSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";

@ -1,7 +1,12 @@
import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:huawei_fido/huawei_fido.dart';
import 'package:local_auth/local_auth.dart'; import 'package:local_auth/local_auth.dart';
import 'package:local_auth_android/local_auth_android.dart'; import 'package:local_auth_android/local_auth_android.dart';
import 'package:local_auth_ios/local_auth_ios.dart'; import 'package:local_auth_darwin/types/auth_messages_ios.dart';
import 'package:mc_common_app/main.dart';
abstract class CommonAuthServices { abstract class CommonAuthServices {
Future<bool> authenticate(); Future<bool> authenticate();
@ -53,4 +58,12 @@ class CommonAuthImp implements CommonAuthServices {
Future<List<BiometricType>> getAvailBio() async { Future<List<BiometricType>> getAvailBio() async {
return await localAuth.getAvailableBiometrics(); return await localAuth.getAvailableBiometrics();
} }
Future<void> getHuaweiAuth() async {
DeviceInfoPlugin deviceInfo = DeviceInfoPlugin();
AndroidDeviceInfo androidInfo = await deviceInfo.androidInfo;
// if (androidInfo.brand == "HUAWEI") {
// huawei.canAuth();
// }
}
} }

@ -1,4 +1,5 @@
import 'dart:developer'; import 'dart:developer';
import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -66,16 +67,22 @@ class AppPermissions {
message: "You need to give storage permission to select files.", message: "You need to give storage permission to select files.",
onTap: () { onTap: () {
Navigator.pop(context); Navigator.pop(context);
openAppSettings();
}, },
), ),
); );
} }
Future<int> getAndroidDeviceInfo() async {
AndroidDeviceInfo deviceInfo = await DeviceInfoPlugin().androidInfo;
return deviceInfo.version.sdkInt;
}
static Future<bool> checkStoragePermissions(BuildContext context) async { static Future<bool> checkStoragePermissions(BuildContext context) async {
bool permissionStatus; bool permissionStatus;
final deviceInfo = await DeviceInfoPlugin().androidInfo; final deviceInfo = await DeviceInfoPlugin().androidInfo;
if (deviceInfo.version.sdkInt! > 32) { if (deviceInfo.version.sdkInt > 32) {
permissionStatus = await Permission.photos.request().isGranted; permissionStatus = await Permission.photos.request().isGranted;
if (permissionStatus) { if (permissionStatus) {
return true; return true;
@ -89,7 +96,6 @@ class AppPermissions {
return true; return true;
} else { } else {
getDialog(context); getDialog(context);
return false; return false;
} }
} }

@ -6,6 +6,7 @@ import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/dependencies.dart'; import 'package:mc_common_app/config/dependencies.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/models/advertisment_models/ads_bank_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ads_bank_details_model.dart';
import 'package:mc_common_app/models/advertisment_models/ads_duration_model.dart'; import 'package:mc_common_app/models/advertisment_models/ads_duration_model.dart';
@ -69,6 +70,9 @@ class AdVM extends BaseVM {
String adReservePriceError = ""; String adReservePriceError = "";
String adPhoneNumberError = ""; String adPhoneNumberError = "";
// Edit Variables Amir
bool isAdEdit = false;
List<AdDetailsModel> exploreAds = []; List<AdDetailsModel> exploreAds = [];
List<AdDetailsModel> exploreAdsFilteredList = []; List<AdDetailsModel> exploreAdsFilteredList = [];
List<AdDetailsModel> myAdsFilteredList = []; List<AdDetailsModel> myAdsFilteredList = [];
@ -1593,8 +1597,83 @@ class AdVM extends BaseVM {
applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds); applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds);
setState(ViewState.idle); setState(ViewState.idle);
} }
///// Edit Work Amir
void editUpdateAd(BuildContext context, AdDetailsModel previousDetails) {
isAdEdit = true;
navigateWithName(context, AppRoutes.selectAdTypeView, arguments: AppState().currentAppType == AppType.provider ? true : false);
checkVehicleStep1(previousDetails);
checkVehicleStep2(previousDetails);
}
void clearEditValues() {
isAdEdit = false;
if (vehicleTypes.isNotEmpty) vehicleTypes.unselectAll();
if (vehicleAdsDurations.isNotEmpty) vehicleAdsDurations.unselectAll();
}
checkVehicleStep1(AdDetailsModel previousDetails) {
logger.d("Step 1");
if (vehicleTypes.isNotEmpty) {
for (var vehicle in vehicleTypes) {
if (vehicle.id == previousDetails.vehicle?.vehicleType) {
vehicle.isSelected = true;
break;
}
}
}
notifyListeners();
}
checkVehicleStep2(AdDetailsModel previousDetails) {
logger.d("Step 2");
if (vehicleAdsDurations.isNotEmpty) {
for (var adsDuration in vehicleAdsDurations) {
if (adsDuration.price == previousDetails.adsDurationPrice) {
adsDuration.isSelected = true;
break;
}
}
}
notifyListeners();
}
checkVehicleStep3(AdDetailsModel previousDetails) {
logger.d("Step 3");
if (vehicleBrands.isNotEmpty) {
for (var vBrands in vehicleBrands) {
if (vBrands.id == previousDetails.vehicle.) {
// BrandsId need to be matched here.
vBrands.isSelected = true;
break;
}
}
}
notifyListeners();
}
updateValues() {
if (isAdEdit) {
if (vehicleTypes.isNotEmpty) vehicleTypes.unselectAll();
if (vehicleAdsDurations.isNotEmpty) vehicleAdsDurations.unselectAll();
notifyListeners();
}
}
} }
extension ToggleSelected on List {
void unselectAll() {
for (var element in this) {
if (element.isSelected!) {
element.isSelected = false;
}
}
}
}
// Edit Work End Amir
class VehicleDamageCard { class VehicleDamageCard {
List<File>? partImages; List<File>? partImages;
SelectionModel? partSelectedId; SelectionModel? partSelectedId;

@ -1,9 +1,11 @@
import 'dart:convert'; import 'dart:convert';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:http/http.dart'; import 'package:http/http.dart';
import 'package:huawei_fido/huawei_fido.dart';
import 'package:local_auth/local_auth.dart'; import 'package:local_auth/local_auth.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';
@ -331,7 +333,47 @@ class UserVM extends BaseVM {
} }
} }
Future<void> performBasicOtpLoginSelectionPage(BuildContext context, {required String userToken, required AppType appType}) async { Future<void> performBasicOtpLoginSelectionPage(BuildContext context, {required String userToken, required AppType appType, String? loginType}) async {
if (loginType == "3" || loginType == "4") {
Utils.showLoading(context);
LoginPasswordRespModel user = await userRepo.loginV2OTP(userToken, loginType!);
Utils.hideLoading(context);
if (user.messageStatus == 1) {
Utils.showLoading(context);
Response response2 = await userRepo.loginV2OTPVerify(user.data!.userToken ?? "", "9999");
Utils.hideLoading(context);
RegisterUserRespModel verifiedUser = RegisterUserRespModel.fromJson(jsonDecode(response2.body));
if (verifiedUser.messageStatus == 1) {
User user = User.fromJson(jsonDecode(response2.body));
if (appType == AppType.provider) {
if (user.data!.userInfo!.roleId == 5 || user.data!.userInfo!.roleId == 6) {
AppState().setUser = user;
SharedPrefManager.setUserToken(user.data!.accessToken ?? "");
SharedPrefManager.setUserId(user.data!.userInfo!.userId ?? "");
SharedPrefManager.setRefreshToken(user.data!.refreshToken ?? "");
SharedPrefManager.setData(jsonEncode(user.data!.userInfo!.toJson()));
navigateReplaceWithName(context, AppRoutes.dashboard);
} else {
Utils.showToast("LocaleKeys.onlyProviderApp.tr()");
//("Sorry, Only Customer's can log in this app");
}
} else if (user.data!.userInfo!.roleId == 4) {
if (user.data!.userInfo!.roleId == 4) {
AppState().setUser = user;
SharedPrefManager.setUserToken(user.data!.accessToken ?? "");
SharedPrefManager.setUserId(user.data!.userInfo!.userId ?? "");
SharedPrefManager.setRefreshToken(user.data!.refreshToken ?? "");
SharedPrefManager.setData(jsonEncode(user.data!.userInfo!.toJson()));
navigateReplaceWithName(context, AppRoutes.dashboard);
} else {
Utils.showToast("Sorry, Only Customer's can log in this app");
}
}
} else {
Utils.showToast(verifiedUser.message ?? "");
}
}
} else {
Utils.showLoading(context); Utils.showLoading(context);
LoginPasswordRespModel user = await userRepo.loginV2OTP(userToken, "1"); LoginPasswordRespModel user = await userRepo.loginV2OTP(userToken, "1");
Utils.hideLoading(context); Utils.hideLoading(context);
@ -378,6 +420,7 @@ class UserVM extends BaseVM {
Utils.showToast(user.message ?? ""); Utils.showToast(user.message ?? "");
} }
} }
}
Future<String> performApiCallLoginVerificationPage(BuildContext context) async { Future<String> performApiCallLoginVerificationPage(BuildContext context) async {
String userToken = ""; String userToken = "";
@ -515,10 +558,15 @@ class UserVM extends BaseVM {
// Aamir Code // Aamir Code
List<BiometricType>? availBio; List<BiometricType>? availBio;
Future<void> verifiyAuth({BuildContext? context, String? userToken, AppType? apptype}) async { Future<void> verifiyAuth({
BuildContext? context,
String? userToken,
AppType? apptype,
String? loginType,
}) async {
bool auth = await CommonAuthImp().authenticate(); bool auth = await CommonAuthImp().authenticate();
if (auth) { if (auth) {
performBasicOtpLoginSelectionPage(context!, userToken: userToken!, appType: apptype!); performBasicOtpLoginSelectionPage(context!, userToken: userToken!, appType: apptype!, loginType: loginType);
} }
} }
@ -527,7 +575,6 @@ class UserVM extends BaseVM {
} }
bool isBioAvailable(BiometricType bioType) { bool isBioAvailable(BiometricType bioType) {
logger.d(availBio);
if (availBio == null) return true; if (availBio == null) return true;
if (availBio!.contains(bioType)) { if (availBio!.contains(bioType)) {
return false; return false;

@ -70,7 +70,14 @@ class AdDurationSelectionSheetContent extends StatelessWidget {
), ),
), ),
], ],
).toWhiteContainer(width: double.infinity, allPading: 12, isBorderRequired: adDuration.id == adVM.vehicleAdDurationId.selectedId ? true : false), ).toWhiteContainer(
width: double.infinity,
allPading: 12,
isBorderRequired: adDuration.isSelected!
? true
: adDuration.id == adVM.vehicleAdDurationId.selectedId
? true
: false),
).onPress(() { ).onPress(() {
if (isFromExtendAd) { if (isFromExtendAd) {
adVM.updateVehicleExtendAdDurationId( adVM.updateVehicleExtendAdDurationId(
@ -89,6 +96,7 @@ class AdDurationSelectionSheetContent extends StatelessWidget {
itemPrice: adDuration.price!.toInt().toString(), itemPrice: adDuration.price!.toInt().toString(),
), ),
); );
adVM.updateValues();
}); });
}, },
separatorBuilder: (BuildContext context, int index) { separatorBuilder: (BuildContext context, int index) {

@ -1,4 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -6,6 +7,7 @@ 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/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/main.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/models/advertisment_models/ads_bank_details_model.dart'; import 'package:mc_common_app/models/advertisment_models/ads_bank_details_model.dart';
import 'package:mc_common_app/models/advertisment_models/special_service_model.dart'; import 'package:mc_common_app/models/advertisment_models/special_service_model.dart';
@ -31,6 +33,7 @@ import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
import 'package:sizer/sizer.dart';
class AdsDetailView extends StatefulWidget { class AdsDetailView extends StatefulWidget {
final AdDetailsModel adDetails; final AdDetailsModel adDetails;
@ -90,9 +93,14 @@ class _AdsDetailViewState extends State<AdsDetailView> {
); );
} }
void editAd() {
AdVM adVM = context.read<AdVM>();
adVM.editUpdateAd(context, widget.adDetails);
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
log("ad: ${widget.adDetails.id}"); log("ad: ${widget.adDetails.vehicle!.image!.first.imageUrl}");
return Scaffold( return Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(
title: "Ads", title: "Ads",
@ -130,6 +138,7 @@ class _AdsDetailViewState extends State<AdsDetailView> {
children: [ children: [
Expanded( Expanded(
child: ListView( child: ListView(
shrinkWrap: true,
children: [ children: [
Column( Column(
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -258,7 +267,44 @@ class _AdsDetailViewState extends State<AdsDetailView> {
).toWhiteContainer(width: double.infinity, allPading: 12); ).toWhiteContainer(width: double.infinity, allPading: 12);
} }
return const SizedBox.shrink(); return const SizedBox.shrink();
}) }),
12.height,
if (widget.adDetails.adPostStatus == AdPostStatus.rejected)
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
"Rejection Comments".toText(fontSize: 18, isBold: true, color: MyColors.lightTextColor),
Row(
children: [
Icon(
Icons.edit,
size: 15,
),
2.width,
"Edit Add".toText(fontSize: 10, isBold: true),
],
).onPress(() {
logger.i(widget.adDetails);
editAd();
}),
],
).paddingOnly(bottom: 5),
Row(
children: [
(widget.adDetails.comment ?? "").toText(
color: MyColors.redColor,
fontSize: 12,
isItalic: true,
),
],
),
],
).toWhiteContainer(width: double.infinity, allPading: 12),
], ],
), ),
), ),
@ -1201,6 +1247,7 @@ class BuildAdDetailsActionButtonForMyAds extends StatelessWidget {
case AdPostStatus.buyingService: case AdPostStatus.buyingService:
case AdPostStatus.reserveCancel: case AdPostStatus.reserveCancel:
case AdPostStatus.rejected: case AdPostStatus.rejected:
return pendingForReviewAction(pendingText: "Rejected form admin");
case AdPostStatus.cancelled: case AdPostStatus.cancelled:
case AdPostStatus.pendingForPost: case AdPostStatus.pendingForPost:
return pendingForReviewAction(pendingText: "Waiting for admin to post"); return pendingForReviewAction(pendingText: "Waiting for admin to post");

@ -34,7 +34,7 @@ class _CreateAdViewState extends State<CreateAdView> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(
title: "Create Ad", title: adVM.isAdEdit ? "Update Ad": "Create Ad",
isRemoveBackButton: false, isRemoveBackButton: false,
isDrawerEnabled: false, isDrawerEnabled: false,
onBackButtonTapped: () => adVM.onBackButtonPressed(context), onBackButtonTapped: () => adVM.onBackButtonPressed(context),

@ -3,6 +3,7 @@ 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/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/main.dart';
import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart'; import 'package:mc_common_app/models/advertisment_models/vehicle_details_models.dart';
import 'package:mc_common_app/models/general_models/widgets_models.dart'; import 'package:mc_common_app/models/general_models/widgets_models.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
@ -38,9 +39,35 @@ class SelectAdTypeView extends StatelessWidget {
} }
} }
// bool checkSelection(VehicleTypeModel vtype, AdVM adVM) {
// bool value = false;
// if (adVM.vehicleTypes.isNotEmpty) {
// for (var vehicle in adVM.vehicleTypes) {
// if (vtype.id == adVM.previousADDetails?.vehicle?.vehicleType) {
// value = true;
// break;
// }
// }
// }
// return value;
// }
//
// clearAll(BuildContext context) {
// AdVM adVM = context.read<AdVM>();
// adVM.clearEditValues();
// }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Scaffold( return WillPopScope(
onWillPop: () async {
logger.d("Clead All Values");
// clearAll(context);
AdVM adVM = context.read<AdVM>();
adVM.clearEditValues();
return true;
},
child: Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(
title: "Select Ad Type", title: "Select Ad Type",
profileImageUrl: MyAssets.bnCar, profileImageUrl: MyAssets.bnCar,
@ -60,7 +87,6 @@ class SelectAdTypeView extends StatelessWidget {
adVM.updateSelectionVehicleTypeId( adVM.updateSelectionVehicleTypeId(
SelectionModel(selectedId: vehicleTypeModel.id!, selectedOption: vehicleTypeModel.vehicleTypeName ?? "", errorValue: ""), SelectionModel(selectedId: vehicleTypeModel.id!, selectedOption: vehicleTypeModel.vehicleTypeName ?? "", errorValue: ""),
); );
showMyBottomSheet(context, child: const AdDurationSelectionSheetContent(isUpdateAdSelected: false, isFromExtendAd: false)); showMyBottomSheet(context, child: const AdDurationSelectionSheetContent(isUpdateAdSelected: false, isFromExtendAd: false));
}, },
child: SizedBox( child: SizedBox(
@ -115,7 +141,7 @@ class SelectAdTypeView extends StatelessWidget {
), ),
], ],
), ),
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.symmetric(horizontal: 20, vertical: 10)), ).toWhiteContainer(width: double.infinity, isBorderRequired: vehicleTypeModel.isSelected! ? true : false, pading: const EdgeInsets.symmetric(horizontal: 20, vertical: 10)),
); );
}, },
separatorBuilder: (BuildContext context, int index) { separatorBuilder: (BuildContext context, int index) {
@ -161,6 +187,7 @@ class SelectAdTypeView extends StatelessWidget {
] ]
], ],
), ),
),
); );
} }
} }

@ -54,12 +54,12 @@ class _LoginMethodSelectionPageState extends State<LoginMethodSelectionPage> {
Expanded( Expanded(
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
userVM.verifiyAuth(context: context, userToken: widget.userToken, apptype: appState.currentAppType); userVM.verifiyAuth(context: context, userToken: widget.userToken, apptype: appState.currentAppType, loginType: "3" );
//userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken,appType: appState.currentAppType); //userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken,appType: appState.currentAppType);
}, },
title: LocaleKeys.fingerPrint.tr(), title: LocaleKeys.fingerPrint.tr(),
icon: MyAssets.icFingerprintSvg, icon: MyAssets.icFingerprintSvg,
isDisabled: userVM.isBioAvailable(Platform.isAndroid ? BiometricType.weak : BiometricType.fingerprint), isDisabled: userVM.isBioAvailable(Platform.isAndroid ? BiometricType.weak : BiometricType.fingerprint, ),
), ),
), ),
20.width, 20.width,
@ -67,7 +67,7 @@ class _LoginMethodSelectionPageState extends State<LoginMethodSelectionPage> {
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
// userVM.performBasicOtpLoginSelectionPage(context, userToken: widget.userToken, appType: appState.currentAppType); // userVM.performBasicOtpLoginSelectionPage(context, userToken: widget.userToken, appType: appState.currentAppType);
userVM.verifiyAuth(context: context, userToken: widget.userToken, apptype: appState.currentAppType); userVM.verifiyAuth(context: context, userToken: widget.userToken, apptype: appState.currentAppType, loginType: "4" );
}, },
title: LocaleKeys.faceRecognition.tr(), title: LocaleKeys.faceRecognition.tr(),
icon: MyAssets.icFace, icon: MyAssets.icFace,
@ -82,7 +82,7 @@ class _LoginMethodSelectionPageState extends State<LoginMethodSelectionPage> {
Expanded( Expanded(
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
userVM.performBasicOtpLoginSelectionPage(context, userToken: widget.userToken, appType: appState.currentAppType); userVM.performBasicOtpLoginSelectionPage(context, userToken: widget.userToken, appType: appState.currentAppType,loginType: "1");
}, },
title: LocaleKeys.SMS.tr(), title: LocaleKeys.SMS.tr(),
icon: MyAssets.icSmsSvg, icon: MyAssets.icSmsSvg,
@ -93,7 +93,7 @@ class _LoginMethodSelectionPageState extends State<LoginMethodSelectionPage> {
child: ShowImageButton( child: ShowImageButton(
onClick: () { onClick: () {
// navigateWithName(context, AppRoutes.dashboard); // navigateWithName(context, AppRoutes.dashboard);
userVM.performBasicOtpLoginSelectionPage(context, userToken: widget.userToken, appType: appState.currentAppType); userVM.performBasicOtpLoginSelectionPage(context, userToken: widget.userToken, appType: appState.currentAppType, loginType: "2");
}, },
title: LocaleKeys.whatsapp.tr(), title: LocaleKeys.whatsapp.tr(),
icon: MyAssets.icWhatsAppSvg, icon: MyAssets.icWhatsAppSvg,

@ -46,8 +46,10 @@ class _LoginWithPasswordState extends State<LoginWithPassword> {
void initState() { void initState() {
super.initState(); super.initState();
if (AppState().currentAppType == AppType.provider) { if (AppState().currentAppType == AppType.provider) {
phoneNum = "966580816976"; // phoneNum = "966580816976";
password = "123@Shf"; // password = "123@Shf";
phoneNum = "966530896018";
password = "Amir@123";
} }
scheduleMicrotask(() { scheduleMicrotask(() {
userVM = Provider.of(context, listen: false); userVM = Provider.of(context, listen: false);

@ -29,15 +29,18 @@ class _RegisterPageState extends State<RegisterProviderPage> {
String phoneNum = "", countryCode = ""; String phoneNum = "", countryCode = "";
int role = -1, countryId = -1; int role = -1, countryId = -1;
DropValue? selectedDrop;
TextEditingController emailController = TextEditingController(); TextEditingController emailController = TextEditingController();
Future<Role>? futureRoles; Future<Role>? futureRoles;
Future<Country>? futureCountries; Future<Country>? futureCountries;
UserVM? userVM;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
userVM = context.read<UserVM>();
fetchData(); fetchData();
} }
@ -57,7 +60,6 @@ class _RegisterPageState extends State<RegisterProviderPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final UserVM userVM = context.read<UserVM>();
return Scaffold( return Scaffold(
appBar: const CustomAppBar(isRemoveBackButton: false, title: ""), appBar: const CustomAppBar(isRemoveBackButton: false, title: ""),
body: Container( body: Container(
@ -129,13 +131,15 @@ class _RegisterPageState extends State<RegisterProviderPage> {
10.height, 10.height,
DropdownField( DropdownField(
(DropValue value) { (DropValue value) {
selectedDrop = value;
setState(() { setState(() {
countryCode = value.subValue; countryCode = value.subValue;
countryId = value.id; countryId = value.id;
}); });
}, },
dropdownValue: selectedDrop,
list: dropList, list: dropList,
hint: LocaleKeys.chooseCountry.tr(), hint: LocaleKeys.chooseCountry .tr(),
), ),
], ],
); );
@ -205,7 +209,7 @@ class _RegisterPageState extends State<RegisterProviderPage> {
title: LocaleKeys.continu.tr(), title: LocaleKeys.continu.tr(),
maxWidth: double.infinity, maxWidth: double.infinity,
onPressed: () { onPressed: () {
if (validation()) userVM.performBasicOtpRegisterPage(context, countryCode: countryCode, phoneNum: phoneNum, role: role); if (validation()) userVM!.performBasicOtpRegisterPage(context, countryCode: countryCode, phoneNum: phoneNum, role: role);
// if (validation()) performBasicOtp(context); // if (validation()) performBasicOtp(context);
}, },
), ),

@ -31,19 +31,21 @@ class _RoleTypeTabState extends State<RoleTypeTab> {
}); });
}, },
child: Container( child: Container(
width: widget.width ?? (MediaQuery width: widget.width ?? (MediaQuery.of(context).size.width / 2) - 30,
.of(context)
.size
.width / 2) - 30,
height: 45, height: 45,
decoration: BoxDecoration( decoration: BoxDecoration(
color: widget.selectedIndex == index ? MyColors.darkPrimaryColor : Colors.grey[200], color: widget.selectedIndex == index ? MyColors.darkPrimaryColor : Colors.grey[200],
// border: Border.all(color: type == ClassType.NUMBER ? MyColors.darkPrimaryColor : Colors.transparent, width: 2), // border: Border.all(color: type == ClassType.NUMBER ? MyColors.darkPrimaryColor : Colors.transparent, width: 2),
borderRadius: const BorderRadius.all(Radius.circular(0)), borderRadius: const BorderRadius.all(
Radius.circular(0),
),
), ),
child: Center( child: Center(
child: Text( child: Text(
widget.dropList[index].value, (widget.dropList[index].value) == "ServiceProvider_Dealership" || (widget.dropList[index].value) == "ServiceProvider_Individual"
? widget.dropList[index].value.split("_").first + "\n" + widget.dropList[index].value.split("_").last
: widget.dropList[index].value,
textAlign: TextAlign.center,
style: TextStyle( style: TextStyle(
color: widget.selectedIndex == index ? MyColors.white : Colors.black, color: widget.selectedIndex == index ? MyColors.white : Colors.black,
fontSize: 15, fontSize: 15,

File diff suppressed because it is too large Load Diff

@ -17,8 +17,7 @@ dependencies:
provider: ^6.0.0 provider: ^6.0.0
easy_localization: ^3.0.3 easy_localization: ^3.0.3
http: ^0.13.3 http: ^0.13.3
permission_handler: ^10.2.0 permission_handler: ^11.3.1
device_info_plus: any
flutter_svg: ^1.0.3 flutter_svg: ^1.0.3
sizer: ^2.0.15 sizer: ^2.0.15
fluttertoast: ^8.0.8 fluttertoast: ^8.0.8
@ -29,7 +28,6 @@ dependencies:
logger: 2.3.0 logger: 2.3.0
auto_size_text: any auto_size_text: any
shimmer: ^2.0.0 shimmer: ^2.0.0
local_auth: any
hexcolor: ^3.0.1 hexcolor: ^3.0.1
cached_network_image: any cached_network_image: any
url_launcher: ^6.1.14 url_launcher: ^6.1.14
@ -53,7 +51,10 @@ dependencies:
# Auth # Auth
local_auth: ^2.2.0
local_auth: ^2.2.0
huawei_fido: ^6.3.0+305
device_info_plus: ^10.1.0
dev_dependencies: dev_dependencies:

Loading…
Cancel
Save