Merge branch 'aamir_dev' into faiz_development_common

localization_aamir
Faiz Hashmi 1 year ago
commit 08cb3f4a85

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

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

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

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

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

@ -111,9 +111,9 @@ class BranchRepoImp implements BranchRepo {
@override
Future<Services> fetchServicesByCategoryId({required int serviceCategoryId}) async {
var postParams = {"ServiceCategoryID": serviceCategoryId};
var postParams = {"ServiceCategoryID": serviceCategoryId.toString()};
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

@ -18,6 +18,8 @@ abstract class ScheduleRepo {
Future<Schedule> getSchedules(String branchId);
Future<MResponse> updateServicesInSchedule(Map map);
Future<MResponse> setScheduleInActive(int scheduleId, int branchId);
}
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);
}
@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
Future<MResponse> updateSchedule(Map map) async {
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:huawei_fido/huawei_fido.dart';
import 'package:local_auth/local_auth.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 {
Future<bool> authenticate();
@ -51,6 +56,14 @@ class CommonAuthImp implements CommonAuthServices {
}
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:io';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter/material.dart';
@ -66,16 +67,22 @@ class AppPermissions {
message: "You need to give storage permission to select files.",
onTap: () {
Navigator.pop(context);
openAppSettings();
},
),
);
}
Future<int> getAndroidDeviceInfo() async {
AndroidDeviceInfo deviceInfo = await DeviceInfoPlugin().androidInfo;
return deviceInfo.version.sdkInt;
}
static Future<bool> checkStoragePermissions(BuildContext context) async {
bool permissionStatus;
final deviceInfo = await DeviceInfoPlugin().androidInfo;
if (deviceInfo.version.sdkInt! > 32) {
if (deviceInfo.version.sdkInt > 32) {
permissionStatus = await Permission.photos.request().isGranted;
if (permissionStatus) {
return true;
@ -89,7 +96,6 @@ class AppPermissions {
return true;
} else {
getDialog(context);
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/routes.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/ads_bank_details_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 adPhoneNumberError = "";
// Edit Variables Amir
bool isAdEdit = false;
List<AdDetailsModel> exploreAds = [];
List<AdDetailsModel> exploreAdsFilteredList = [];
List<AdDetailsModel> myAdsFilteredList = [];
@ -1593,8 +1597,83 @@ class AdVM extends BaseVM {
applyFilterOnExploreAds(createdByRoleFilter: CreatedByRoleEnum.allAds);
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 {
List<File>? partImages;
SelectionModel? partSelectedId;

@ -1,9 +1,11 @@
import 'dart:convert';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/cupertino.dart';
import 'package:http/http.dart';
import 'package:huawei_fido/huawei_fido.dart';
import 'package:local_auth/local_auth.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart';
@ -331,51 +333,92 @@ class UserVM extends BaseVM {
}
}
Future<void> performBasicOtpLoginSelectionPage(BuildContext context, {required String userToken, required AppType appType}) async {
Utils.showLoading(context);
LoginPasswordRespModel user = await userRepo.loginV2OTP(userToken, "1");
Utils.hideLoading(context);
if (user.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
Response response2 = await userRepo.loginV2OTPVerify(user.data!.userToken ?? "", code);
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");
}
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.showToast(verifiedUser.message ?? "");
}
}
} else {
Utils.showToast(user.message ?? "");
Utils.showLoading(context);
LoginPasswordRespModel user = await userRepo.loginV2OTP(userToken, "1");
Utils.hideLoading(context);
if (user.messageStatus == 1) {
showMDialog(context, child: OtpDialog(
onClick: (String code) async {
pop(context);
Utils.showLoading(context);
Response response2 = await userRepo.loginV2OTPVerify(user.data!.userToken ?? "", code);
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.showToast(user.message ?? "");
}
}
}
@ -515,10 +558,15 @@ class UserVM extends BaseVM {
// Aamir Code
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();
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) {
logger.d(availBio);
if (availBio == null) return true;
if (availBio!.contains(bioType)) {
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(() {
if (isFromExtendAd) {
adVM.updateVehicleExtendAdDurationId(
@ -89,6 +96,7 @@ class AdDurationSelectionSheetContent extends StatelessWidget {
itemPrice: adDuration.price!.toInt().toString(),
),
);
adVM.updateValues();
});
},
separatorBuilder: (BuildContext context, int index) {

@ -1,4 +1,5 @@
import 'dart:async';
import 'dart:convert';
import 'dart:developer';
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/extensions/int_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/ads_bank_details_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/txt_field.dart';
import 'package:provider/provider.dart';
import 'package:sizer/sizer.dart';
class AdsDetailView extends StatefulWidget {
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
Widget build(BuildContext context) {
log("ad: ${widget.adDetails.id}");
log("ad: ${widget.adDetails.vehicle!.image!.first.imageUrl}");
return Scaffold(
appBar: CustomAppBar(
title: "Ads",
@ -130,6 +138,7 @@ class _AdsDetailViewState extends State<AdsDetailView> {
children: [
Expanded(
child: ListView(
shrinkWrap: true,
children: [
Column(
mainAxisSize: MainAxisSize.min,
@ -258,7 +267,44 @@ class _AdsDetailViewState extends State<AdsDetailView> {
).toWhiteContainer(width: double.infinity, allPading: 12);
}
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.reserveCancel:
case AdPostStatus.rejected:
return pendingForReviewAction(pendingText: "Rejected form admin");
case AdPostStatus.cancelled:
case AdPostStatus.pendingForPost:
return pendingForReviewAction(pendingText: "Waiting for admin to post");

@ -34,7 +34,7 @@ class _CreateAdViewState extends State<CreateAdView> {
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
title: "Create Ad",
title: adVM.isAdEdit ? "Update Ad": "Create Ad",
isRemoveBackButton: false,
isDrawerEnabled: false,
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/extensions/int_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/general_models/widgets_models.dart';
import 'package:mc_common_app/theme/colors.dart';
@ -38,128 +39,154 @@ 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
Widget build(BuildContext context) {
return Scaffold(
appBar: CustomAppBar(
title: "Select Ad Type",
profileImageUrl: MyAssets.bnCar,
isRemoveBackButton: false,
isDrawerEnabled: false,
),
body: Column(
children: [
Expanded(
child: Consumer(builder: (BuildContext context, AdVM adVM, Widget? child) {
return ListView.separated(
itemCount: adVM.vehicleTypes.length,
itemBuilder: (BuildContext context, int index) {
VehicleTypeModel vehicleTypeModel = adVM.vehicleTypes[index];
return InkWell(
onTap: () {
adVM.updateSelectionVehicleTypeId(
SelectionModel(selectedId: vehicleTypeModel.id!, selectedOption: vehicleTypeModel.vehicleTypeName ?? "", errorValue: ""),
);
showMyBottomSheet(context, child: const AdDurationSelectionSheetContent(isUpdateAdSelected: false, isFromExtendAd: false));
},
child: SizedBox(
width: double.infinity,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
vehicleTypeModel.vehicleTypeName.toString().toText(fontSize: 18, isBold: true),
getVehicleAdTypeIcon(vehicleTypeModel.vehicleTypeEnum!),
],
),
if (isProvider) ...[
Row(
children: [
"Duration: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
"Valid Until Subscription Expiration".toText(fontSize: 13, isBold: true),
],
).paddingOnly(top: 5, bottom: 5),
] else ...[
return WillPopScope(
onWillPop: () async {
logger.d("Clead All Values");
// clearAll(context);
AdVM adVM = context.read<AdVM>();
adVM.clearEditValues();
return true;
},
child: Scaffold(
appBar: CustomAppBar(
title: "Select Ad Type",
profileImageUrl: MyAssets.bnCar,
isRemoveBackButton: false,
isDrawerEnabled: false,
),
body: Column(
children: [
Expanded(
child: Consumer(builder: (BuildContext context, AdVM adVM, Widget? child) {
return ListView.separated(
itemCount: adVM.vehicleTypes.length,
itemBuilder: (BuildContext context, int index) {
VehicleTypeModel vehicleTypeModel = adVM.vehicleTypes[index];
return InkWell(
onTap: () {
adVM.updateSelectionVehicleTypeId(
SelectionModel(selectedId: vehicleTypeModel.id!, selectedOption: vehicleTypeModel.vehicleTypeName ?? "", errorValue: ""),
);
showMyBottomSheet(context, child: const AdDurationSelectionSheetContent(isUpdateAdSelected: false, isFromExtendAd: false));
},
child: SizedBox(
width: double.infinity,
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
"Duration: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
adVM.vehicleAdDurationId.selectedOption.toText(fontSize: 13, isBold: true),
const Icon(Icons.keyboard_arrow_down_sharp, color: MyColors.darkPrimaryColor, size: 20),
],
).paddingOnly(top: 5, bottom: 5),
],
if (!isProvider) ...[
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
adVM.vehicleAdDurationId.itemPrice.toText(fontSize: 22, isBold: true),
2.width,
Padding(
padding: const EdgeInsets.only(bottom: 4),
child: "SAR".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
),
vehicleTypeModel.vehicleTypeName.toString().toText(fontSize: 18, isBold: true),
getVehicleAdTypeIcon(vehicleTypeModel.vehicleTypeEnum!),
],
),
if (isProvider) ...[
Row(
children: [
"Duration: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
"Valid Until Subscription Expiration".toText(fontSize: 13, isBold: true),
],
).paddingOnly(top: 5, bottom: 5),
] else ...[
Row(
children: [
"Duration: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
adVM.vehicleAdDurationId.selectedOption.toText(fontSize: 13, isBold: true),
const Icon(Icons.keyboard_arrow_down_sharp, color: MyColors.darkPrimaryColor, size: 20),
],
).paddingOnly(top: 5, bottom: 5),
],
if (!isProvider) ...[
Row(
crossAxisAlignment: CrossAxisAlignment.end,
children: [
adVM.vehicleAdDurationId.itemPrice.toText(fontSize: 22, isBold: true),
2.width,
Padding(
padding: const EdgeInsets.only(bottom: 4),
child: "SAR".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true),
),
],
),
],
],
],
),
),
),
],
),
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.symmetric(horizontal: 20, vertical: 10)),
);
},
separatorBuilder: (BuildContext context, int index) {
return 9.height;
},
padding: const EdgeInsets.all(20),
);
}),
),
if (isProvider) ...[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
"5 of 10 ".toText(fontSize: 29, isBold: true, letterSpacing: 0, height: 1),
"Ads Remaining ".toText(fontSize: 17, color: MyColors.lightTextColor, isBold: true),
],
),
const Text.rich(
TextSpan(
],
),
).toWhiteContainer(width: double.infinity, isBorderRequired: vehicleTypeModel.isSelected! ? true : false, pading: const EdgeInsets.symmetric(horizontal: 20, vertical: 10)),
);
},
separatorBuilder: (BuildContext context, int index) {
return 9.height;
},
padding: const EdgeInsets.all(20),
);
}),
),
if (isProvider) ...[
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
TextSpan(
text: "You have left with 05 out of 50 ads given in the subscription. ",
style: TextStyle(
fontSize: 14,
color: MyColors.lightTextColor,
)),
TextSpan(
text: "Update Subscription",
style: TextStyle(
decoration: TextDecoration.underline,
fontSize: 14,
fontWeight: FontWeight.w600,
color: MyColors.darkPrimaryColor,
))
"5 of 10 ".toText(fontSize: 29, isBold: true, letterSpacing: 0, height: 1),
"Ads Remaining ".toText(fontSize: 17, color: MyColors.lightTextColor, isBold: true),
],
),
),
10.height,
],
).toContainer(paddingAll: 20, backgroundColor: Colors.white),
]
],
const Text.rich(
TextSpan(
children: [
TextSpan(
text: "You have left with 05 out of 50 ads given in the subscription. ",
style: TextStyle(
fontSize: 14,
color: MyColors.lightTextColor,
)),
TextSpan(
text: "Update Subscription",
style: TextStyle(
decoration: TextDecoration.underline,
fontSize: 14,
fontWeight: FontWeight.w600,
color: MyColors.darkPrimaryColor,
))
],
),
),
10.height,
],
).toContainer(paddingAll: 20, backgroundColor: Colors.white),
]
],
),
),
);
}

@ -54,12 +54,12 @@ class _LoginMethodSelectionPageState extends State<LoginMethodSelectionPage> {
Expanded(
child: ShowImageButton(
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);
},
title: LocaleKeys.fingerPrint.tr(),
icon: MyAssets.icFingerprintSvg,
isDisabled: userVM.isBioAvailable(Platform.isAndroid ? BiometricType.weak : BiometricType.fingerprint),
isDisabled: userVM.isBioAvailable(Platform.isAndroid ? BiometricType.weak : BiometricType.fingerprint, ),
),
),
20.width,
@ -67,7 +67,7 @@ class _LoginMethodSelectionPageState extends State<LoginMethodSelectionPage> {
child: ShowImageButton(
onClick: () {
// 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(),
icon: MyAssets.icFace,
@ -82,7 +82,7 @@ class _LoginMethodSelectionPageState extends State<LoginMethodSelectionPage> {
Expanded(
child: ShowImageButton(
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(),
icon: MyAssets.icSmsSvg,
@ -93,7 +93,7 @@ class _LoginMethodSelectionPageState extends State<LoginMethodSelectionPage> {
child: ShowImageButton(
onClick: () {
// 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(),
icon: MyAssets.icWhatsAppSvg,

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

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

@ -31,19 +31,21 @@ class _RoleTypeTabState extends State<RoleTypeTab> {
});
},
child: Container(
width: widget.width ?? (MediaQuery
.of(context)
.size
.width / 2) - 30,
width: widget.width ?? (MediaQuery.of(context).size.width / 2) - 30,
height: 45,
decoration: BoxDecoration(
color: widget.selectedIndex == index ? MyColors.darkPrimaryColor : Colors.grey[200],
// 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: 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(
color: widget.selectedIndex == index ? MyColors.white : Colors.black,
fontSize: 15,

File diff suppressed because it is too large Load Diff

@ -17,8 +17,7 @@ dependencies:
provider: ^6.0.0
easy_localization: ^3.0.3
http: ^0.13.3
permission_handler: ^10.2.0
device_info_plus: any
permission_handler: ^11.3.1
flutter_svg: ^1.0.3
sizer: ^2.0.15
fluttertoast: ^8.0.8
@ -29,7 +28,6 @@ dependencies:
logger: 2.3.0
auto_size_text: any
shimmer: ^2.0.0
local_auth: any
hexcolor: ^3.0.1
cached_network_image: any
url_launcher: ^6.1.14
@ -53,7 +51,10 @@ dependencies:
# 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:

Loading…
Cancel
Save