Model Refactoring

master_new_changes
Faiz Hashmi 2 years ago
parent 3ce3d2b1db
commit 31a9b71b83

@ -582,5 +582,14 @@
"noUpcomingAppointments": "لا يوجد موعد قادم متاح", "noUpcomingAppointments": "لا يوجد موعد قادم متاح",
"addNewAppointment": "إضافة موعد جديد", "addNewAppointment": "إضافة موعد جديد",
"myNearbyBranches": "فروعي القريبة", "myNearbyBranches": "فروعي القريبة",
"myRecentBranches": "فروعي الأخيرة" "myRecentBranches": "فروعي الأخيرة",
"favoriteList": "قائمة المفضلة",
"noReviewsBranch": "هذا الفرع لا يوجد لديه تعليقات.",
"readLess": "اقرأ أقل",
"readMoreReviews": "اقرأ المزيد من التقييمات",
"noProvidersInFav": "ليس لديك أي مقدمي خدمات في المفضلة.",
"providerHasNoBranches": "هذا المزود ليس لديه فروع حتى الآن.",
"totalBranches": "إجمالي الفروع",
"memberSince": "عضو منذ"
} }

@ -583,5 +583,13 @@
"noUpcomingAppointments": "No Upcoming Appointment Available.", "noUpcomingAppointments": "No Upcoming Appointment Available.",
"addNewAppointment": "Add New Appointment", "addNewAppointment": "Add New Appointment",
"myNearbyBranches": "My Nearby Branches", "myNearbyBranches": "My Nearby Branches",
"myRecentBranches": "My Recent Branches" "myRecentBranches": "My Recent Branches",
"favoriteList": "Favourite List",
"noReviewsBranch": "This branch has no reviews.",
"readLess": "Read Less",
"readMoreReviews": "Read More Reviews",
"noProvidersInFav": "You have no providers in Favourites.",
"providerHasNoBranches": "This Provider has no branches yet.",
"totalBranches": "Total Branches",
"memberSince": "Member Since"
} }

@ -245,7 +245,6 @@ class ApiClientImp implements ApiClient {
var response = await _get(Uri.parse(url), headers: headers0).timeout(const Duration(seconds: 60)); var response = await _get(Uri.parse(url), headers: headers0).timeout(const Duration(seconds: 60));
if (!kReleaseMode) { if (!kReleaseMode) {
logger.i("Url:$url");
logger.i(jsonDecode(response.body)); logger.i(jsonDecode(response.body));
} }
if (response.statusCode >= 200 && response.statusCode < 500) { if (response.statusCode >= 200 && response.statusCode < 500) {

@ -86,6 +86,7 @@ class AppRoutes {
static const String branchDetailView = "/branchDetailPage"; static const String branchDetailView = "/branchDetailPage";
static const String branchSearchFilterPage = "/branchSearchFilterPage"; static const String branchSearchFilterPage = "/branchSearchFilterPage";
static const String providerProfileView = "/providerProfilePage"; static const String providerProfileView = "/providerProfilePage";
static const String favoriteListView = "/favoriteListView";
// Subscriptions // Subscriptions
static const String mySubscriptionsPage = "/mySubscriptionsPage"; static const String mySubscriptionsPage = "/mySubscriptionsPage";
@ -127,12 +128,28 @@ class AppRoutes {
forgetPassword: (context) => const ForgetPasswordPage(), forgetPassword: (context) => const ForgetPasswordPage(),
loginVerification: (context) => const LoginVerificationPage(), loginVerification: (context) => const LoginVerificationPage(),
loginWithPassword: (context) => const LoginWithPassword(), loginWithPassword: (context) => const LoginWithPassword(),
loginMethodSelection: (context) => LoginMethodSelectionPage(ModalRoute.of(context)!.settings.arguments as String), loginMethodSelection: (context) =>
completeProfile: (context) => CompleteProfilePage(ModalRoute.of(context)!.settings.arguments as RegisterUserRespModel), LoginMethodSelectionPage(ModalRoute
.of(context)!
.settings
.arguments as String),
completeProfile: (context) =>
CompleteProfilePage(ModalRoute
.of(context)!
.settings
.arguments as RegisterUserRespModel),
verifyPassword: (context) => VerifyPasswordPage(), verifyPassword: (context) => VerifyPasswordPage(),
confirmNewPasswordPage: (context) => ConfirmNewPasswordPage(ModalRoute.of(context)!.settings.arguments as String), confirmNewPasswordPage: (context) =>
ConfirmNewPasswordPage(ModalRoute
.of(context)!
.settings
.arguments as String),
changePassword: (context) => const ChangePasswordPage(), changePassword: (context) => const ChangePasswordPage(),
forgetPasswordMethodPage: (context) => ForgetPasswordMethodPage(ModalRoute.of(context)!.settings.arguments as String), forgetPasswordMethodPage: (context) =>
ForgetPasswordMethodPage(ModalRoute
.of(context)!
.settings
.arguments as String),
changeMobilePage: (context) => ChangeMobilePage(), changeMobilePage: (context) => ChangeMobilePage(),
changeEmailPage: (context) => const ChangeEmailPage(), changeEmailPage: (context) => const ChangeEmailPage(),
editAccountPage: (context) => const EditAccountPage(), editAccountPage: (context) => const EditAccountPage(),
@ -142,17 +159,41 @@ class AppRoutes {
providerLicensePage: (context) => ProviderLicensePage(), providerLicensePage: (context) => ProviderLicensePage(),
// common pages // common pages
AppRoutes.adsDetailView: (context) => AdsDetailView(adDetails: ModalRoute.of(context)!.settings.arguments as AdDetailsModel), AppRoutes.adsDetailView: (context) =>
AdsDetailView(adDetails: ModalRoute
.of(context)!
.settings
.arguments as AdDetailsModel),
AppRoutes.createAdView: (context) => const CreateAdView(), AppRoutes.createAdView: (context) => const CreateAdView(),
AppRoutes.adsFilterView: (context) => const AdsFilterView(), AppRoutes.adsFilterView: (context) => const AdsFilterView(),
AppRoutes.selectAdTypeView: (context) => SelectAdTypeView(arguments: ModalRoute.of(context)!.settings.arguments as List<bool>), AppRoutes.selectAdTypeView: (context) =>
AppRoutes.chatView: (context) => ChatView(chatViewArguments: ModalRoute.of(context)!.settings.arguments as ChatViewArguments), SelectAdTypeView(arguments: ModalRoute
AppRoutes.offersListPage: (context) => OfferListPage(offerListPageArguments: ModalRoute.of(context)!.settings.arguments as OfferListPageArguments), .of(context)!
AppRoutes.adsBuyerChatsListView: (context) => AdsBuyerChatsView(buyersListViewArguments: ModalRoute.of(context)!.settings.arguments as List<BuyersChatForAdsModel>), .settings
.arguments as List<bool>),
AppRoutes.chatView: (context) =>
ChatView(chatViewArguments: ModalRoute
.of(context)!
.settings
.arguments as ChatViewArguments),
AppRoutes.offersListPage: (context) =>
OfferListPage(offerListPageArguments: ModalRoute
.of(context)!
.settings
.arguments as OfferListPageArguments),
AppRoutes.adsBuyerChatsListView: (context) =>
AdsBuyerChatsView(buyersListViewArguments: ModalRoute
.of(context)!
.settings
.arguments as List<BuyersChatForAdsModel>),
AppRoutes.createRequestPage: (context) => const CreateRequestPage(), AppRoutes.createRequestPage: (context) => const CreateRequestPage(),
AppRoutes.settingOptionsFaqs: (context) => const SettingOptionsFAQs(), AppRoutes.settingOptionsFaqs: (context) => const SettingOptionsFAQs(),
AppRoutes.settingOptionsInviteFriends: (context) => const SettingOptionsInviteFriends(), AppRoutes.settingOptionsInviteFriends: (context) => const SettingOptionsInviteFriends(),
AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(paymentType: ModalRoute.of(context)!.settings.arguments as PaymentTypes), AppRoutes.paymentMethodsView: (context) =>
PaymentMethodsView(paymentType: ModalRoute
.of(context)!
.settings
.arguments as PaymentTypes),
}; };
} }

@ -17,12 +17,14 @@ extension EmailValidator on String {
FontWeight? fontWeight, FontWeight? fontWeight,
double? height, double? height,
Color? decorationColor, Color? decorationColor,
TextOverflow? overflow,
int? maxLines}) => int? maxLines}) =>
AutoSizeText( AutoSizeText(
this, this,
textAlign: textAlign, textAlign: textAlign,
maxLines: maxLines, maxLines: maxLines,
style: TextStyle( style: TextStyle(
overflow: overflow,
fontStyle: isItalic ? FontStyle.italic : null, fontStyle: isItalic ? FontStyle.italic : null,
height: height, height: height,
decoration: isUnderLine ? TextDecoration.underline : textDecoration ?? TextDecoration.none, decoration: isUnderLine ? TextDecoration.underline : textDecoration ?? TextDecoration.none,

@ -598,7 +598,15 @@ class CodegenLoader extends AssetLoader{
"noUpcomingAppointments": "لا يوجد موعد قادم متاح", "noUpcomingAppointments": "لا يوجد موعد قادم متاح",
"addNewAppointment": "إضافة موعد جديد", "addNewAppointment": "إضافة موعد جديد",
"myNearbyBranches": "فروعي القريبة", "myNearbyBranches": "فروعي القريبة",
"myRecentBranches": "فروعي الأخيرة" "myRecentBranches": "فروعي الأخيرة",
"favoriteList": "قائمة المفضلة",
"noReviewsBranch": "هذا الفرع لا يوجد لديه تعليقات.",
"readLess": "اقرأ أقل",
"readMoreReviews": "اقرأ المزيد من التقييمات",
"noProvidersInFav": "ليس لديك أي مقدمي خدمات في المفضلة.",
"providerHasNoBranches": "هذا المزود ليس لديه فروع حتى الآن.",
"totalBranches": "إجمالي الفروع",
"memberSince": "عضو منذ"
}; };
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
"firstTimeLogIn": "First Time Log In", "firstTimeLogIn": "First Time Log In",
@ -1185,7 +1193,15 @@ static const Map<String,dynamic> en_US = {
"noUpcomingAppointments": "No Upcoming Appointment Available.", "noUpcomingAppointments": "No Upcoming Appointment Available.",
"addNewAppointment": "Add New Appointment", "addNewAppointment": "Add New Appointment",
"myNearbyBranches": "My Nearby Branches", "myNearbyBranches": "My Nearby Branches",
"myRecentBranches": "My Recent Branches" "myRecentBranches": "My Recent Branches",
"favoriteList": "Favourite List",
"noReviewsBranch": "This branch has no reviews.",
"readLess": "Read Less",
"readMoreReviews": "Read More Reviews",
"noProvidersInFav": "You have no providers in Favourites.",
"providerHasNoBranches": "This Provider has no branches yet.",
"totalBranches": "Total Branches",
"memberSince": "Member Since"
}; };
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};
} }

@ -562,5 +562,13 @@ abstract class LocaleKeys {
static const addNewAppointment = 'addNewAppointment'; static const addNewAppointment = 'addNewAppointment';
static const myNearbyBranches = 'myNearbyBranches'; static const myNearbyBranches = 'myNearbyBranches';
static const myRecentBranches = 'myRecentBranches'; static const myRecentBranches = 'myRecentBranches';
static const favoriteList = 'favoriteList';
static const noReviewsBranch = 'noReviewsBranch';
static const readLess = 'readLess';
static const readMoreReviews = 'readMoreReviews';
static const noProvidersInFav = 'noProvidersInFav';
static const providerHasNoBranches = 'providerHasNoBranches';
static const totalBranches = 'totalBranches';
static const memberSince = 'memberSince';
} }

@ -104,3 +104,7 @@ class OfferRequestCommentModel {
OfferRequestCommentModel({this.index, this.title, this.isSelected}); OfferRequestCommentModel({this.index, this.title, this.isSelected});
} }

@ -1,36 +0,0 @@
// To parse this JSON data, do
//
// final mResponse = mResponseFromJson(jsonString);
import 'dart:convert';
MResponse mResponseFromJson(String str) => MResponse.fromJson(json.decode(str));
String mResponseToJson(MResponse data) => json.encode(data.toJson());
class MResponse {
MResponse({
this.totalItemsCount,
this.messageStatus,
this.message,
this.data,
});
int? totalItemsCount;
int? messageStatus;
String? message;
dynamic data;
factory MResponse.fromJson(Map<String, dynamic> json) => MResponse(
totalItemsCount: json["totalItemsCount"],
messageStatus: json["messageStatus"],
message: json["message"],
data: json["data"],
);
Map<String, dynamic> toJson() => {
"totalItemsCount": totalItemsCount,
"messageStatus": messageStatus,
"message": message,
};
}

@ -1,37 +1,42 @@
import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart';
import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/categroy.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/categroy.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'; import 'package:mc_common_app/utils/enums.dart';
class BranchDetailModel { class BranchDetailModel {
final int? id; int? id;
final int? serviceProviderId; int? serviceProviderId;
final String? serviceProviderName; String? serviceProviderName;
final String? branchName; String? branchProfileImage;
final String? branchDescription; String? branchName;
final int? cityId; String? branchDescription;
final String? cityName; int? cityId;
final String? address; String? cityName;
final String? latitude; String? address;
final String? longitude; String? latitude;
final double? distanceKm; String? longitude;
final String? openTime; double? distanceKm;
final String? closeTime; String? openTime;
final BranchStatusEnum? branchStatus; String? closeTime;
final int? statusId; BranchStatusEnum? branchStatus;
final String? statusText; List<AdImage>? branchImages;
final double? branchRateAvg; int? statusId;
final List<ServiceModel>? branchServices; String? statusText;
String? branchStatusLabel;
double? branchRateAvg;
List<ServiceModel>? branchServices;
List<CategoryData>? categories; List<CategoryData>? categories;
int? countryID; int? countryID;
String? countryName; String? countryName;
bool isExpanded; bool isExpanded = false;
bool? isFavorite; bool? isFavorite;
BranchDetailModel({ BranchDetailModel({
this.id, this.id,
this.serviceProviderId, this.serviceProviderId,
this.serviceProviderName, this.serviceProviderName,
this.branchProfileImage,
this.branchName, this.branchName,
this.branchDescription, this.branchDescription,
this.cityId, this.cityId,
@ -43,9 +48,11 @@ class BranchDetailModel {
this.openTime, this.openTime,
this.closeTime, this.closeTime,
this.branchStatus, this.branchStatus,
this.branchImages,
this.branchRateAvg, this.branchRateAvg,
this.statusId, this.statusId,
this.statusText, this.statusText,
this.branchStatusLabel,
this.branchServices, this.branchServices,
this.categories, this.categories,
this.countryID, this.countryID,
@ -54,27 +61,41 @@ class BranchDetailModel {
required this.isExpanded, required this.isExpanded,
}); });
factory BranchDetailModel.fromJson(Map<String, dynamic> json) => BranchDetailModel( List<AdImage> populateBranchImages(value) {
id: json["id"], List<AdImage> images = [];
serviceProviderId: json["serviceProviderID"], if (value != null) {
serviceProviderName: json["serviceProviderName"], value.forEach((v) {
branchName: json["branchName"], images.add(AdImage.fromJson(v));
branchDescription: json["branchDescription"], });
cityId: json["cityID"], }
cityName: json["cityName"], return images;
address: json["address"], }
latitude: json["latitude"],
longitude: json["longitude"], BranchDetailModel.fromJson(Map<String, dynamic> json) {
distanceKm: json["distanceKM"]?.toDouble(), List<AdImage> images = populateBranchImages(json["serviceProviderBranchImage"]);
openTime: json["openTime"], id = json["id"];
closeTime: json["closeTime"], serviceProviderId = json["serviceProviderID"];
branchStatus: json.containsKey("branchStatus") ? (json['branchStatus'] as int).toBranchStatusEnum() : null, branchProfileImage = images.isNotEmpty ? images.first.imageUrl ?? "" : null;
statusId: json["branchStatus"], serviceProviderName = json["serviceProviderName"];
statusText: json["statusText"], branchName = json["branchName"];
branchRateAvg: json["branchRateAvg"], branchDescription = json["branchDescription"];
branchServices: json["serviceProviderServices"] == null ? [] : List<ServiceModel>.from(json["serviceProviderServices"]!.map((x) => ServiceModel.fromJson(x))), cityId = json["cityID"];
categories: [], cityName = json["cityName"];
isExpanded: false, address = json["address"];
isFavorite: false, latitude = json["latitude"];
); longitude = json["longitude"];
distanceKm = json["distanceKM"]?.toDouble();
openTime = json["openTime"];
closeTime = json["closeTime"];
branchStatus = json.containsKey("branchStatus") ? (json['branchStatus'] as int).toBranchStatusEnum() : null;
statusId = json["branchStatus"];
branchImages = images;
statusText = json["statusText"];
branchStatusLabel = json["branchStatusText"];
branchRateAvg = json["branchRateAvg"];
branchServices = json["serviceProviderServices"] == null ? [] : List<ServiceModel>.from(json["serviceProviderServices"]!.map((x) => ServiceModel.fromJson(x)));
categories = [];
isExpanded = false;
isFavorite = false;
}
} }

@ -4,37 +4,80 @@ class ProviderProfileModel {
ProviderProfileModel({ ProviderProfileModel({
this.id, this.id,
this.companyName, this.companyName,
this.name,
this.countryName, this.countryName,
this.companyDescription, this.companyDescription,
this.allDocStatus, this.allDocStatus,
this.isValidSubscription, this.isValidSubscription,
this.userId, this.userId,
this.memberSince,
this.serviceProviderBranch, this.serviceProviderBranch,
this.countryID, this.countryID,
this.isFavorite, this.isFavorite,
this.providerID,
this.noOfBranches,
this.customerID,
}); });
final int? id; final int? id;
final String? companyName; final String? companyName;
final String? countryName;
int? countryID;
final String? companyDescription; final String? companyDescription;
int? countryID;
final String? countryName;
final int? allDocStatus; final int? allDocStatus;
final bool? isValidSubscription; final bool? isValidSubscription;
bool? isFavorite; final String? name;
final String? userId; final String? userId;
final String? memberSince;
bool? isFavorite;
final int? providerID;
final int? customerID;
final int? noOfBranches;
final List<BranchDetailModel>? serviceProviderBranch; final List<BranchDetailModel>? serviceProviderBranch;
factory ProviderProfileModel.fromJson(Map<String, dynamic> json) => ProviderProfileModel( factory ProviderProfileModel.fromJson(Map<String, dynamic> json) => ProviderProfileModel(
id: json["id"], id: json["id"],
companyName: json["companyName"], companyName: json["companyName"],
name: json["name"],
countryName: json["countryName"], countryName: json["countryName"],
countryID: json["countryID"], countryID: json["countryID"],
companyDescription: json["companyDescription"], companyDescription: json["companyDescription"],
allDocStatus: json["allDocStatus"], allDocStatus: json["allDocStatus"],
isValidSubscription: json["isValidSubscription"], isValidSubscription: json["isValidSubscription"],
userId: json["userID"], userId: json["userID"],
memberSince: json["memberSince"] ?? "",
providerID: json["providerID"] ?? 0,
customerID: json["customerID"] ?? 0,
noOfBranches: json["noOfBranches"] ?? (json["serviceProviderBranch"] != null ? (json["serviceProviderBranch"] as List).length : 0),
isFavorite: json["isFavourite"] ?? false, isFavorite: json["isFavourite"] ?? false,
serviceProviderBranch: json["serviceProviderBranch"] == null ? null : List<BranchDetailModel>.from(json["serviceProviderBranch"].map((x) => BranchDetailModel.fromJson(x))), serviceProviderBranch: json["serviceProviderBranch"] == null ? null : List<BranchDetailModel>.from(json["serviceProviderBranch"].map((x) => BranchDetailModel.fromJson(x))),
); );
} }
// {
// "id": 10,
// "companyName": "string",
// "companyDescription": "",
// "countryID": 1,
// "countryName": "Saudi Arabia",
// "allDocStatus": 0,
// "isValidSubscription": true,
// "name": null,
// "userID": "88e2e2e8-9a6d-4f97-b05c-08dc7e4513b3",
// }
//
// {
// "id": 0,
// "companyName": "string",
// "companyDescription": "",
// "countryID": 1,
// "countryName": "string",
// "allDocStatus": 3,
// "isValidSubscription": true,
// "name": "Mirza Shafique",
// "userID": "7db5e1ae-6de4-47d7-984b-08db2842f899",
// "providerID": 2,
// "customerID": 6,
// "noOfBranches": 12,
// "memberSince": "2024-08-22T11:36:46.41"
// }

@ -8,7 +8,6 @@ import 'package:mc_common_app/models/appointments_models/appointment_list_model.
import 'package:mc_common_app/models/appointments_models/schedule_model.dart'; import 'package:mc_common_app/models/appointments_models/schedule_model.dart';
import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; import 'package:mc_common_app/models/appointments_models/service_schedule_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/m_response.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/services.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/services.dart';
abstract class AppointmentRepo { abstract class AppointmentRepo {
@ -21,25 +20,25 @@ abstract class AppointmentRepo {
List<String>? branchIdsList, List<String>? branchIdsList,
}); });
Future<MResponse> updateAppointmentStatus(Map<String, dynamic> map); Future<GenericRespModel> updateAppointmentStatus(Map<String, dynamic> map);
Future<MResponse> updateAppointmentPaymentStatus(Map<String, dynamic> map); Future<GenericRespModel> updateAppointmentPaymentStatus(Map<String, dynamic> map);
Future<MResponse> getAppointmentSlots(Map<String, dynamic> map); Future<GenericRespModel> getAppointmentSlots(Map<String, dynamic> map);
Future<MResponse> createMergeAppointment(Map<String, dynamic> map); Future<GenericRespModel> createMergeAppointment(Map<String, dynamic> map);
Future<Services> getAllServices(String branchId); Future<Services> getAllServices(String branchId);
Future<MResponse> createSchedule(Map map); Future<GenericRespModel> createSchedule(Map map);
Future<MResponse> addServicesInSchedule(Map map); Future<GenericRespModel> addServicesInSchedule(Map map);
Future<MResponse> updateSchedule(Map map); Future<GenericRespModel> updateSchedule(Map map);
Future<List<ScheduleData>> getSchedules(String branchId); Future<List<ScheduleData>> getSchedules(String branchId);
Future<MResponse> updateServicesInSchedule(Map map); Future<GenericRespModel> updateServicesInSchedule(Map map);
Future<List<ServiceAppointmentScheduleModel>> mergeServiceIntoAvailableSchedules({ Future<List<ServiceAppointmentScheduleModel>> mergeServiceIntoAvailableSchedules({
required List<String> serviceItemIdsForHome, required List<String> serviceItemIdsForHome,
@ -65,15 +64,15 @@ class AppointmentRepoImp implements AppointmentRepo {
} }
@override @override
Future<MResponse> createSchedule(Map map) async { Future<GenericRespModel> createSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? ""; String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createSchedule, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createSchedule, map, token: t);
} }
@override @override
Future<MResponse> addServicesInSchedule(Map map) async { Future<GenericRespModel> addServicesInSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? ""; String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createGroup, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createGroup, map, token: t);
} }
@override @override
@ -92,15 +91,15 @@ class AppointmentRepoImp implements AppointmentRepo {
} }
@override @override
Future<MResponse> updateSchedule(Map map) async { Future<GenericRespModel> updateSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? ""; String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateSchedule, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateSchedule, map, token: t);
} }
@override @override
Future<MResponse> updateServicesInSchedule(Map map) async { Future<GenericRespModel> updateServicesInSchedule(Map map) async {
String t = appState.getUser.data!.accessToken ?? ""; String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateGroup, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateGroup, map, token: t);
} }
Future<List<ServiceAppointmentScheduleModel>> mergeServiceIntoAvailableSchedules({ Future<List<ServiceAppointmentScheduleModel>> mergeServiceIntoAvailableSchedules({
@ -222,11 +221,11 @@ class AppointmentRepoImp implements AppointmentRepo {
} }
@override @override
Future<MResponse> getAppointmentSlots(Map<String, dynamic> map) async { Future<GenericRespModel> getAppointmentSlots(Map<String, dynamic> map) async {
String t = appState.getUser.data!.accessToken ?? ""; String t = appState.getUser.data!.accessToken ?? "";
MResponse adsGenericModel = await apiClient.getJsonForObject( GenericRespModel adsGenericModel = await apiClient.getJsonForObject(
(json) => MResponse.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.getAppointmentSlots, ApiConsts.getAppointmentSlots,
token: t, token: t,
queryParameters: map, queryParameters: map,
@ -236,21 +235,21 @@ class AppointmentRepoImp implements AppointmentRepo {
} }
@override @override
Future<MResponse> updateAppointmentPaymentStatus(Map<String, dynamic> map) async { Future<GenericRespModel> updateAppointmentPaymentStatus(Map<String, dynamic> map) async {
String t = appState.getUser.data!.accessToken ?? ""; String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateAppointmentPaymentStatus, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateAppointmentPaymentStatus, map, token: t);
} }
@override @override
Future<MResponse> updateAppointmentStatus(Map<String, dynamic> map) async { Future<GenericRespModel> updateAppointmentStatus(Map<String, dynamic> map) async {
String t = appState.getUser.data!.accessToken ?? ""; String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateAppointmentStatus, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateAppointmentStatus, map, token: t);
} }
@override @override
Future<MResponse> createMergeAppointment(Map<String, dynamic> map) async { Future<GenericRespModel> createMergeAppointment(Map<String, dynamic> map) async {
String t = appState.getUser.data!.accessToken ?? ""; String t = appState.getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createMergeAppointment, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createMergeAppointment, map, token: t);
} }

@ -5,8 +5,6 @@ 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/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/m_response.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.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';
@ -19,9 +17,9 @@ import 'package:mc_common_app/models/provider_branches_models/provider_profile_m
import 'package:mc_common_app/models/services_models/item_model.dart'; import 'package:mc_common_app/models/services_models/item_model.dart';
abstract class BranchRepo { abstract class BranchRepo {
Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude); Future<GenericRespModel> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude);
Future<MResponse> updateBranch(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true}); Future<GenericRespModel> updateBranch(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true});
Future<Branch> fetchAllBranches(); Future<Branch> fetchAllBranches();
@ -31,33 +29,33 @@ abstract class BranchRepo {
Future<Services> fetchProviderServices(String branchID, String serviceCategoryId); Future<Services> fetchProviderServices(String branchID, String serviceCategoryId);
Future<MResponse> createNewService(List<Map<String, dynamic>> map); Future<GenericRespModel> createNewService(List<Map<String, dynamic>> map);
Future<Document> getServiceProviderDocument(dynamic userId); Future<Document> getServiceProviderDocument(dynamic userId);
Future<MResponse> serviceProviderDocumentsUpdate(List<DocumentData>? documents); Future<GenericRespModel> serviceProviderDocumentsUpdate(List<DocumentData>? documents);
Future<ProviderModel> getBranchAndServices(); Future<ProviderModel> getBranchAndServices();
Future<List<ProviderBasicDataModel>> getAllProvidersWitheBasicData(); Future<List<ProviderBasicDataModel>> getAllProvidersWitheBasicData();
Future<MResponse> createService(List<Map<String, dynamic>> map); Future<GenericRespModel> createService(List<Map<String, dynamic>> map);
Future<MResponse> updateService(List<Map<String, dynamic>> map); Future<GenericRespModel> updateService(List<Map<String, dynamic>> map);
Future<MResponse> getMatchedServices(int oldBranchId, int newBranchId, int categoryId); Future<GenericRespModel> getMatchedServices(int oldBranchId, int newBranchId, int categoryId);
Future<MResponse> duplicateItems(Map<String, dynamic> map); Future<GenericRespModel> duplicateItems(Map<String, dynamic> map);
Future<MResponse> getAllProviderDealers(Map<String, dynamic> map); Future<GenericRespModel> getAllProviderDealers(Map<String, dynamic> map);
Future<MResponse> getBranchUsers(Map<String, dynamic> map); Future<GenericRespModel> getBranchUsers(Map<String, dynamic> map);
Future<MResponse> assignDealerToBranch(Map<String, dynamic> map); Future<GenericRespModel> assignDealerToBranch(Map<String, dynamic> map);
Future<MResponse> removeDealerFromBranch(Map<String, dynamic> map); Future<GenericRespModel> removeDealerFromBranch(Map<String, dynamic> map);
Future<MResponse> addNewServicesInAppointment(Map<String, dynamic> map); Future<GenericRespModel> addNewServicesInAppointment(Map<String, dynamic> map);
Future<List<BranchDetailModel>> getAllNearBranchAndServices(); Future<List<BranchDetailModel>> getAllNearBranchAndServices();
@ -85,7 +83,7 @@ abstract class BranchRepo {
Future<GenericRespModel> removeProviderFromFavourite({required int providerID}); Future<GenericRespModel> removeProviderFromFavourite({required int providerID});
Future<List<BranchDetailModel>> getMyFavoriteProviders(); Future<List<ProviderProfileModel>> getMyFavoriteProviders();
} }
class BranchRepoImp implements BranchRepo { class BranchRepoImp implements BranchRepo {
@ -93,7 +91,7 @@ class BranchRepoImp implements BranchRepo {
AppState appState = injector.get<AppState>(); AppState appState = injector.get<AppState>();
@override @override
Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async { Future<GenericRespModel> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async {
var postParams = { var postParams = {
"serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "", "serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "",
"branchName": branchName, "branchName": branchName,
@ -105,7 +103,7 @@ class BranchRepoImp implements BranchRepo {
"isActive": true "isActive": true
}; };
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t);
} }
@override @override
@ -130,9 +128,9 @@ class BranchRepoImp implements BranchRepo {
} }
@override @override
Future<MResponse> createNewService(List<Map<String, dynamic>> map) async { Future<GenericRespModel> createNewService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.serviceProviderServiceCreate, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceCreate, map, token: t);
} }
@override @override
@ -146,7 +144,7 @@ class BranchRepoImp implements BranchRepo {
} }
@override @override
Future<MResponse> serviceProviderDocumentsUpdate(List<DocumentData>? documents) async { Future<GenericRespModel> serviceProviderDocumentsUpdate(List<DocumentData>? documents) async {
List<Map<String, dynamic>> map = []; List<Map<String, dynamic>> map = [];
for (int i = 0; i < documents!.length; i++) { for (int i = 0; i < documents!.length; i++) {
if (documents[i].document != null) { if (documents[i].document != null) {
@ -155,7 +153,7 @@ class BranchRepoImp implements BranchRepo {
} }
} }
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.serviceProviderDocumentUpdate, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderDocumentUpdate, map, token: t);
} }
@override @override
@ -179,7 +177,7 @@ class BranchRepoImp implements BranchRepo {
} }
@override @override
Future<MResponse> updateBranch(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true}) async { Future<GenericRespModel> updateBranch(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true}) async {
String lat = "0", long = "0"; String lat = "0", long = "0";
try { try {
lat = latitude.substring(0, 9); lat = latitude.substring(0, 9);
@ -197,60 +195,60 @@ class BranchRepoImp implements BranchRepo {
"isActive": isNeedToDelete "isActive": isNeedToDelete
}; };
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateProviderBranch, postParams, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateProviderBranch, postParams, token: t);
} }
@override @override
Future<MResponse> createService(List<Map<String, dynamic>> map) async { Future<GenericRespModel> createService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.serviceProviderServiceCreate, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceCreate, map, token: t);
} }
@override @override
Future<MResponse> updateService(List<Map<String, dynamic>> map) async { Future<GenericRespModel> updateService(List<Map<String, dynamic>> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.serviceProviderServiceUpdate, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.serviceProviderServiceUpdate, map, token: t);
} }
@override @override
Future<MResponse> getMatchedServices(int oldBranchId, int newBranchId, int categoryId) async { Future<GenericRespModel> getMatchedServices(int oldBranchId, int newBranchId, int categoryId) async {
var postParams = { var postParams = {
"ProviderBranchIDExisted": oldBranchId.toString(), "ProviderBranchIDExisted": oldBranchId.toString(),
"ProviderBranchIDNew": newBranchId.toString(), "ProviderBranchIDNew": newBranchId.toString(),
"CategoryID": categoryId.toString(), "CategoryID": categoryId.toString(),
}; };
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => MResponse.fromJson(json), ApiConsts.getMatchedServices, queryParameters: postParams, token: t); return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.getMatchedServices, queryParameters: postParams, token: t);
} }
@override @override
Future<MResponse> duplicateItems(Map<String, dynamic> map) async { Future<GenericRespModel> duplicateItems(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.duplicateItems, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.duplicateItems, map, token: t);
} }
@override @override
Future<MResponse> getAllProviderDealers(Map<String, dynamic> map) async { Future<GenericRespModel> getAllProviderDealers(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => MResponse.fromJson(json), ApiConsts.getAllProviderDealers, queryParameters: map, token: t); return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.getAllProviderDealers, queryParameters: map, token: t);
} }
@override @override
Future<MResponse> getBranchUsers(Map<String, dynamic> map) async { Future<GenericRespModel> getBranchUsers(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.getJsonForObject((json) => MResponse.fromJson(json), ApiConsts.getBranchUser, queryParameters: map, token: t); return await apiClient.getJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.getBranchUser, queryParameters: map, token: t);
} }
@override @override
Future<MResponse> assignDealerToBranch(Map<String, dynamic> map) async { Future<GenericRespModel> assignDealerToBranch(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.assignDealerToBranch, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.assignDealerToBranch, map, token: t);
} }
@override @override
Future<MResponse> removeDealerFromBranch(Map<String, dynamic> map) async { Future<GenericRespModel> removeDealerFromBranch(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.removeDealerFromBranch, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.removeDealerFromBranch, map, token: t);
} }
@override @override
@ -265,9 +263,9 @@ class BranchRepoImp implements BranchRepo {
} }
@override @override
Future<MResponse> addNewServicesInAppointment(Map<String, dynamic> map) async { Future<GenericRespModel> addNewServicesInAppointment(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await apiClient.postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.addNewServicesInAppointment, map, token: t); return await apiClient.postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.addNewServicesInAppointment, map, token: t);
} }
@override @override
@ -412,7 +410,7 @@ class BranchRepoImp implements BranchRepo {
} }
@override @override
Future<List<BranchDetailModel>> getMyFavoriteProviders() async { Future<List<ProviderProfileModel>> getMyFavoriteProviders() async {
final customerID = appState.getUser.data!.userInfo!.customerId; final customerID = appState.getUser.data!.userInfo!.customerId;
var postParams = {"customerID": customerID.toString()}; var postParams = {"customerID": customerID.toString()};
@ -423,7 +421,7 @@ class BranchRepoImp implements BranchRepo {
token: appState.getUser.data!.accessToken, token: appState.getUser.data!.accessToken,
queryParameters: postParams, queryParameters: postParams,
); );
List<BranchDetailModel> nearBranches = List.generate(adsGenericModel.data.length, (index) => BranchDetailModel.fromJson(adsGenericModel.data[index])); List<ProviderProfileModel> favProviders = List.generate(adsGenericModel.data.length, (index) => ProviderProfileModel.fromJson(adsGenericModel.data[index]));
return nearBranches; return favProviders;
} }
} }

@ -4,24 +4,24 @@ 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/models/general_models/m_response.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/services_models/item_model.dart'; import 'package:mc_common_app/models/services_models/item_model.dart';
abstract class ItemsRepo { abstract class ItemsRepo {
Future<MResponse> createServiceItems(Map map); Future<GenericRespModel> createServiceItems(Map map);
Future<ItemModel> getServiceItems(int serviceId); Future<ItemModel> getServiceItems(int serviceId);
Future<MResponse> updateServiceItem(Map map); Future<GenericRespModel> updateServiceItem(Map map);
} }
class ItemsRepoImp implements ItemsRepo { class ItemsRepoImp implements ItemsRepo {
@override @override
Future<MResponse> createServiceItems(Map map) async { Future<GenericRespModel> createServiceItems(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
debugPrint(t); debugPrint(t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createItems, map, token: t); return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createItems, map, token: t);
} }
@override @override
@ -37,10 +37,10 @@ class ItemsRepoImp implements ItemsRepo {
} }
@override @override
Future<MResponse> updateServiceItem(Map map) async { Future<GenericRespModel> updateServiceItem(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
debugPrint(t); debugPrint(t);
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateServiceItem, map, token: t); return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateServiceItem, map, token: t);
} }
} }

@ -69,6 +69,7 @@ class RequestRepoImp implements RequestRepo {
Future<List<RequestModel>> getServiceRequestsForProviders({required int serviceProviderID}) async { Future<List<RequestModel>> getServiceRequestsForProviders({required int serviceProviderID}) async {
final parameters = { final parameters = {
"ServiceProviderId": serviceProviderID.toString(), "ServiceProviderId": serviceProviderID.toString(),
"RequestTypeId": "2", // Only to get the Service Request
}; };
GenericRespModel genericRespModel = await apiClient.getJsonForObject( GenericRespModel genericRespModel = await apiClient.getJsonForObject(
(json) => GenericRespModel.fromJson(json), (json) => GenericRespModel.fromJson(json),

@ -1,5 +1,5 @@
import 'package:mc_common_app/models/appointments_models/schedule_model.dart'; import 'package:mc_common_app/models/appointments_models/schedule_model.dart';
import 'package:mc_common_app/models/general_models/m_response.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/services.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/services.dart';
import 'package:mc_common_app/api/api_client.dart'; 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';
@ -9,17 +9,17 @@ import 'package:mc_common_app/config/dependency_injection.dart';
abstract class ScheduleRepo { abstract class ScheduleRepo {
Future<Services> getAllServices(String branchId); Future<Services> getAllServices(String branchId);
Future<MResponse> createSchedule(Map map); Future<GenericRespModel> createSchedule(Map map);
Future<MResponse> addServicesInSchedule(Map map); Future<GenericRespModel> addServicesInSchedule(Map map);
Future<MResponse> updateSchedule(Map map); Future<GenericRespModel> updateSchedule(Map map);
Future<Schedule> getSchedules(String branchId); Future<Schedule> getSchedules(String branchId);
Future<MResponse> updateServicesInSchedule(Map map); Future<GenericRespModel> updateServicesInSchedule(Map map);
Future<MResponse> setScheduleInActive(int scheduleId, int branchId); Future<GenericRespModel> setScheduleInActive(int scheduleId, int branchId);
} }
class ScheduleRepoImp implements ScheduleRepo { class ScheduleRepoImp implements ScheduleRepo {
@ -31,15 +31,15 @@ class ScheduleRepoImp implements ScheduleRepo {
} }
@override @override
Future<MResponse> createSchedule(Map map) async { Future<GenericRespModel> createSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createSchedule, map, token: t); return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createSchedule, map, token: t);
} }
@override @override
Future<MResponse> addServicesInSchedule(Map map) async { Future<GenericRespModel> addServicesInSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createGroup, map, token: t); return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.createGroup, map, token: t);
} }
@override @override
@ -50,25 +50,25 @@ class ScheduleRepoImp implements ScheduleRepo {
} }
@override @override
Future<MResponse> setScheduleInActive(int scheduleId, int branchId) async { Future<GenericRespModel> setScheduleInActive(int scheduleId, int branchId) async {
Map<String, dynamic> map = { Map<String, dynamic> map = {
"id": scheduleId, "id": scheduleId,
"serviceProviderBranchID": branchId, "serviceProviderBranchID": branchId,
"isActive": false, "isActive": false,
}; };
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.setScheduleInactive, token: t, map); return injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.setScheduleInactive, token: t, map);
} }
@override @override
Future<MResponse> updateSchedule(Map map) async { Future<GenericRespModel> updateSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateSchedule, map, token: t); return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateSchedule, map, token: t);
} }
@override @override
Future<MResponse> updateServicesInSchedule(Map map) async { Future<GenericRespModel> updateServicesInSchedule(Map map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.updateGroup, map, token: t); return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.updateGroup, map, token: t);
} }
} }

@ -3,7 +3,6 @@ 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/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/m_response.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/subscriptions_models/branch_user_selection_model.dart'; import 'package:mc_common_app/models/subscriptions_models/branch_user_selection_model.dart';
import 'package:mc_common_app/models/subscriptions_models/provider_subscription_model.dart'; import 'package:mc_common_app/models/subscriptions_models/provider_subscription_model.dart';
@ -19,11 +18,11 @@ abstract class SubscriptionRepo {
Future<SubscriptionModel> getSubscriptionBySP(String? serviceProviderID, bool isRenew); Future<SubscriptionModel> getSubscriptionBySP(String? serviceProviderID, bool isRenew);
Future<MResponse> calculationUpgradePrice(String? serviceProviderID, String? newSubscription); Future<GenericRespModel> calculationUpgradePrice(String? serviceProviderID, String? newSubscription);
Future<MResponse> payForProviderSubscription(Map<String, dynamic> map); Future<GenericRespModel> payForProviderSubscription(Map<String, dynamic> map);
Future<List<BranchSelectionModel>> getSPBranchUser_Get(Map<String, String> map); Future<List<BranchSelectionModel>> getSPBranchUserGet(Map<String, String> map);
} }
class SubscriptionRepoImp extends SubscriptionRepo { class SubscriptionRepoImp extends SubscriptionRepo {
@ -63,7 +62,7 @@ class SubscriptionRepoImp extends SubscriptionRepo {
} }
@override @override
Future<MResponse> calculationUpgradePrice(String? serviceProviderID, String? newSubscription) async { Future<GenericRespModel> calculationUpgradePrice(String? serviceProviderID, String? newSubscription) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
Map<String, String> queryParameters = {}; Map<String, String> queryParameters = {};
if (serviceProviderID != null) { if (serviceProviderID != null) {
@ -74,7 +73,7 @@ class SubscriptionRepoImp extends SubscriptionRepo {
} }
return await injector.get<ApiClient>().getJsonForObject( return await injector.get<ApiClient>().getJsonForObject(
(json) => MResponse.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.calculationUpgradePrice, ApiConsts.calculationUpgradePrice,
token: t, token: t,
queryParameters: queryParameters, queryParameters: queryParameters,
@ -82,11 +81,11 @@ class SubscriptionRepoImp extends SubscriptionRepo {
} }
@override @override
Future<MResponse> payForProviderSubscription(Map<String, dynamic> map) async { Future<GenericRespModel> payForProviderSubscription(Map<String, dynamic> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject( return await injector.get<ApiClient>().postJsonForObject(
(json) => MResponse.fromJson(json), (json) => GenericRespModel.fromJson(json),
ApiConsts.payFortOrderProviderSubscriptionCreate, ApiConsts.payFortOrderProviderSubscriptionCreate,
map, map,
token: t, token: t,
@ -94,7 +93,7 @@ class SubscriptionRepoImp extends SubscriptionRepo {
} }
@override @override
Future<List<BranchSelectionModel>> getSPBranchUser_Get(Map<String, String> map) async { Future<List<BranchSelectionModel>> getSPBranchUserGet(Map<String, String> map) async {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject( GenericRespModel genericRespModel = await injector.get<ApiClient>().getJsonForObject(

@ -7,7 +7,7 @@ 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/models/general_models/m_response.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/user_models/basic_otp.dart'; import 'package:mc_common_app/models/user_models/basic_otp.dart';
import 'package:mc_common_app/models/user_models/change_email.dart'; import 'package:mc_common_app/models/user_models/change_email.dart';
import 'package:mc_common_app/models/user_models/change_mobile.dart'; import 'package:mc_common_app/models/user_models/change_mobile.dart';
@ -53,7 +53,7 @@ abstract class UserRepo {
Future<ConfirmPasswordRespModel> forgetPassword(String userToken, String newPassword); Future<ConfirmPasswordRespModel> forgetPassword(String userToken, String newPassword);
Future<MResponse> changePassword(String currentPassword, String newPassword); Future<GenericRespModel> changePassword(String currentPassword, String newPassword);
Future<ChangeMobileRespModel> changeMobileNoOTPRequest(countryID, String mobileNo, String password); Future<ChangeMobileRespModel> changeMobileNoOTPRequest(countryID, String mobileNo, String password);
@ -65,7 +65,7 @@ abstract class UserRepo {
Future<VerifyEmailRespModel> emailVerify(String email, String userID); Future<VerifyEmailRespModel> emailVerify(String email, String userID);
Future<MResponse> emailVerifyOTPVerify(String userToken, String userOTP); Future<GenericRespModel> emailVerifyOTPVerify(String userToken, String userOTP);
Future<ImageResponse> updateUserImage(String image); Future<ImageResponse> updateUserImage(String image);
@ -211,7 +211,7 @@ class UserRepoImp implements UserRepo {
} }
@override @override
Future<MResponse> changePassword(String currentPassword, String newPassword) async { Future<GenericRespModel> changePassword(String currentPassword, String newPassword) async {
var postParams = { var postParams = {
"currentPassword": currentPassword, "currentPassword": currentPassword,
"newPassword": newPassword, "newPassword": newPassword,
@ -220,7 +220,7 @@ class UserRepoImp implements UserRepo {
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
debugPrint("token $t"); debugPrint("token $t");
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ChangePassword, postParams, token: t); return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.ChangePassword, postParams, token: t);
} }
@override @override
@ -268,11 +268,11 @@ class UserRepoImp implements UserRepo {
} }
@override @override
Future<MResponse> emailVerifyOTPVerify(String userToken, String userOTP) async { Future<GenericRespModel> emailVerifyOTPVerify(String userToken, String userOTP) async {
var postParams = {"userToken": userToken, "userOTP": userOTP}; var postParams = {"userToken": userToken, "userOTP": userOTP};
String t = AppState().getUser.data!.accessToken ?? ""; String t = AppState().getUser.data!.accessToken ?? "";
return await injector.get<ApiClient>().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.EmailVerifyOTPVerify, postParams, token: t); return await injector.get<ApiClient>().postJsonForObject((json) => GenericRespModel.fromJson(json), ApiConsts.EmailVerifyOTPVerify, postParams, token: t);
} }
@override @override

@ -2,7 +2,9 @@ import 'dart:io';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:geolocator/geolocator.dart';
import 'package:image_picker/image_picker.dart'; import 'package:image_picker/image_picker.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/utils/app_permission_handler.dart'; import 'package:mc_common_app/utils/app_permission_handler.dart';
abstract class CommonAppServices { abstract class CommonAppServices {
@ -12,8 +14,14 @@ abstract class CommonAppServices {
Future<List<File>?> pickMultipleFiles(BuildContext context); Future<List<File>?> pickMultipleFiles(BuildContext context);
Future<File?> pickFile(BuildContext context, Future<File?> pickFile(BuildContext context, {required FileType fileType, List<String>? allowedExtensions});
{required FileType fileType, List<String>? allowedExtensions});
double getDistanceBetween({
required double curLatitude,
required double curLongitude,
required double destLatitude,
required double destLongitude,
});
} }
class CommonServicesImp implements CommonAppServices { class CommonServicesImp implements CommonAppServices {
@ -66,16 +74,12 @@ class CommonServicesImp implements CommonAppServices {
} }
@override @override
Future<File?> pickFile(BuildContext context, Future<File?> pickFile(BuildContext context, {required FileType fileType, List<String>? allowedExtensions}) async {
{required FileType fileType, List<String>? allowedExtensions}) async {
FilePickerResult? result; FilePickerResult? result;
final status = await AppPermissions.checkStoragePermissions(context); final status = await AppPermissions.checkStoragePermissions(context);
if (status) { if (status) {
result = await FilePicker.platform.pickFiles( result = await FilePicker.platform.pickFiles(allowMultiple: true, type: fileType, allowedExtensions: allowedExtensions);
allowMultiple: true,
type: fileType,
allowedExtensions: allowedExtensions);
} }
List<File> pickedFiles = []; List<File> pickedFiles = [];
@ -86,6 +90,23 @@ class CommonServicesImp implements CommonAppServices {
} }
} }
} }
return pickedFiles.length > 0 ? pickedFiles.first : null; return pickedFiles.isNotEmpty ? pickedFiles.first : null;
}
@override
double getDistanceBetween({required double curLatitude, required double curLongitude, required double destLatitude, required double destLongitude}) {
try {
double distance = Geolocator.distanceBetween(
curLatitude,
curLongitude,
destLatitude,
destLongitude,
);
return distance ?? 0.0;
} catch (e) {
logger.e(e.toString());
return 0.0;
}
} }
} }

@ -22,8 +22,7 @@ class Utils {
static bool get isLoading => _isLoadingVisible; static bool get isLoading => _isLoadingVisible;
static void showToast(String message) { static void showToast(String message) {
Fluttertoast.showToast( Fluttertoast.showToast(msg: message, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 2, backgroundColor: Colors.black54, textColor: Colors.white, fontSize: 16.0);
msg: message, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 2, backgroundColor: Colors.black54, textColor: Colors.white, fontSize: 16.0);
} }
static Future<void> openNumberViaCaller({required String phoneNumber}) async { static Future<void> openNumberViaCaller({required String phoneNumber}) async {
@ -250,8 +249,52 @@ class Utils {
} }
} }
static statusContainerChip( static Color getChipColorByBranchStatus(BranchStatusEnum branchStatusEnum) {
{required String text, EdgeInsetsGeometry padding = const EdgeInsets.symmetric(vertical: 3, horizontal: 6), Color chipColor = MyColors.greenColor, Color textColor = MyColors.white}) { switch (branchStatusEnum) {
case BranchStatusEnum.pending:
return MyColors.adPendingStatusColor;
case BranchStatusEnum.review:
return MyColors.adPendingStatusColor;
case BranchStatusEnum.rejected:
return MyColors.adCancelledStatusColor;
case BranchStatusEnum.deactivated:
return MyColors.adCancelledStatusColor;
case BranchStatusEnum.blocked:
return MyColors.adPendingStatusColor;
case BranchStatusEnum.approvedOrActive:
return MyColors.greenColor;
}
}
static String getChipStatusTextByBranchStatus(BranchStatusEnum branchStatusEnum) {
switch (branchStatusEnum) {
case BranchStatusEnum.pending:
return "Pending Approval";
case BranchStatusEnum.review:
return "In Review";
case BranchStatusEnum.rejected:
return "Rejected";
case BranchStatusEnum.deactivated:
return "Deactivated";
case BranchStatusEnum.blocked:
return "Blocked";
case BranchStatusEnum.approvedOrActive:
return "Active";
}
}
static statusContainerChip({required String text, EdgeInsetsGeometry padding = const EdgeInsets.symmetric(vertical: 3, horizontal: 6), Color chipColor = MyColors.greenColor, Color textColor = MyColors.white}) {
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
color: chipColor, color: chipColor,

@ -13,7 +13,6 @@ import 'package:mc_common_app/models/appointments_models/appointment_slots.dart'
import 'package:mc_common_app/models/appointments_models/service_schedule_model.dart'; import 'package:mc_common_app/models/appointments_models/service_schedule_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/m_response.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/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';
@ -372,7 +371,7 @@ class AppointmentsVM extends BaseVM {
Future<void> getAppointmentSlotsInfo({required Map<String, dynamic> map, required BuildContext context, bool isNeedToRebuild = false}) async { Future<void> getAppointmentSlotsInfo({required Map<String, dynamic> map, required BuildContext context, bool isNeedToRebuild = false}) async {
if (isNeedToRebuild) setState(ViewState.busy); if (isNeedToRebuild) setState(ViewState.busy);
try { try {
MResponse genericRespModel = await appointmentRepo.getAppointmentSlots(map); GenericRespModel genericRespModel = await appointmentRepo.getAppointmentSlots(map);
if (genericRespModel.messageStatus == 1) { if (genericRespModel.messageStatus == 1) {
appointmentSlots = AppointmentSlots.fromJson(genericRespModel.data); appointmentSlots = AppointmentSlots.fromJson(genericRespModel.data);
} else { } else {
@ -395,7 +394,7 @@ class AppointmentsVM extends BaseVM {
updateAppointmentStatus(Map<String, dynamic> map, {bool isNeedToRebuild = false}) async { updateAppointmentStatus(Map<String, dynamic> map, {bool isNeedToRebuild = false}) async {
if (isNeedToRebuild) setState(ViewState.busy); if (isNeedToRebuild) setState(ViewState.busy);
try { try {
MResponse genericRespModel = await appointmentRepo.updateAppointmentStatus(map); GenericRespModel genericRespModel = await appointmentRepo.updateAppointmentStatus(map);
if (genericRespModel.messageStatus == 1) { if (genericRespModel.messageStatus == 1) {
Utils.showToast(LocaleKeys.appointmentStatusUpdated.tr()); Utils.showToast(LocaleKeys.appointmentStatusUpdated.tr());
@ -410,7 +409,7 @@ class AppointmentsVM extends BaseVM {
updateAppointmentPaymentStatus(Map<String, dynamic> map, {bool isNeedToRebuild = false}) async { updateAppointmentPaymentStatus(Map<String, dynamic> map, {bool isNeedToRebuild = false}) async {
if (isNeedToRebuild) setState(ViewState.busy); if (isNeedToRebuild) setState(ViewState.busy);
try { try {
MResponse genericRespModel = await appointmentRepo.updateAppointmentPaymentStatus(map); GenericRespModel genericRespModel = await appointmentRepo.updateAppointmentPaymentStatus(map);
if (genericRespModel.messageStatus == 1) { if (genericRespModel.messageStatus == 1) {
Utils.showToast(LocaleKeys.paymentStatusUpdated.tr()); Utils.showToast(LocaleKeys.paymentStatusUpdated.tr());
@ -422,9 +421,9 @@ class AppointmentsVM extends BaseVM {
} }
} }
Future<MResponse> createMergeAppointment(Map<String, dynamic> map, {bool isNeedToRebuild = false}) async { Future<GenericRespModel> createMergeAppointment(Map<String, dynamic> map, {bool isNeedToRebuild = false}) async {
if (isNeedToRebuild) setState(ViewState.busy); if (isNeedToRebuild) setState(ViewState.busy);
MResponse genericRespModel = await appointmentRepo.createMergeAppointment(map); GenericRespModel genericRespModel = await appointmentRepo.createMergeAppointment(map);
return genericRespModel; return genericRespModel;
} }
@ -848,7 +847,7 @@ class AppointmentsVM extends BaseVM {
notifyListeners(); notifyListeners();
} }
getBranchServices({required int categoryId}) async { Future<void> getBranchServices({required int categoryId}) async {
branchSelectedServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); branchSelectedServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: "");
isHomeTapped = false; isHomeTapped = false;
pickedHomeLocation = ""; pickedHomeLocation = "";
@ -1453,6 +1452,21 @@ class AppointmentsVM extends BaseVM {
} }
} }
List<ProviderProfileModel> myFavProvidersList = [];
Future<void> getMyFavoriteProviders() async {
myFavProvidersList.clear();
setState(ViewState.busy);
try {
myFavProvidersList = await branchRepo.getMyFavoriteProviders();
setState(ViewState.idle);
} catch (e, s) {
logger.e(s);
setState(ViewState.idle);
Utils.showToast(e.toString());
}
}
List<BranchRatingModel> currentBranchReviews = []; List<BranchRatingModel> currentBranchReviews = [];
bool isReadMoreEnabled = false; bool isReadMoreEnabled = false;

@ -379,6 +379,25 @@ class RequestsVM extends BaseVM {
} }
} }
String itemManufacturer = "";
void updateItemManufacturer(String value) {
itemManufacturer = value;
}
String serviceItem = "";
void updateServiceItem(String value) {
serviceItem = value;
}
String serviceItemCreatedOn = "";
void updateServiceItemCreatedOn(String value) {
serviceItemCreatedOn = value;
notifyListeners();
}
String offerDescription = ""; String offerDescription = "";
void updateOfferDescription(String value) { void updateOfferDescription(String value) {
@ -415,7 +434,9 @@ class RequestsVM extends BaseVM {
offerPrice = ""; offerPrice = "";
offerDescription = ""; offerDescription = "";
offerDescriptionError = ""; offerDescriptionError = "";
offerDescription = ""; serviceItem = "";
serviceItemCreatedOn = "";
itemManufacturer = "";
notifyListeners(); notifyListeners();
} }

@ -1,246 +1,11 @@
// import 'dart:convert';
// import 'dart:io';
//
// import 'package:car_provider_app/repositories/branch_repo.dart';
// import 'package:mc_common_app/models/m_response.dart';
//
// import 'package:mc_common_app/models/model/provider_model.dart';
// import 'package:mc_common_app/models/profile/categroy.dart';
// import 'package:mc_common_app/models/profile/document.dart';
// import 'package:mc_common_app/models/profile/services.dart';
// import 'package:mc_common_app/models/services/branch_model.dart';
// import 'package:mc_common_app/models/services/item_model.dart';
// import 'package:mc_common_app/models/services/service_model.dart';
// import 'package:mc_common_app/models/user/cities.dart';
// import 'package:mc_common_app/models/user/country.dart';
// import 'package:mc_common_app/repositories/common_repo.dart';
// import 'package:mc_common_app/services/common_services.dart';
// import 'package:mc_common_app/utils/enums.dart';
// import 'package:mc_common_app/utils/utils.dart';
// import 'package:mc_common_app/view_models/base_view_model.dart';
// import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
// import 'package:file_picker/file_picker.dart';
//
// class ServiceVM extends BaseVM {
// final BranchRepo branchRepo;
// final CommonAppServices commonServices;
// final CommonRepo commonRepo;
//
// ServiceVM({required this.branchRepo, required this.commonServices, required this.commonRepo});
//
// //Documents & Branches
// int selectedBranchStatus = 3;
// Document? document;
// ProviderModel? branchs;
// Country? country;
// Cities? cities;
// DropValue? countryValue;
// DropValue? cityValue;
// List<DropValue> countryDropList = [];
// List<DropValue> citiesDropList = [];
// double latitude = 0, longitude = 0;
// int role = -1, countryId = -1, cityId = -1;
// String countryCode = "", address = "", branchName = "", branchDescription = "";
//
// getServiceProviderDocument(int providerId) async {
// setState(ViewState.busy);
// document = await branchRepo.getServiceProviderDocument(providerId);
// setState(ViewState.idle);
// }
//
// selectFile(int index) async {
// File? file = await commonServices.pickFile(fileType: FileType.custom, allowedExtensions: ['png', 'pdf', 'jpeg']);
//
// if (file != null) {
// int sizeInBytes = file.lengthSync();
// // double sizeInMb = sizeInBytes / (1024 * 1024);
// if (sizeInBytes > 1000) {
// Utils.showToast("File is larger then 1KB");
// } else {
// document!.data![index].document = Utils.convertFileToBase64(file);
// document!.data![index].fileExt = Utils.checkFileExt(file.path);
// document!.data![index].documentUrl = file.path;
// setState(ViewState.idle);
// }
// } else {
// // User canceled the picker
// }
// }
//
// Future<MResponse> updateDocument(List<DocumentData>? data) async {
// return await branchRepo.serviceProviderDocumentsUpdate(data);
// }
//
// //Create new branch
// getBranchAndServices() async {
// setState(ViewState.busy);
// branchs = await branchRepo.getBranchAndServices();
// setState(ViewState.idle);
// }
//
// getAllCountriesList(BranchModel? branchData, String countryCode) async {
// setState(ViewState.busy);
// resetValues();
// country = await commonRepo.getAllCountries();
// country!.data?.forEach((element) {
// if (branchData != null) if (branchData.id != null) {
// if (element.id == branchData.countryID) {
// countryValue = DropValue(element.id ?? 0, countryCode == "SA" ? (element.countryNameN ?? "") : (element.countryName ?? ""), element.countryCode ?? "");
// }
// }
// countryDropList.add(DropValue(element.id ?? 0, countryCode == "SA" ? (element.countryNameN ?? "") : (element.countryName ?? ""), element.countryCode ?? ""));
// });
// if (branchData != null) if (branchData.id != null) getAllCities(branchData, countryCode);
// setState(ViewState.idle);
// }
//
// getAllCities(BranchModel? branchData, String countryCode) async {
// setState(ViewState.busy);
// citiesDropList.clear();
// cities = null;
// cityId = -1;
// cities = await commonRepo.getAllCites(countryId.toString());
// cities!.data?.forEach((element) {
// if (branchData != null && branchData.id != null) {
// if (element.id == branchData.cityId) {
// address = branchData.address!;
// branchName = branchData.branchName!;
// branchDescription = branchData.branchDescription!;
// latitude = double.parse(branchData.latitude ?? "");
// longitude = double.parse(branchData.longitude ?? "");
// countryId = branchData.countryID!;
// cityId = branchData.cityId!;
// cityValue = DropValue(element.id ?? 0, countryCode == "SA" ? (element.cityNameN ?? "") : (element.cityName ?? ""), element.id.toString() ?? "");
// }
// }
// citiesDropList.add(DropValue(element.id ?? 0, countryCode == "SA" ? (element.cityNameN ?? "") : (element.cityName ?? ""), element.id.toString() ?? ""));
// });
// setState(ViewState.idle);
// }
//
// Future<MResponse> createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async {
// return await branchRepo.createBranch(branchName, branchDescription, cityId.toString(), address, latitude.toString(), longitude.toString());
// }
//
// Future<MResponse> updateBranch(int id, String branchName, String branchDescription, String cityId, String address, String latitude, String longitude, {bool isNeedToDelete = true}) async {
// return await branchRepo.updateBranch(id ?? 0, branchName, branchDescription, cityId.toString(), address, latitude.toString(), longitude.toString());
// }
//
// resetValues() {
// countryCode = "";
// address = "";
// branchName = "";
// branchDescription = "";
// latitude = 0;
// longitude = 0;
// role = -1;
// countryId = -1;
// cityId = -1;
// countryDropList.clear();
// countryId = -1;
// cityId = -1;
// cities = null;
// categoryDropList = [];
// servicesDropList = [];
// services = null;
// }
//
// //Create Services
// Services? services;
// List<DropValue> categoryDropList = [];
// List<DropValue> servicesDropList = [];
//
// fetchBranchCategory(String countryCode) async {
// categoryDropList.clear();
// servicesDropList = [];
// services = null;
// setState(ViewState.busy);
// Category? category = await branchRepo.fetchBranchCategory();
// category.data?.forEach((element) {
// categoryDropList.add(DropValue(
// element.id ?? 0,
// ((element.categoryName!.isEmpty
// ? "N/A"
// : countryCode == "SA"
// ? element.categoryNameN
// : element.categoryName) ??
// "N/A"),
// ""));
// });
// setState(ViewState.idle);
// }
//
// fetchServicesByCategoryId(String categoryId) async {
// servicesDropList = [];
// setState(ViewState.busy);
// services = await branchRepo.fetchServicesByCategoryId(categoryId);
//
// for (var element in services!.data!) {
// servicesDropList.add(DropValue(element.id ?? 0, element.description ?? "N/aA", ""));
// }
// setState(ViewState.idle);
// }
//
// Future<MResponse> createService(List<Map<String, dynamic>> map) async {
// return await branchRepo.createService(map);
// }
//
// Future<MResponse> updateServices(List<Map<String, dynamic>> map) async {
// return await branchRepo.updateService(map);
// }
//
// updateSelectedBranchType(int status) {
// selectedBranchStatus = status;
// notifyListeners();
// }
//
// List<ServiceModel>? matchedServices;
// bool isAllSelected = false;
//
// getAllMatchedServices(int oldBranchId, int newBranchId, int categoryId) async {
// matchedServices = null;
// MResponse response = await branchRepo.getMatchedServices(oldBranchId, newBranchId, categoryId);
// matchedServices = [];
// if (response.messageStatus == 1) {
// matchedServices = List<ServiceModel>.from(response.data.map((x) => ServiceModel.fromJson(x)));
// }
// notifyListeners();
// }
//
// selectAllServices(bool value) {
// for (var element in matchedServices!) {
// element.isExpandedOrSelected = value;
// for (var item in element.serviceItems!) {
// item.isUpdateOrSelected = value;
// }
// }
// isAllSelected = value;
// notifyListeners();
// }
//
// updateServiceItem(int serviceIndex, bool value) {
// for (var element in matchedServices![serviceIndex].serviceItems!) {
// element.isUpdateOrSelected = value;
// }
// notifyListeners();
// }
//
// copyItems(int index, List<ItemData> copiedItems) {
// matchedServices![index].serviceItems = copiedItems;
// notifyListeners();
// }
//
// Future<MResponse> duplicateItems(Map<String, dynamic> map) async {
// return await branchRepo.duplicateItems(map);
// }
// }
import 'dart:io'; import 'dart:io';
import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.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/general_models/generic_resp_model.dart';
import 'package:mc_common_app/repositories/branch_repo.dart'; import 'package:mc_common_app/repositories/branch_repo.dart';
import 'package:file_picker/file_picker.dart'; import 'package:file_picker/file_picker.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:mc_common_app/models/general_models/m_response.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/profile/categroy.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/categroy.dart';
import 'package:mc_common_app/models/provider_branches_models/profile/document.dart'; import 'package:mc_common_app/models/provider_branches_models/profile/document.dart';
@ -255,7 +20,9 @@ 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/utils/app_permission_handler.dart'; import 'package:mc_common_app/utils/app_permission_handler.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/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/dropdown/dropdow_field.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
@ -291,12 +58,49 @@ class ServiceVM extends BaseVM {
String branchName = ""; String branchName = "";
String branchDescription = ""; String branchDescription = "";
double getDistanceFromMe({
required String destLatitude,
required String destLongitude,
}) {
double distance = commonServices.getDistanceBetween(
curLatitude: AppState().currentLocation.latitude,
curLongitude: AppState().currentLocation.longitude,
destLatitude: double.parse(destLatitude),
destLongitude: double.parse(destLongitude),
);
return distance;
}
Future<void> getServiceProviderDocument(int providerId) async { Future<void> getServiceProviderDocument(int providerId) async {
setState(ViewState.busy); setState(ViewState.busy);
document = await branchRepo.getServiceProviderDocument(providerId); document = await branchRepo.getServiceProviderDocument(providerId);
setState(ViewState.idle); setState(ViewState.idle);
} }
List<ImageModel> pickedBranchImages = [];
String branchImageError = "";
void removeImageFromList(String filePath) {
int index = pickedBranchImages.indexWhere((element) => element.filePath == filePath);
if (index == -1) {
return;
}
pickedBranchImages.removeAt(index);
notifyListeners();
}
void pickMultipleImages() async {
List<ImageModel> imageModels = [];
List<File> images = await commonServices.pickMultipleImages();
for (var element in images) {
imageModels.add(ImageModel(filePath: element.path, isFromNetwork: false));
}
pickedBranchImages.addAll(imageModels);
if (pickedBranchImages.isNotEmpty) branchImageError = "";
notifyListeners();
}
Future<void> selectFile(BuildContext context, int index) async { Future<void> selectFile(BuildContext context, int index) async {
final status = await AppPermissions.checkStoragePermissions(context); final status = await AppPermissions.checkStoragePermissions(context);
if (status) { if (status) {
@ -305,23 +109,6 @@ class ServiceVM extends BaseVM {
fileType: FileType.custom, fileType: FileType.custom,
allowedExtensions: ['png', 'pdf', 'jpeg'], allowedExtensions: ['png', 'pdf', 'jpeg'],
); );
// if (result != null) {
// final File file = File(result.files.single.path!);
// final int sizeInBytes = file.lengthSync();
//
// if (sizeInBytes > 1000) {
// Utils.showToast("File is larger than 1KB");
// } else {
// document!.data![index].document = Utils.convertFileToBase64(file);
// document!.data![index].fileExt = Utils.checkFileExt(file.path);
// document!.data![index].documentUrl = file.path;
// setState(ViewState.idle);
// }
// } else {
// // User canceled the picker
// }
if (file != null) { if (file != null) {
int sizeInBytes = file.lengthSync(); int sizeInBytes = file.lengthSync();
// double sizeInMb = sizeInBytes / (1024 * 1024); // double sizeInMb = sizeInBytes / (1024 * 1024);
@ -339,7 +126,7 @@ class ServiceVM extends BaseVM {
} }
} }
Future<MResponse> updateDocument(List<DocumentData>? data) async { Future<GenericRespModel> updateDocument(List<DocumentData>? data) async {
return await branchRepo.serviceProviderDocumentsUpdate(data); return await branchRepo.serviceProviderDocumentsUpdate(data);
} }
@ -362,9 +149,7 @@ class ServiceVM extends BaseVM {
countryId = element.id ?? -1; countryId = element.id ?? -1;
countryValue = DropValue( countryValue = DropValue(
element.id ?? 0, element.id ?? 0,
countryCode == "SA" countryCode == "SA" ? (element.countryNameN ?? "") : (element.countryName ?? ""),
? (element.countryNameN ?? "")
: (element.countryName ?? ""),
element.countryCode ?? "", element.countryCode ?? "",
); );
} }
@ -372,9 +157,7 @@ class ServiceVM extends BaseVM {
countryDropList.add( countryDropList.add(
DropValue( DropValue(
element.id ?? 0, element.id ?? 0,
countryCode == "SA" countryCode == "SA" ? (element.countryNameN ?? "") : (element.countryName ?? ""),
? (element.countryNameN ?? "")
: (element.countryName ?? ""),
element.countryCode ?? "", element.countryCode ?? "",
), ),
); );
@ -404,43 +187,34 @@ class ServiceVM extends BaseVM {
cityId = branchData.cityId!; cityId = branchData.cityId!;
cityValue = DropValue( cityValue = DropValue(
element.id ?? 0, element.id ?? 0,
countryCode == "SA" countryCode == "SA" ? (element.cityNameN ?? "") : (element.cityName ?? ""),
? (element.cityNameN ?? "") (element.id ?? "").toString(),
: (element.cityName ?? ""),
element.id.toString() ?? "",
); );
} }
} }
citiesDropList.add( citiesDropList.add(
DropValue( DropValue(
element.id ?? 0, element.id ?? 0,
countryCode == "SA" countryCode == "SA" ? (element.cityNameN ?? "") : (element.cityName ?? ""),
? (element.cityNameN ?? "") (element.id ?? "").toString(),
: (element.cityName ?? ""),
element.id.toString() ?? "",
), ),
); );
}); });
setState(ViewState.idle); setState(ViewState.idle);
} }
Future<MResponse> createBranch(String branchName, String branchDescription, Future<GenericRespModel> updateBranch(
String cityId, String address, String latitude, String longitude) async { int id,
return await branchRepo.createBranch(branchName, branchDescription, String branchName,
cityId.toString(), address, latitude.toString(), longitude.toString()); String branchDescription,
} String cityId,
String address,
Future<MResponse> updateBranch(int id, String latitude,
String branchName, String longitude, {
String branchDescription, bool isNeedToDelete = true,
String cityId, }) async {
String address,
String latitude,
String longitude, {
bool isNeedToDelete = true,
}) async {
return await branchRepo.updateBranch( return await branchRepo.updateBranch(
id ?? 0, id,
branchName, branchName,
branchDescription, branchDescription,
cityId.toString(), cityId.toString(),
@ -485,10 +259,10 @@ class ServiceVM extends BaseVM {
DropValue( DropValue(
element.id ?? 0, element.id ?? 0,
((element.categoryName!.isEmpty ((element.categoryName!.isEmpty
? "N/A" ? "N/A"
: countryCode == "SA" : countryCode == "SA"
? element.categoryNameN ? element.categoryNameN
: element.categoryName) ?? : element.categoryName) ??
"N/A"), "N/A"),
"", "",
), ),
@ -500,8 +274,7 @@ class ServiceVM extends BaseVM {
Future<void> fetchServicesByCategoryId(int categoryId) async { Future<void> fetchServicesByCategoryId(int categoryId) async {
servicesDropList = []; servicesDropList = [];
setState(ViewState.busy); setState(ViewState.busy);
services = await branchRepo.fetchServicesByCategoryId( services = await branchRepo.fetchServicesByCategoryId(serviceCategoryId: categoryId); // to get all the services
serviceCategoryId: categoryId); // to get all the services
for (var element in services!.data!) { for (var element in services!.data!) {
servicesDropList.add( servicesDropList.add(
DropValue( DropValue(
@ -532,11 +305,11 @@ class ServiceVM extends BaseVM {
setState(ViewState.idle); setState(ViewState.idle);
} }
Future<MResponse> createService(List<Map<String, dynamic>> map) async { Future<GenericRespModel> createService(List<Map<String, dynamic>> map) async {
return await branchRepo.createService(map); return await branchRepo.createService(map);
} }
Future<MResponse> updateServices(List<Map<String, dynamic>> map) async { Future<GenericRespModel> updateServices(List<Map<String, dynamic>> map) async {
return await branchRepo.updateService(map); return await branchRepo.updateService(map);
} }
@ -550,13 +323,11 @@ class ServiceVM extends BaseVM {
Future<void> getAllMatchedServices(int oldBranchId, int newBranchId, int categoryId) async { Future<void> getAllMatchedServices(int oldBranchId, int newBranchId, int categoryId) async {
matchedServices = null; matchedServices = null;
final MResponse response = await branchRepo.getMatchedServices( final GenericRespModel response = await branchRepo.getMatchedServices(oldBranchId, newBranchId, categoryId);
oldBranchId, newBranchId, categoryId);
matchedServices = []; matchedServices = [];
if (response.messageStatus == 1) { if (response.messageStatus == 1) {
matchedServices = List<ServiceModel>.from( matchedServices = List<ServiceModel>.from(response.data.map((x) => ServiceModel.fromJson(x)));
response.data.map((x) => ServiceModel.fromJson(x)));
} }
notifyListeners(); notifyListeners();
} }
@ -584,7 +355,7 @@ class ServiceVM extends BaseVM {
notifyListeners(); notifyListeners();
} }
Future<MResponse> duplicateItems(Map<String, dynamic> map) async { Future<GenericRespModel> duplicateItems(Map<String, dynamic> map) async {
return await branchRepo.duplicateItems(map); return await branchRepo.duplicateItems(map);
} }
@ -594,38 +365,89 @@ class ServiceVM extends BaseVM {
getAllProviderDealers(Map<String, dynamic> map) async { getAllProviderDealers(Map<String, dynamic> map) async {
setState(ViewState.busy); setState(ViewState.busy);
MResponse response = await branchRepo.getAllProviderDealers(map); GenericRespModel response = await branchRepo.getAllProviderDealers(map);
if (response.messageStatus == 1) { if (response.messageStatus == 1) {
allProviderDealersList = []; allProviderDealersList = [];
allProviderDealersList = List<BranchUser>.from( allProviderDealersList = List<BranchUser>.from(response.data.map((x) => BranchUser.fromJson(x)));
response.data.map((x) => BranchUser.fromJson(x)));
} }
setState(ViewState.idle); setState(ViewState.idle);
} }
Future<void> getBranchUsers(Map<String, dynamic> map) async { Future<void> getBranchUsers(Map<String, dynamic> map) async {
setState(ViewState.busy); setState(ViewState.busy);
MResponse response = await branchRepo.getBranchUsers(map); GenericRespModel response = await branchRepo.getBranchUsers(map);
if (response.messageStatus == 1) { if (response.messageStatus == 1) {
branchUserList = []; branchUserList = [];
branchUserList = List<BranchUser>.from( branchUserList = List<BranchUser>.from(response.data.map((x) => BranchUser.fromJson(x)));
response.data.map((x) => BranchUser.fromJson(x)));
} }
setState(ViewState.idle); setState(ViewState.idle);
} }
Future<MResponse> assignDealerToBranch(Map<String, dynamic> map) async { Future<GenericRespModel> assignDealerToBranch(Map<String, dynamic> map) async {
MResponse response = await branchRepo.assignDealerToBranch(map); GenericRespModel response = await branchRepo.assignDealerToBranch(map);
return response; return response;
} }
Future<MResponse> removeDealerFromBranch(Map<String, dynamic> map) async { Future<GenericRespModel> removeDealerFromBranch(Map<String, dynamic> map) async {
MResponse response = await branchRepo.removeDealerFromBranch(map); GenericRespModel response = await branchRepo.removeDealerFromBranch(map);
return response; return response;
} }
Future<MResponse> addNewServiceInAppointment(Map<String, dynamic> map) async { Future<GenericRespModel> addNewServiceInAppointment(Map<String, dynamic> map) async {
MResponse response = await branchRepo.addNewServicesInAppointment(map); GenericRespModel response = await branchRepo.addNewServicesInAppointment(map);
return response; return response;
} }
Future<void> onCreateBranchPressed({
required BuildContext context,
required String branchName,
required String branchDesc,
required int cityID,
required String address,
required double latitude,
required double longitude,
}) async {
Utils.showLoading(context);
GenericRespModel res = await branchRepo.createBranch(branchName, branchDesc, cityID.toString(), address, latitude.toString(), longitude.toString());
Utils.hideLoading(context);
if (res.messageStatus == 1) {
Utils.showToast(LocaleKeys.branch_created.tr());
updateSelectedBranchType(1);
pop(context);
getBranchAndServices();
} else {
Utils.showToast(res.message ?? "");
}
}
Future<void> onUpdateBranchPressed({
required BuildContext context,
required int branchID,
required String branchName,
required String branchDesc,
required int cityID,
required String address,
required double latitude,
required String longitude,
}) async {
Utils.showLoading(context);
GenericRespModel res = await updateBranch(
branchID ?? 0,
branchName,
branchDescription,
cityId.toString(),
address,
latitude.toString(),
longitude.toString(),
);
Utils.hideLoading(context);
if (res.messageStatus == 1) {
Utils.showToast(LocaleKeys.branch_updated.tr());
pop(context);
pop(context);
getBranchAndServices();
} else {
Utils.showToast(res.message ?? "");
}
}
} }

@ -1,7 +1,7 @@
import 'dart:convert'; import 'dart:convert';
import 'package:mc_common_app/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/models/general_models/m_response.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/models/subscriptions_models/branch_user_selection_model.dart'; import 'package:mc_common_app/models/subscriptions_models/branch_user_selection_model.dart';
import 'package:mc_common_app/models/subscriptions_models/provider_subscription_model.dart'; import 'package:mc_common_app/models/subscriptions_models/provider_subscription_model.dart';
import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart'; import 'package:mc_common_app/models/subscriptions_models/subscription_model.dart';
@ -17,7 +17,7 @@ class SubscriptionsVM extends BaseVM {
//All Subscriptions //All Subscriptions
int selectedIndex = 0; int selectedIndex = 0;
late DropValue selectedMothlyTab; late DropValue selectedMonthlyTab;
List<DropValue> monthlyTabs = []; List<DropValue> monthlyTabs = [];
late SubscriptionModel allSubscriptions; late SubscriptionModel allSubscriptions;
List<ProviderSubscriptionModel> mySubscriptionsBySp = []; List<ProviderSubscriptionModel> mySubscriptionsBySp = [];
@ -40,7 +40,7 @@ class SubscriptionsVM extends BaseVM {
} }
monthlyTabs.sort((a, b) => a.value.compareTo(b.value)); monthlyTabs.sort((a, b) => a.value.compareTo(b.value));
monthlyTabs.first.isEnabled = true; monthlyTabs.first.isEnabled = true;
selectedMothlyTab = monthlyTabs.first; selectedMonthlyTab = monthlyTabs.first;
filterSubscriptions(); filterSubscriptions();
setState(ViewState.idle); setState(ViewState.idle);
} else { } else {
@ -62,7 +62,7 @@ class SubscriptionsVM extends BaseVM {
} }
monthlyTabs.sort((a, b) => a.value.compareTo(b.value)); monthlyTabs.sort((a, b) => a.value.compareTo(b.value));
monthlyTabs.first.isEnabled = true; monthlyTabs.first.isEnabled = true;
selectedMothlyTab = monthlyTabs.first; selectedMonthlyTab = monthlyTabs.first;
filterSubscriptions(); filterSubscriptions();
setState(ViewState.idle); setState(ViewState.idle);
@ -75,16 +75,16 @@ class SubscriptionsVM extends BaseVM {
calculationUpgradePrice(String? serviceProviderID, String? newSubscription) async { calculationUpgradePrice(String? serviceProviderID, String? newSubscription) async {
setState(ViewState.busy); setState(ViewState.busy);
MResponse mResponse = await subscriptionRepo.calculationUpgradePrice(serviceProviderID, newSubscription); GenericRespModel genericRespModel = await subscriptionRepo.calculationUpgradePrice(serviceProviderID, newSubscription);
if (mResponse.messageStatus == 1) { if (genericRespModel.messageStatus == 1) {
setState(ViewState.idle); setState(ViewState.idle);
newPrice = mResponse.data.toString(); newPrice = genericRespModel.data.toString();
} else { } else {
setState(ViewState.error); setState(ViewState.error);
} }
} }
Future<MResponse> payForSubscription(int subscriptionId, bool isStartNow, bool isReview, String amount, {bool isDegrade = false, List<int>? listOfBranches, List<int>? listOfUsers}) async { Future<GenericRespModel> payForSubscription(int subscriptionId, bool isStartNow, bool isReview, String amount, {bool isDegrade = false, List<int>? listOfBranches, List<int>? listOfUsers}) async {
Map<String, dynamic> map; Map<String, dynamic> map;
if (isDegrade) { if (isDegrade) {
map = { map = {
@ -111,24 +111,19 @@ class SubscriptionsVM extends BaseVM {
// "listOfUsers": [] // "listOfUsers": []
}; };
} }
MResponse mResponse = await subscriptionRepo.payForProviderSubscription(map); GenericRespModel genericRespModel = await subscriptionRepo.payForProviderSubscription(map);
return mResponse; return genericRespModel;
} }
Future<MResponse> createSubscriptionOrder(int subscriptionId, bool isStartNow, bool isRenew, {bool isDegrade = false, List<int>? listOfBranches, List<int>? listOfUsers}) async { Future<GenericRespModel> createSubscriptionOrder(int subscriptionId, bool isStartNow, bool isRenew, {bool isDegrade = false, List<int>? listOfBranches, List<int>? listOfUsers}) async {
Map<String, dynamic> map = { Map<String, dynamic> map = {"providerID": AppState().getUser.data?.userInfo?.providerId.toString() ?? "", "subscriptionID": subscriptionId.toString(), "isStartNow": isStartNow.toString(), "isRenew": isRenew.toString()};
"providerID": AppState().getUser.data?.userInfo?.providerId.toString() ?? "", GenericRespModel genericRespModel = await subscriptionRepo.payForProviderSubscription(map);
"subscriptionID": subscriptionId.toString(), return genericRespModel;
"isStartNow": isStartNow.toString(),
"isRenew": isRenew.toString()
};
MResponse mResponse = await subscriptionRepo.payForProviderSubscription(map);
return mResponse;
} }
List<BranchSelectionModel>? branchSelectionList; List<BranchSelectionModel>? branchSelectionList;
getSPBranchUser_Get() async { getSPBranchUserGet() async {
branchSelectionList = null; branchSelectionList = null;
Map<String, String> map = { Map<String, String> map = {
// "id": subscription.id.toString(), // "id": subscription.id.toString(),
@ -137,7 +132,7 @@ class SubscriptionsVM extends BaseVM {
// "listOfBranches": [], // "listOfBranches": [],
// "listOfUsers": [] // "listOfUsers": []
}; };
branchSelectionList = await subscriptionRepo.getSPBranchUser_Get(map); branchSelectionList = await subscriptionRepo.getSPBranchUserGet(map);
if (branchSelectionList!.isNotEmpty) { if (branchSelectionList!.isNotEmpty) {
branchSelectionList!.first.isOpend = true; branchSelectionList!.first.isOpend = true;
} }
@ -148,15 +143,15 @@ class SubscriptionsVM extends BaseVM {
final int months = days ~/ 30; final int months = days ~/ 30;
final int remainingDays = days % 30; final int remainingDays = days % 30;
String _result = months > 0 ? '$months Month${months > 1 ? 's' : ''}${remainingDays > 0 ? ' & ' : ''}' : ''; String result = months > 0 ? '$months Month${months > 1 ? 's' : ''}${remainingDays > 0 ? ' & ' : ''}' : '';
_result += remainingDays > 0 ? '$remainingDays Day${remainingDays > 1 ? 's' : ''}' : ''; result += remainingDays > 0 ? '$remainingDays Day${remainingDays > 1 ? 's' : ''}' : '';
return _result; return result;
} }
filterSubscriptions() { filterSubscriptions() {
tempSubscriptions.clear(); tempSubscriptions.clear();
for (var element in allSubscriptions.data!) { for (var element in allSubscriptions.data!) {
if (selectedMothlyTab.id == element.durationDays) { if (selectedMonthlyTab.id == element.durationDays) {
tempSubscriptions.add(element); tempSubscriptions.add(element);
} }
if (element.id == AppState().getproviderSubscription.first.subscriptionID) { if (element.id == AppState().getproviderSubscription.first.subscriptionID) {

@ -11,7 +11,8 @@ 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/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/main.dart'; import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/models/general_models/m_response.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/user_models/basic_otp.dart'; import 'package:mc_common_app/models/user_models/basic_otp.dart';
import 'package:mc_common_app/models/user_models/change_email.dart'; import 'package:mc_common_app/models/user_models/change_email.dart';
import 'package:mc_common_app/models/user_models/change_mobile.dart'; import 'package:mc_common_app/models/user_models/change_mobile.dart';
@ -140,7 +141,7 @@ class UserVM extends BaseVM {
Future<void> changeUserPassword(BuildContext context, String newPassword, String currentPassword) async { Future<void> changeUserPassword(BuildContext context, String newPassword, String currentPassword) async {
if (Utils.passwordValidateStructure(newPassword)) { if (Utils.passwordValidateStructure(newPassword)) {
Utils.showLoading(context); Utils.showLoading(context);
MResponse res = await userRepo.changePassword(currentPassword, newPassword); GenericRespModel res = await userRepo.changePassword(currentPassword, newPassword);
Utils.hideLoading(context); Utils.hideLoading(context);
if (res.messageStatus == 1) { if (res.messageStatus == 1) {
Utils.showToast(LocaleKeys.passwordIsUpdated.tr()); Utils.showToast(LocaleKeys.passwordIsUpdated.tr());
@ -270,7 +271,7 @@ class UserVM extends BaseVM {
onClick: (String code) async { onClick: (String code) async {
pop(context); pop(context);
Utils.showLoading(context); Utils.showLoading(context);
MResponse otpCompare = await userRepo.emailVerifyOTPVerify(otpRequest.data!.userToken ?? "", code); GenericRespModel otpCompare = await userRepo.emailVerifyOTPVerify(otpRequest.data!.userToken ?? "", code);
Utils.hideLoading(context); Utils.hideLoading(context);
if (otpCompare.messageStatus == 1) { if (otpCompare.messageStatus == 1) {
AppState().getUser.data!.userInfo!.isEmailVerified = true; AppState().getUser.data!.userInfo!.isEmailVerified = true;

@ -118,7 +118,7 @@ class _AdsDetailViewState extends State<AdsDetailView> {
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
AdImagesCorouselWidget(vehicleImages: widget.adDetails.vehicle!.image!), ImagesCorouselWidget(imagesList: widget.adDetails.vehicle!.image!),
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [

@ -2,17 +2,18 @@ import 'package:carousel_slider/carousel_slider.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class AdImagesCorouselWidget extends StatefulWidget { class ImagesCorouselWidget extends StatefulWidget {
final List<AdImage> vehicleImages; final List<AdImage> imagesList;
const AdImagesCorouselWidget({super.key, required this.vehicleImages}); const ImagesCorouselWidget({super.key, required this.imagesList});
@override @override
State<StatefulWidget> createState() => _CarouselWithIndicatorState(); State<StatefulWidget> createState() => _CarouselWithIndicatorState();
} }
class _CarouselWithIndicatorState extends State<AdImagesCorouselWidget> { class _CarouselWithIndicatorState extends State<ImagesCorouselWidget> {
int _current = 0; int _current = 0;
final CarouselController _controller = CarouselController(); final CarouselController _controller = CarouselController();
@ -20,21 +21,14 @@ class _CarouselWithIndicatorState extends State<AdImagesCorouselWidget> {
Widget build(BuildContext context) { Widget build(BuildContext context) {
return Column(children: [ return Column(children: [
CarouselSlider( CarouselSlider(
items: widget.vehicleImages items: widget.imagesList
.map((item) => Container( .map((item) => Container(
margin: const EdgeInsets.all(5.0), margin: const EdgeInsets.all(5.0),
child: ClipRRect( child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(5.0)), borderRadius: const BorderRadius.all(Radius.circular(5.0)),
child: Image.network( child: item.imageUrl.buildNetworkImage(
item.imageUrl!, height: 80,
fit: BoxFit.cover, width: 80,
errorBuilder: (BuildContext context, Object exception, StackTrace? stackTrace) {
return const SizedBox(
width: 80,
height: 80,
child: Icon(Icons.error_outline),
);
},
), ),
), ),
)) ))
@ -52,7 +46,7 @@ class _CarouselWithIndicatorState extends State<AdImagesCorouselWidget> {
), ),
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: widget.vehicleImages.asMap().entries.map((entry) { children: widget.imagesList.asMap().entries.map((entry) {
return GestureDetector( return GestureDetector(
onTap: () => _controller.animateToPage(entry.key), onTap: () => _controller.animateToPage(entry.key),
child: Container( child: Container(

@ -6,7 +6,7 @@ import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/widgets/button/show_fill_button.dart'; import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/common_widgets/provider_details_card.dart'; import 'package:mc_common_app/widgets/common_widgets/branch_details_card.dart';
import 'package:mc_common_app/widgets/common_widgets/time_slots.dart'; import 'package:mc_common_app/widgets/common_widgets/time_slots.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'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
@ -40,7 +40,7 @@ class _BookProviderAppViewState extends State<BookProviderAppView> {
Expanded( Expanded(
child: ListView( child: ListView(
children: [ children: [
ProviderDetailsCard( BranchDetailCard(
onCardTapped: () {}, onCardTapped: () {},
providerImageUrl: MyAssets.bnCar, providerImageUrl: MyAssets.bnCar,
providerLocation: "3km", providerLocation: "3km",

@ -33,9 +33,7 @@ class CreateRequestPage extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
LocaleKeys.vehicleDetails LocaleKeys.vehicleDetails.tr().toText(fontSize: 18, isBold: true),
.tr()
.toText(fontSize: 18, isBold: true),
8.height, 8.height,
if (requestsVM.isFetchingRequestType) ...[ if (requestsVM.isFetchingRequestType) ...[
const Center( const Center(
@ -45,24 +43,12 @@ class CreateRequestPage extends StatelessWidget {
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> requestTypeDrop = []; List<DropValue> requestTypeDrop = [];
for (var element in requestsVM.myRequestsTypeEnum) { for (var element in requestsVM.myRequestsTypeEnum) {
requestTypeDrop.add(DropValue( requestTypeDrop.add(DropValue(element.enumValue.toInt() ?? 0, element.enumValueStr ?? "", ""));
element.enumValue.toInt() ?? 0,
element.enumValueStr ?? "",
""));
} }
return DropdownField( return DropdownField(
(DropValue value) => requestsVM (DropValue value) => requestsVM.updateSelectionRequestTypeId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
.updateSelectionRequestTypeId(SelectionModel(
selectedId: value.id,
selectedOption: value.value)),
list: requestTypeDrop, list: requestTypeDrop,
dropdownValue: dropdownValue: requestsVM.requestTypeId.selectedId != -1 ? DropValue(requestsVM.requestTypeId.selectedId, requestsVM.requestTypeId.selectedOption, "") : null,
requestsVM.requestTypeId.selectedId != -1
? DropValue(
requestsVM.requestTypeId.selectedId,
requestsVM.requestTypeId.selectedOption,
"")
: null,
hint: LocaleKeys.requestType.tr(), hint: LocaleKeys.requestType.tr(),
errorValue: requestsVM.requestTypeId.errorValue, errorValue: requestsVM.requestTypeId.errorValue,
); );
@ -78,24 +64,12 @@ class CreateRequestPage extends StatelessWidget {
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleTypeDrop = []; List<DropValue> vehicleTypeDrop = [];
for (var element in requestsVM.vehicleTypes) { for (var element in requestsVM.vehicleTypes) {
vehicleTypeDrop.add(DropValue( vehicleTypeDrop.add(DropValue(element.id?.toInt() ?? 0, element.vehicleTypeName ?? "", ""));
element.id?.toInt() ?? 0,
element.vehicleTypeName ?? "",
""));
} }
return DropdownField( return DropdownField(
(DropValue value) => requestsVM (DropValue value) => requestsVM.updateSelectionVehicleTypeId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
.updateSelectionVehicleTypeId(SelectionModel(
selectedId: value.id,
selectedOption: value.value)),
list: vehicleTypeDrop, list: vehicleTypeDrop,
dropdownValue: dropdownValue: requestsVM.vehicleTypeId.selectedId != -1 ? DropValue(requestsVM.vehicleTypeId.selectedId, requestsVM.vehicleTypeId.selectedOption, "") : null,
requestsVM.vehicleTypeId.selectedId != -1
? DropValue(
requestsVM.vehicleTypeId.selectedId,
requestsVM.vehicleTypeId.selectedOption,
"")
: null,
hint: LocaleKeys.vehicleType.tr(), hint: LocaleKeys.vehicleType.tr(),
errorValue: requestsVM.vehicleTypeId.errorValue, errorValue: requestsVM.vehicleTypeId.errorValue,
); );
@ -113,167 +87,78 @@ class CreateRequestPage extends StatelessWidget {
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleBrandsDrop = []; List<DropValue> vehicleBrandsDrop = [];
for (var element in requestsVM.vehicleBrands) { for (var element in requestsVM.vehicleBrands) {
vehicleBrandsDrop.add(DropValue( vehicleBrandsDrop.add(DropValue(element.id?.toInt() ?? 0, element.vehicleBrandDescription ?? "", ""));
element.id?.toInt() ?? 0,
element.vehicleBrandDescription ?? "",
""));
} }
return DropdownField( return DropdownField(
(DropValue value) => (DropValue value) => requestsVM.updateSelectionVehicleBrandId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
requestsVM.updateSelectionVehicleBrandId(
SelectionModel(
selectedId: value.id,
selectedOption: value.value)),
list: vehicleBrandsDrop, list: vehicleBrandsDrop,
dropdownValue: dropdownValue: requestsVM.vehicleBrandId.selectedId != -1 ? DropValue(requestsVM.vehicleBrandId.selectedId, requestsVM.vehicleBrandId.selectedOption, "") : null,
requestsVM.vehicleBrandId.selectedId != -1
? DropValue(
requestsVM
.vehicleBrandId.selectedId,
requestsVM
.vehicleBrandId.selectedOption,
"")
: null,
hint: LocaleKeys.brand.tr(), hint: LocaleKeys.brand.tr(),
errorValue: errorValue: requestsVM.vehicleBrandId.errorValue,
requestsVM.vehicleBrandId.errorValue,
); );
}), }),
8.height, 8.height,
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleModelsDrop = []; List<DropValue> vehicleModelsDrop = [];
for (var element in requestsVM.vehicleModels) { for (var element in requestsVM.vehicleModels) {
if (requestsVM.vehicleBrandId.selectedId == if (requestsVM.vehicleBrandId.selectedId == element.vehicleBrandID) vehicleModelsDrop.add(DropValue(element.id?.toInt() ?? 0, element.model ?? "", ""));
element.vehicleBrandID)
vehicleModelsDrop.add(DropValue(
element.id?.toInt() ?? 0,
element.model ?? "",
""));
} }
return DropdownField( return DropdownField(
(DropValue value) => (DropValue value) => requestsVM.updateSelectionVehicleModelId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
requestsVM.updateSelectionVehicleModelId(
SelectionModel(
selectedId: value.id,
selectedOption: value.value)),
list: vehicleModelsDrop, list: vehicleModelsDrop,
dropdownValue: dropdownValue: requestsVM.vehicleModelId.selectedId != -1 ? DropValue(requestsVM.vehicleModelId.selectedId, requestsVM.vehicleModelId.selectedOption, "") : null,
requestsVM.vehicleModelId.selectedId != -1
? DropValue(
requestsVM
.vehicleModelId.selectedId,
requestsVM
.vehicleModelId.selectedOption,
"")
: null,
hint: LocaleKeys.model.tr(), hint: LocaleKeys.model.tr(),
errorValue: errorValue: requestsVM.vehicleModelId.errorValue,
requestsVM.vehicleModelId.errorValue,
); );
}), }),
8.height, 8.height,
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleYearModelsDrop = []; List<DropValue> vehicleYearModelsDrop = [];
for (var element for (var element in requestsVM.vehicleModelYears) {
in requestsVM.vehicleModelYears) { vehicleYearModelsDrop.add(DropValue(element.id?.toInt() ?? 0, element.modelYear ?? "", ""));
vehicleYearModelsDrop.add(DropValue(
element.id?.toInt() ?? 0,
element.modelYear ?? "",
""));
} }
return DropdownField( return DropdownField(
(DropValue value) => requestsVM (DropValue value) => requestsVM.updateSelectionVehicleModelYearId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
.updateSelectionVehicleModelYearId(
SelectionModel(
selectedId: value.id,
selectedOption: value.value)),
list: vehicleYearModelsDrop, list: vehicleYearModelsDrop,
dropdownValue: dropdownValue: requestsVM.vehicleModelYearId.selectedId != -1 ? DropValue(requestsVM.vehicleModelYearId.selectedId, requestsVM.vehicleModelYearId.selectedOption, "") : null,
requestsVM.vehicleModelYearId.selectedId !=
-1
? DropValue(
requestsVM
.vehicleModelYearId.selectedId,
requestsVM.vehicleModelYearId
.selectedOption,
"")
: null,
hint: LocaleKeys.year.tr(), hint: LocaleKeys.year.tr(),
errorValue: errorValue: requestsVM.vehicleModelYearId.errorValue,
requestsVM.vehicleModelYearId.errorValue,
); );
}), }),
8.height, 8.height,
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleCountriesDrop = []; List<DropValue> vehicleCountriesDrop = [];
for (var element in requestsVM.vehicleCountries) { for (var element in requestsVM.vehicleCountries) {
vehicleCountriesDrop.add(DropValue( vehicleCountriesDrop.add(DropValue(element.id?.toInt() ?? 0, element.countryName ?? "", ""));
element.id?.toInt() ?? 0,
element.countryName ?? "",
""));
} }
return DropdownField( return DropdownField(
(DropValue value) => (DropValue value) => requestsVM.updateSelectionVehicleCountryId(SelectionModel(selectedOption: value.value, selectedId: value.id)),
requestsVM.updateSelectionVehicleCountryId(
SelectionModel(
selectedOption: value.value,
selectedId: value.id)),
list: vehicleCountriesDrop, list: vehicleCountriesDrop,
dropdownValue: dropdownValue: requestsVM.vehicleCountryId.selectedId != -1 ? DropValue(requestsVM.vehicleCountryId.selectedId, requestsVM.vehicleCountryId.selectedOption, "") : null,
requestsVM.vehicleCountryId.selectedId != -1
? DropValue(
requestsVM
.vehicleCountryId.selectedId,
requestsVM.vehicleCountryId
.selectedOption,
"")
: null,
hint: LocaleKeys.country.tr(), hint: LocaleKeys.country.tr(),
errorValue: errorValue: requestsVM.vehicleCountryId.errorValue,
requestsVM.vehicleCountryId.errorValue,
); );
}), }),
if (requestsVM.vehicleCountryId.selectedId != if (requestsVM.vehicleCountryId.selectedId != -1) ...[
-1) ...[
if (requestsVM.isCountryFetching) ...[ if (requestsVM.isCountryFetching) ...[
Row( Row(
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [const CircularProgressIndicator().paddingAll(10)],
const CircularProgressIndicator()
.paddingAll(10)
],
), ),
] else ...[ ] else ...[
8.height, 8.height,
Builder(builder: (context) { Builder(builder: (context) {
List<DropValue> vehicleCitiesDrop = []; List<DropValue> vehicleCitiesDrop = [];
for (var element for (var element in requestsVM.vehicleCities) {
in requestsVM.vehicleCities) { vehicleCitiesDrop.add(DropValue(element.id?.toInt() ?? 0, element.cityName ?? "", ""));
vehicleCitiesDrop.add(DropValue(
element.id?.toInt() ?? 0,
element.cityName ?? "",
""));
} }
return DropdownField( return DropdownField(
(DropValue value) => (DropValue value) => requestsVM.updateSelectionVehicleCityId(SelectionModel(selectedId: value.id, selectedOption: value.value)),
requestsVM.updateSelectionVehicleCityId(
SelectionModel(
selectedId: value.id,
selectedOption: value.value)),
list: vehicleCitiesDrop, list: vehicleCitiesDrop,
dropdownValue: requestsVM dropdownValue: requestsVM.vehicleCityId.selectedId != -1 ? DropValue(requestsVM.vehicleCityId.selectedId, requestsVM.vehicleCityId.selectedOption, "") : null,
.vehicleCityId.selectedId !=
-1
? DropValue(
requestsVM.vehicleCityId.selectedId,
requestsVM
.vehicleCityId.selectedOption,
"")
: null,
hint: LocaleKeys.city.tr(), hint: LocaleKeys.city.tr(),
errorValue: errorValue: requestsVM.vehicleCityId.errorValue,
requestsVM.vehicleCityId.errorValue,
); );
}), }),
], ],
@ -294,9 +179,7 @@ class CreateRequestPage extends StatelessWidget {
), ),
8.height, 8.height,
DottedRectContainer( DottedRectContainer(
onTap: () => context onTap: () => context.read<RequestsVM>().pickMultipleImages(),
.read<RequestsVM>()
.pickMultipleImages(),
text: LocaleKeys.attachImage.tr(), text: LocaleKeys.attachImage.tr(),
icon: MyAssets.attachmentIcon.buildSvg(), icon: MyAssets.attachmentIcon.buildSvg(),
), ),
@ -305,8 +188,7 @@ class CreateRequestPage extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.end, mainAxisAlignment: MainAxisAlignment.end,
children: [ children: [
requestsVM.vehicleImageError requestsVM.vehicleImageError.toText(fontSize: 14, color: Colors.red),
.toText(fontSize: 14, color: Colors.red),
], ],
).paddingOnly(right: 10) ).paddingOnly(right: 10)
], ],
@ -314,12 +196,9 @@ class CreateRequestPage extends StatelessWidget {
16.height, 16.height,
PickedFilesContainer( PickedFilesContainer(
pickedFiles: requestsVM.pickedVehicleImages, pickedFiles: requestsVM.pickedVehicleImages,
onCrossPressedPrimary: onCrossPressedPrimary: requestsVM.removeImageFromList,
requestsVM.removeImageFromList,
onAddFilePressed: () { onAddFilePressed: () {
context context.read<RequestsVM>().pickMultipleImages();
.read<RequestsVM>()
.pickMultipleImages();
}, },
), ),
], ],
@ -331,21 +210,16 @@ class CreateRequestPage extends StatelessWidget {
value: requestsVM.isShippingDeliveryEnabled, value: requestsVM.isShippingDeliveryEnabled,
onChanged: null, onChanged: null,
), ),
LocaleKeys.shippingDelivery.tr().toText( LocaleKeys.shippingDelivery.tr().toText(color: MyColors.darkPrimaryColor, isBold: true, fontSize: 18)
color: MyColors.darkPrimaryColor,
isBold: true,
fontSize: 18)
], ],
).onPress(() { ).onPress(() {
requestsVM.updateShippingDeliverEnabled( requestsVM.updateShippingDeliverEnabled(!requestsVM.isShippingDeliveryEnabled);
!requestsVM.isShippingDeliveryEnabled);
}), }),
], ],
), ),
] ]
], ],
).toContainer( ).toContainer(isShadowEnabled: true, marginAll: 16, paddingAll: 12),
isShadowEnabled: true, marginAll: 16, paddingAll: 12),
), ),
), ),
ShowFillButton( ShowFillButton(

@ -3,14 +3,11 @@ import 'dart:io';
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/classes/app_state.dart'; import 'package:mc_common_app/classes/app_state.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/generated/locale_keys.g.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/general_models/m_response.dart'; import 'package:mc_common_app/models/general_models/generic_resp_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/app_permission_handler.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/service_view_model.dart'; import 'package:mc_common_app/view_models/service_view_model.dart';
@ -18,11 +15,11 @@ import 'package:mc_common_app/widgets/button/show_fill_button.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class ProviderLicensePage extends StatefulWidget { class ProviderLicensePage extends StatefulWidget {
const ProviderLicensePage({super.key});
@override @override
State<ProviderLicensePage> createState() => _ProviderLicensePageState(); State<ProviderLicensePage> createState() => _ProviderLicensePageState();
} }
@ -32,7 +29,6 @@ class _ProviderLicensePageState extends State<ProviderLicensePage> {
@override @override
void initState() { void initState() {
// TODO: implement initState
super.initState(); super.initState();
branchVM = Provider.of<ServiceVM>(context, listen: false); branchVM = Provider.of<ServiceVM>(context, listen: false);
branchVM.getServiceProviderDocument(AppState().getUser.data!.userInfo!.providerId ?? 0); branchVM.getServiceProviderDocument(AppState().getUser.data!.userInfo!.providerId ?? 0);
@ -93,17 +89,17 @@ class _ProviderLicensePageState extends State<ProviderLicensePage> {
validation(ServiceVM model) { validation(ServiceVM model) {
bool valid = true; bool valid = true;
model.document!.data!.forEach((element) { for (var element in model.document!.data!) {
if (element.documentUrl == null) { if (element.documentUrl == null) {
valid = false; valid = false;
} }
}); }
return valid; return valid;
} }
updateDocument(ServiceVM model) async { updateDocument(ServiceVM model) async {
Utils.showLoading(context); Utils.showLoading(context);
MResponse res = await model.updateDocument(model.document!.data); GenericRespModel res = await model.updateDocument(model.document!.data);
Utils.hideLoading(context); Utils.hideLoading(context);
if (res.messageStatus == 1) { if (res.messageStatus == 1) {
Utils.showToast(LocaleKeys.documentsUploadedSuccessfully.tr()); Utils.showToast(LocaleKeys.documentsUploadedSuccessfully.tr());

@ -35,139 +35,138 @@ class SettingOptionsLanguage extends StatelessWidget {
// ? // ?
Expanded( Expanded(
child: ListView( child: ListView(
shrinkWrap: true, shrinkWrap: true,
padding: EdgeInsets.zero, padding: EdgeInsets.zero,
children: [
Column(
children: [ children: [
Column(
children: [
CustomSettingOptionsTile(
leadingWidget: const Icon(Icons.quickreply_outlined, size: 20),
titleText: LocaleKeys.requests.tr(),
needBorderBelow: true,
onTap: () {
context.read<DashboardVmCustomer>().onNavbarTapped(4);
Navigator.pop(context);
}),
CustomSettingOptionsTile(
leadingWidget: const Icon(Icons.settings, size: 20),
titleText: LocaleKeys.settings.tr(),
needBorderBelow: true,
onTap: () {},
//navigateWithName(context, AppRoutes.settingOptionsInviteFriends),
),
CustomSettingOptionsTile(
leadingWidget: const Icon(Icons.question_mark_outlined, size: 20),
titleText: LocaleKeys.help.tr(),
needBorderBelow: true,
onTap: () => navigateWithName(context, AppRoutes.settingOptionsHelp),
),
CustomSettingOptionsTile(
leadingWidget: const Icon(Icons.person, size: 20),
titleText: LocaleKeys.account.tr(),
needBorderBelow: false,
onTap: () {
navigateWithName(context, AppRoutes.profileView);
// context.read<DashboardVmCustomer>().onNavbarTapped(4);
// Navigator.pop(context);
}),
],
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0),
10.height,
CustomSettingOptionsTile( CustomSettingOptionsTile(
leadingWidget: const Icon(Icons.translate, size: 20), leadingWidget: const Icon(Icons.quickreply_outlined, size: 20),
titleText: LocaleKeys.language.tr(), titleText: LocaleKeys.requests.tr(),
isForLanguage: true, needBorderBelow: true,
onTap: () { onTap: () {
// if (EasyLocalization.of(context) context.read<DashboardVmCustomer>().onNavbarTapped(4);
// ?.currentLocale Navigator.pop(context);
// ?.countryCode == }),
// "SA") { if (AppState().currentAppType == AppType.customer) ...[
// context.setLocale(const Locale("en", "US")); CustomSettingOptionsTile(
// } else { leadingWidget: const Icon(Icons.favorite, size: 20),
// context.setLocale(const Locale('ar', 'SA')); titleText: LocaleKeys.favoriteList.tr(),
// } needBorderBelow: true,
onTap: () => navigateWithName(context, AppRoutes.favoriteListView),
context.read<UserVM>().changeLanguage(context); ),
}, ],
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0), CustomSettingOptionsTile(
10.height, leadingWidget: const Icon(Icons.settings, size: 20),
(AppState().currentAppType == AppType.provider) titleText: LocaleKeys.settings.tr(),
? Column( needBorderBelow: true,
children: [ onTap: () {},
CustomSettingOptionsTile( //navigateWithName(context, AppRoutes.settingOptionsInviteFriends),
leadingWidget: SizedBox( ),
width: 16, CustomSettingOptionsTile(
height: 16, leadingWidget: const Icon(Icons.question_mark_outlined, size: 20),
child: SvgPicture.asset( titleText: LocaleKeys.help.tr(),
MyAssets.icStar, needBorderBelow: true,
color: MyColors.primaryColor, onTap: () => navigateWithName(context, AppRoutes.settingOptionsHelp),
),
CustomSettingOptionsTile(
leadingWidget: const Icon(Icons.person, size: 20),
titleText: LocaleKeys.account.tr(),
needBorderBelow: false,
onTap: () {
navigateWithName(context, AppRoutes.profileView);
// context.read<DashboardVmCustomer>().onNavbarTapped(4);
// Navigator.pop(context);
}),
],
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0),
10.height,
CustomSettingOptionsTile(
leadingWidget: const Icon(Icons.translate, size: 20),
titleText: LocaleKeys.language.tr(),
isForLanguage: true,
onTap: () {
context.read<UserVM>().changeLanguage(context);
},
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0),
10.height,
(AppState().currentAppType == AppType.provider)
? Column(
children: [
CustomSettingOptionsTile(
leadingWidget: SizedBox(
width: 16,
height: 16,
child: SvgPicture.asset(
MyAssets.icStar,
color: MyColors.primaryColor,
),
), ),
titleText: LocaleKeys.mySubscription.tr(),
subTitle: AppState().getproviderSubscription.first.subscriptionName ?? "Silver",
isForLanguage: false,
needBorderBelow: true,
onTap: () {
navigateWithName(context, AppRoutes.mySubscriptionsPage);
},
), ),
titleText: LocaleKeys.mySubscription.tr(), CustomSettingOptionsTile(
subTitle: AppState().getproviderSubscription.first.subscriptionName ?? "Silver", leadingWidget: SizedBox(
isForLanguage: false, width: 16,
needBorderBelow: true, height: 16,
onTap: () { child: SvgPicture.asset(
navigateWithName(context, AppRoutes.mySubscriptionsPage); MyAssets.icGroupStar,
}, // color: MyColors.primaryColor,
), ),
CustomSettingOptionsTile(
leadingWidget: SizedBox(
width: 16,
height: 16,
child: SvgPicture.asset(
MyAssets.icGroupStar,
// color: MyColors.primaryColor,
), ),
titleText: LocaleKeys.subscriptions.tr(),
subTitle: null,
isForLanguage: false,
needBorderBelow: true,
onTap: () {
navigateWithName(context, AppRoutes.subscriptionsPage);
},
), ),
titleText: LocaleKeys.subscriptions.tr(), CustomSettingOptionsTile(
subTitle: null, leadingWidget: SizedBox(
isForLanguage: false, width: 16,
needBorderBelow: true, height: 16,
onTap: () { child: SvgPicture.asset(
navigateWithName(context, AppRoutes.subscriptionsPage); MyAssets.icGroupStar,
}, // color: MyColors.primaryColor,
), ),
CustomSettingOptionsTile(
leadingWidget: SizedBox(
width: 16,
height: 16,
child: SvgPicture.asset(
MyAssets.icGroupStar,
// color: MyColors.primaryColor,
), ),
titleText: LocaleKeys.defineLicenses.tr(),
subTitle: null,
isForLanguage: false,
needBorderBelow: false,
onTap: () {
navigateWithName(context, AppRoutes.providerLicensePage);
},
), ),
titleText: LocaleKeys.defineLicenses.tr(), // CustomSettingOptionsTile(
subTitle: null, // leadingWidget: SizedBox(
isForLanguage: false, // width: 16,
needBorderBelow: false, // height: 16,
onTap: () { // child: SvgPicture.asset(
navigateWithName(context, AppRoutes.providerLicensePage); // MyAssets.providersIcon,
}, // // color: MyColors.primaryColor,
), // ),
// CustomSettingOptionsTile( // ),
// leadingWidget: SizedBox( // titleText: "Users",
// width: 16, // subTitle: null,
// height: 16, // isForLanguage: false,
// child: SvgPicture.asset( // needBorderBelow: false,
// MyAssets.providersIcon, // onTap: () {
// // color: MyColors.primaryColor, // navigateWithName(context, AppRoutes.dealerUser, arguments: AppState().getUser.data!.userInfo!.id.toString());
// ), // },
// ), // )
// titleText: "Users", ],
// subTitle: null, ).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0)
// isForLanguage: false, : const SizedBox(),
// needBorderBelow: false, (AppState().currentAppType == AppType.provider) ? 10.height : const SizedBox(),
// onTap: () { ],
// navigateWithName(context, AppRoutes.dealerUser, arguments: AppState().getUser.data!.userInfo!.id.toString()); )),
// },
// )
],
).toWhiteContainer(width: double.infinity, pading: const EdgeInsets.all(12), borderRadius: 0)
: SizedBox(),
(AppState().currentAppType == AppType.provider) ? 10.height : SizedBox(),
],
)),
// : Expanded( // : Expanded(
// child: ListView( // child: ListView(
// children: [ // children: [

@ -0,0 +1,122 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.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/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/services_models/service_model.dart';
import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class BranchDetailCard extends StatelessWidget {
final String providerImageUrl;
final String title;
final String? providerName;
final String providerLocation;
final double providerRatings;
final List<ServiceModel>? services;
final Function() onCardTapped;
const BranchDetailCard({
Key? key,
required this.providerImageUrl,
required this.title,
required this.providerRatings,
required this.providerLocation,
this.services,
this.providerName,
required this.onCardTapped,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Padding(
padding: EdgeInsets.zero,
// padding: const EdgeInsets.only(
// bottom: 10,
// left: 21,
// right: 21,
// ),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
providerImageUrl.buildNetworkImage(height: 80, width: 80),
12.width,
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.start,
children: [
title.toText(fontSize: 16, isBold: true),
Row(
children: [
("${LocaleKeys.location.tr()}:").toText(color: MyColors.lightTextColor, fontSize: 12),
4.width,
providerLocation.toText(fontSize: 12, isBold: true),
],
),
if (providerName != null)
Row(
children: [
("${LocaleKeys.providers.tr()}:").toText(color: MyColors.lightTextColor, fontSize: 12),
4.width,
providerName!.toText(fontSize: 12, isBold: true),
],
),
],
),
),
if (providerRatings != 0.0) ...[
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
providerRatings.toString().toText(
isUnderLine: true,
isBold: true,
fontSize: 12,
),
2.width,
MyAssets.icStar.buildSvg(width: 12),
],
),
],
],
),
8.height,
if (services != null)
Column(
children: services!
.take(2)
.map(
(e) => Row(
children: [
//TODO: Needs to add icon in the future when added from the provider
// MyAssets.maintenanceIcon.buildSvg(),
// 8.width,
e.serviceDescription.toString().toText(fontSize: 12)
],
),
)
.toList(),
),
if (services != null && services!.length > 2)
("+${services!.length - 2} more").toText(
color: MyColors.primaryColor,
isUnderLine: true,
isBold: true,
),
],
),
),
],
).onPress(onCardTapped).toWhiteContainer(width: double.infinity, allPading: 12));
}
}

@ -4,127 +4,87 @@ import 'package:mc_common_app/classes/consts.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/provider_branches_models/branch_detail_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/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class ProviderDetailsCard extends StatelessWidget { class ProviderDetailCard extends StatelessWidget {
final String providerImageUrl; final String providerImageUrl;
final String title; final String title;
final String? providerName; final String startedSince;
final String providerLocation; final String totalBranches;
final double providerRatings; final String description;
final List<BranchDetailModel> branches;
//TODO: items can be make a generaic, so we can add services/items in the future
final List<ServiceModel>? services;
final Function() onCardTapped; final Function() onCardTapped;
const ProviderDetailsCard({ const ProviderDetailCard({
Key? key, Key? key,
required this.providerImageUrl, required this.providerImageUrl,
required this.title, required this.title,
required this.providerRatings, required this.totalBranches,
required this.providerLocation, required this.branches,
this.services, required this.description,
this.providerName, required this.startedSince,
required this.onCardTapped, required this.onCardTapped,
}) : super(key: key); }) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
//TODO: use pading in listview return Row(
return Padding( crossAxisAlignment: CrossAxisAlignment.start,
padding: EdgeInsets.zero, children: [
// padding: const EdgeInsets.only( Image.asset(
// bottom: 10, providerImageUrl,
// left: 21, width: 80,
// right: 21, height: 85,
// ), fit: BoxFit.cover,
child: Row( ),
crossAxisAlignment: CrossAxisAlignment.start, 12.width,
children: [ Expanded(
Image.asset( child: Column(
providerImageUrl, crossAxisAlignment: CrossAxisAlignment.start,
width: 80, children: [
height: 85, Row(
fit: BoxFit.cover, mainAxisAlignment: MainAxisAlignment.start,
),
12.width,
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Row( Expanded(
mainAxisAlignment: MainAxisAlignment.start, child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ mainAxisAlignment: MainAxisAlignment.start,
Expanded( children: [
child: Column( title.toText(fontSize: 16, isBold: true),
crossAxisAlignment: CrossAxisAlignment.start, Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
title.toText(fontSize: 16, isBold: true), ("Total Branches:").toText(color: MyColors.lightTextColor, fontSize: 12),
Row( 4.width,
children: [ totalBranches.toText(fontSize: 12, isBold: true),
("${LocaleKeys.location.tr()}:").toText(color: MyColors.lightTextColor, fontSize: 12),
4.width,
providerLocation.toText(fontSize: 12, isBold: true),
],
),
if (providerName != null)
Row(
children: [
("${LocaleKeys.providers.tr()}:").toText(color: MyColors.lightTextColor, fontSize: 12),
4.width,
providerName!.toText(fontSize: 12, isBold: true),
],
),
], ],
), ),
),
if (providerRatings != 0.0) ...[
Row( Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [ children: [
providerRatings.toString().toText( ("${LocaleKeys.description.tr()}:").toText(color: MyColors.lightTextColor, fontSize: 12),
isUnderLine: true, 4.width,
isBold: true, description.toText(fontSize: 12, isBold: true),
fontSize: 12, ],
), ),
2.width, Row(
MyAssets.icStar.buildSvg(width: 12), children: [
("Since:").toText(color: MyColors.lightTextColor, fontSize: 12),
4.width,
startedSince.toText(fontSize: 12, isBold: true),
], ],
), ),
], ],
],
),
8.height,
if (services != null)
Column(
children: services!
.take(2)
.map(
(e) => Row(
children: [
//TODO: Needs to add icon in the future when added from the provider
// MyAssets.maintenanceIcon.buildSvg(),
// 8.width,
e.serviceDescription.toString().toText(fontSize: 12)
],
),
)
.toList(),
),
if (services != null && services!.length > 2)
("+${services!.length - 2} more").toText(
color: MyColors.primaryColor,
isUnderLine: true,
isBold: true,
), ),
),
], ],
), ),
), ],
], ),
).onPress(onCardTapped).toWhiteContainer(width: double.infinity, allPading: 12)); ),
],
).onPress(onCardTapped).toWhiteContainer(width: double.infinity, allPading: 12);
} }
} }

@ -2,6 +2,7 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart'; import 'package:flutter_svg/flutter_svg.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/main.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -31,13 +32,18 @@ extension ContainerExt on Widget {
border: isBorderRequired ? Border.all(color: MyColors.darkPrimaryColor, width: 2) : null, border: isBorderRequired ? Border.all(color: MyColors.darkPrimaryColor, width: 2) : null,
color: backgroundColor ?? MyColors.white, color: backgroundColor ?? MyColors.white,
borderRadius: BorderRadius.circular(borderRadius), borderRadius: BorderRadius.circular(borderRadius),
boxShadow: const [ boxShadow: [
BoxShadow( BoxShadow(
blurRadius: 8, color: const Color(0xff000000).withOpacity(.07),
spreadRadius: 3, blurRadius: 26,
offset: Offset(0, 3), offset: const Offset(0, -3),
color: MyColors.greyShadowColor,
), ),
// BoxShadow(
// blurRadius: 8,
// spreadRadius: 3,
// offset: Offset(0, 3),
// color: MyColors.greyShadowColor,
// ),
], ],
), ),
padding: pading ?? EdgeInsets.all(allPading ?? 0), padding: pading ?? EdgeInsets.all(allPading ?? 0),
@ -77,12 +83,12 @@ extension ContainerExt on Widget {
boxShadow: !isShadowEnabled boxShadow: !isShadowEnabled
? null ? null
: [ : [
BoxShadow( BoxShadow(
color: const Color(0xff000000).withOpacity(.05), color: const Color(0xff000000).withOpacity(.05),
blurRadius: 26, blurRadius: 26,
offset: const Offset(0, -3), offset: const Offset(0, -3),
), ),
], ],
), ),
padding: padding ?? EdgeInsets.all(paddingAll), padding: padding ?? EdgeInsets.all(paddingAll),
margin: margin ?? EdgeInsets.all(marginAll), margin: margin ?? EdgeInsets.all(marginAll),
@ -227,8 +233,7 @@ extension WidgetExt on Widget {
); );
} }
Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) => Widget paddingOnly({double left = 0.0, double right = 0.0, double top = 0.0, double bottom = 0.0}) => Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this);
Padding(padding: EdgeInsets.only(left: left, right: right, top: top, bottom: bottom), child: this);
// Widget onTap(VoidCallback onTap, {double corners = 0}) { // Widget onTap(VoidCallback onTap, {double corners = 0}) {
// return Clickable.widget(child: this, corners: corners, onTap: onTap); // return Clickable.widget(child: this, corners: corners, onTap: onTap);
@ -329,10 +334,39 @@ extension xDouble on int {
Duration durationHour() => Duration(hours: this); Duration durationHour() => Duration(hours: this);
} }
extension BuildSVG on String { extension BuildSVG on String? {
Widget buildSvg({double? height, double? width, BoxFit fit = BoxFit.contain, Color? color}) { Widget buildSvg({double? height, double? width, BoxFit fit = BoxFit.contain, Color? color}) {
return SvgPicture.asset( return SvgPicture.asset(
this, this!,
fit: fit,
color: color,
height: height,
width: width,
);
}
Widget buildNetworkImage({double? height, double? width, BoxFit fit = BoxFit.contain, Color? color}) {
if (this == null || this!.isEmpty) {
return SizedBox(
height: height,
width: width,
child: const Icon(Icons.error_outline_rounded),
);
}
return Image.network(
this!,
errorBuilder: (BuildContext context, Object obj, StackTrace? s) {
return SizedBox(height: height, width: width, child: const Icon(Icons.signal_wifi_connected_no_internet_4_outlined));
},
loadingBuilder: (BuildContext context, Widget? child, ImageChunkEvent? imageChunk) {
return const Center(
child: CircularProgressIndicator(
strokeWidth: 0.5,
color: MyColors.darkPrimaryColor,
),
);
},
fit: fit, fit: fit,
color: color, color: color,
height: height, height: height,
@ -343,18 +377,10 @@ extension BuildSVG on String {
extension LocaleSetup on MultiProvider { extension LocaleSetup on MultiProvider {
Widget setupLocale() { Widget setupLocale() {
return EasyLocalization( return EasyLocalization(supportedLocales: MyLocales.supportedLocales, fallbackLocale: MyLocales.fallBackLocale, startLocale: MyLocales.startLocale, assetLoader: MyLocales.assetLoader, path: MyLocales.localesAssetPath, child: this);
supportedLocales: MyLocales.supportedLocales,
fallbackLocale: MyLocales.fallBackLocale,
startLocale: MyLocales.startLocale,
assetLoader: MyLocales.assetLoader,
path: MyLocales.localesAssetPath,
child: this);
} }
} }
extension WidgetExtensions on Widget { extension WidgetExtensions on Widget {
Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this); Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this);
} }

Loading…
Cancel
Save