Merge branch 'aamir_dev' into faiz_development_common

# Conflicts:
#	lib/widgets/dropdown/dropdow_field.dart
aamir_dev
Faiz Hashmi 1 year ago
commit 0ada291516

@ -784,5 +784,7 @@
"enterCustomerName": "أدخل اسم العميل", "enterCustomerName": "أدخل اسم العميل",
"tapToView": "انقر لعرض", "tapToView": "انقر لعرض",
"noServicesAvailableToCopy": "لا توجد خدمات متاحة في هذا الفرع لنسخها.", "noServicesAvailableToCopy": "لا توجد خدمات متاحة في هذا الفرع لنسخها.",
"copySelectedItems": "نسخ العناصر المحددة" "copySelectedItems": "نسخ العناصر المحددة",
"companyNameMandatory": "اسم الشركة إلزامي"
} }

@ -782,5 +782,6 @@
"enterCustomerName": "Enter Customer Name", "enterCustomerName": "Enter Customer Name",
"tapToView": "Tap to view", "tapToView": "Tap to view",
"noServicesAvailableToCopy": "There are no services available in this branch to copy.", "noServicesAvailableToCopy": "There are no services available in this branch to copy.",
"copySelectedItems": "Copy Selected Items" "copySelectedItems": "Copy Selected Items",
"companyNameMandatory": "Company Name is mandatory"
} }

@ -261,6 +261,8 @@ class GlobalConsts {
static int maxFileCount = 7; static int maxFileCount = 7;
static int maxFileSizeInBytes = 2 * 1024 * 1024; static int maxFileSizeInBytes = 2 * 1024 * 1024;
static String allowedFileExtensions = "jpg,png - 2MB";
static String allowedFileExtensionsPDF = "PDF 2MB";
static int providerDealerRoleTypeId = 6; static int providerDealerRoleTypeId = 6;
static int providerIndividualRoleTypeId = 5; static int providerIndividualRoleTypeId = 5;

@ -736,7 +736,7 @@ class CodegenLoader extends AssetLoader{
"ownerInformation": "معلومات المالك", "ownerInformation": "معلومات المالك",
"acceptedRequests": "الطلبات المقبولة", "acceptedRequests": "الطلبات المقبولة",
"specialRequestChat": "دردشة الطلب الخاص", "specialRequestChat": "دردشة الطلب الخاص",
"companyName": "اسم الشركة", "companyName": "اسم الشركة *",
"noAvailableItems": "لا توجد عناصر متاحة.", "noAvailableItems": "لا توجد عناصر متاحة.",
"serviceDeliveryType": "نوع تقديم الخدمة", "serviceDeliveryType": "نوع تقديم الخدمة",
"noImagesToShow": "لا توجد صور للعرض", "noImagesToShow": "لا توجد صور للعرض",
@ -800,7 +800,8 @@ class CodegenLoader extends AssetLoader{
"enterCustomerName": "أدخل اسم العميل", "enterCustomerName": "أدخل اسم العميل",
"tapToView": "انقر لعرض", "tapToView": "انقر لعرض",
"noServicesAvailableToCopy": "لا توجد خدمات متاحة في هذا الفرع لنسخها.", "noServicesAvailableToCopy": "لا توجد خدمات متاحة في هذا الفرع لنسخها.",
"copySelectedItems": "نسخ العناصر المحددة" "copySelectedItems": "نسخ العناصر المحددة",
"companyNameMandatory": "اسم الشركة إلزامي"
}; };
static const Map<String,dynamic> en_US = { static const Map<String,dynamic> en_US = {
"firstTimeLogIn": "First Time Log In", "firstTimeLogIn": "First Time Log In",
@ -1518,7 +1519,7 @@ static const Map<String,dynamic> en_US = {
"noItemsToShow": "There are no Items no show.", "noItemsToShow": "There are no Items no show.",
"acceptedRequests": "Accepted Requests", "acceptedRequests": "Accepted Requests",
"specialRequestChat": "Special Request Chat", "specialRequestChat": "Special Request Chat",
"companyName": "Company Name", "companyName": "Company Name *",
"noAvailableItems": "There are no available items.", "noAvailableItems": "There are no available items.",
"serviceDeliveryType": "Service Delivery Type", "serviceDeliveryType": "Service Delivery Type",
"noImagesToShow": "No Images to Show", "noImagesToShow": "No Images to Show",
@ -1586,7 +1587,8 @@ static const Map<String,dynamic> en_US = {
"enterCustomerName": "Enter Customer Name", "enterCustomerName": "Enter Customer Name",
"tapToView": "Tap to view", "tapToView": "Tap to view",
"noServicesAvailableToCopy": "There are no services available in this branch to copy.", "noServicesAvailableToCopy": "There are no services available in this branch to copy.",
"copySelectedItems": "Copy Selected Items" "copySelectedItems": "Copy Selected Items",
"companyNameMandatory": "Company Name is mandatory"
}; };
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};
} }

@ -764,5 +764,6 @@ abstract class LocaleKeys {
static const tapToView = 'tapToView'; static const tapToView = 'tapToView';
static const noServicesAvailableToCopy = 'noServicesAvailableToCopy'; static const noServicesAvailableToCopy = 'noServicesAvailableToCopy';
static const copySelectedItems = 'copySelectedItems'; static const copySelectedItems = 'copySelectedItems';
static const companyNameMandatory = 'companyNameMandatory';
} }

@ -113,8 +113,8 @@ class ReqOffer {
offerStatusText = json['offerStatusText']; offerStatusText = json['offerStatusText'];
comment = json['comment']; comment = json['comment'];
serviceItemName = json['serviceItem']; serviceItemName = json['serviceItem'];
manufacturedByName = json['offeredItemCreatedBy'].toString(); manufacturedByName = json['offeredItemCreatedByName'].toString();
manufacturedOn = json['offeredItemCreatedOn']; manufacturedOn = json['offeredItemCreatedOn'] ?? json["createdOn"];
price = json['price']; price = json['price'];
isDeliveryAvailable = json['isDeliveryAvailable']; isDeliveryAvailable = json['isDeliveryAvailable'];
requestOfferStatusEnum = ((json['offerStatus']) as int).toRequestOfferStatusEnum(); requestOfferStatusEnum = ((json['offerStatus']) as int).toRequestOfferStatusEnum();

@ -369,7 +369,7 @@ class RequestRepoImp implements RequestRepo {
"serviceItem": serviceItemName, "serviceItem": serviceItemName,
"comment": message, "comment": message,
"price": offerPrice, "price": offerPrice,
"offeredItemCreatedBy": manufacturedByName.toString(), "offeredItemCreatedByName": manufacturedByName.toString(),
"offeredItemCreatedOn": manufacturedOn.toString(), "offeredItemCreatedOn": manufacturedOn.toString(),
"reqOfferImages": requestImages, "reqOfferImages": requestImages,
"isDeliveryAvailable": isDeliveryAvailable "isDeliveryAvailable": isDeliveryAvailable

@ -31,7 +31,7 @@ abstract class UserRepo {
Future<RegisterUserRespModel> basicVerify(String phoneNo, String otp, String userToken, {bool isNeedToPassToken = false}); Future<RegisterUserRespModel> basicVerify(String phoneNo, String otp, String userToken, {bool isNeedToPassToken = false});
Future<RegisterUserRespModel> basicComplete(String userId, String firstName, String lastName, String email, String password, String cityID, String genderID, {bool isNeedToPassToken = false}); Future<RegisterUserRespModel> basicComplete(String userId, String firstName, String lastName, String compannyNname, String email, String password, String cityID, String genderID, {bool isNeedToPassToken = false});
Future<Response> loginV1(String phoneNo, String password); Future<Response> loginV1(String phoneNo, String password);
@ -106,12 +106,12 @@ class UserRepoImp implements UserRepo {
} }
@override @override
Future<RegisterUserRespModel> basicComplete(String userId, String firstName, String lastName, String email, String password, String cityID, String genderID, {bool isNeedToPassToken = false}) async { Future<RegisterUserRespModel> basicComplete(String userId, String firstName, String lastName, String companyName, String email, String password, String cityID, String genderID, {bool isNeedToPassToken = false}) async {
Map<String, Object> postParams; Map<String, Object> postParams;
if (email.isEmpty) { if (email.isEmpty) {
postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "companyName": "string", "isEmailVerified": true, "password": password, "cityID": cityID, "genderID": genderID}; postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "companyName": companyName, "isEmailVerified": true, "password": password, "cityID": cityID, "genderID": genderID};
} else { } else {
postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "email": email, "companyName": "string", "isEmailVerified": true, "password": password, "cityID": cityID, "genderID": genderID}; postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "email": email, "companyName": companyName, "isEmailVerified": true, "password": password, "cityID": cityID, "genderID": genderID};
} }
String? t; String? t;
if (isNeedToPassToken) { if (isNeedToPassToken) {

@ -387,8 +387,8 @@ class ChatVM extends BaseVM {
"IsDeliveryAvailable": isDeliveryAvailable, "IsDeliveryAvailable": isDeliveryAvailable,
"ServiceItem": serviceItemName, "ServiceItem": serviceItemName,
"ReqOfferImages": offerImages, "ReqOfferImages": offerImages,
"OfferedItemCreatedBy": manufacturedByName, "OfferedItemCreatedByName": manufacturedByName,
// "OfferedItemCreatedOn": manufacturedOn, // TODO: This should be in String on Server, Right now it is in DateTime "OfferedItemCreatedOn": manufacturedOn, // TODO: This should be in String on Server, Right now it is in DateTime
"ServiceProviderID": providerId, "ServiceProviderID": providerId,
"OfferStatus": RequestOfferStatusEnum.offer.getIdFromRequestOfferStatusEnum(), "OfferStatus": RequestOfferStatusEnum.offer.getIdFromRequestOfferStatusEnum(),
"Comment": message, "Comment": message,
@ -610,7 +610,7 @@ class ChatVM extends BaseVM {
int providerId = AppState().getUser.data!.userInfo!.providerId!; int providerId = AppState().getUser.data!.userInfo!.providerId!;
Utils.showLoading(context); Utils.showLoading(context);
List<ChatMessageModel> chatMessages = await chatRepo.getUsersChatMessagesForRequests(providerId: providerId, customerId: customerId, requestOfferId: requestOfferId, requestId: requestId); List<ChatMessageModel> chatMessages = await chatRepo.getUsersChatMessagesForRequests(providerId: providerId, customerId: customerId, requestOfferId: requestOfferId, requestId: requestId);
context.read<RequestsVM>().overwriteChatMessagesInRequestsModel(messages: chatMessages, index: customerRequestIndex, context: context); await context.read<RequestsVM>().overwriteChatMessagesInRequestsModel(messages: chatMessages, index: customerRequestIndex, context: context);
List<int> unreadMessageIds = []; List<int> unreadMessageIds = [];
for (var msg in chatMessages) { for (var msg in chatMessages) {
if (!msg.isRead! && !msg.isMyMessage!) { if (!msg.isRead! && !msg.isMyMessage!) {
@ -674,7 +674,7 @@ class ChatVM extends BaseVM {
"RequestID": requestId, "RequestID": requestId,
"Price": double.parse(offerPrice), "Price": double.parse(offerPrice),
"ServiceItem": serviceItemName, "ServiceItem": serviceItemName,
"OfferedItemCreatedBy": manufacturedByName, "OfferedItemCreatedByName": manufacturedByName,
// "OfferedItemCreatedOn": manufacturedOn, // "OfferedItemCreatedOn": manufacturedOn,
"ServiceProviderID": serviceProviderID, "ServiceProviderID": serviceProviderID,
"OfferStatus": requestOfferStatusEnum.getIdFromRequestOfferStatusEnum(), "OfferStatus": requestOfferStatusEnum.getIdFromRequestOfferStatusEnum(),

@ -81,18 +81,20 @@ class DashboardVMProvider extends BaseVM {
requestsVM.populateDataForRequestsFilter(); requestsVM.populateDataForRequestsFilter();
appointmentVM.populateAppointmentsFilterList(); appointmentVM.populateAppointmentsFilterList();
shippingManagementVM.populateShippingRequestFilterList(); shippingManagementVM.populateShippingRequestFilterList();
await serviceVM.getBranchAndServices();
await serviceVM.populateBranchServiceFilters(); await serviceVM.populateBranchServiceFilters();
await appointmentVM.getMyAppointmentsForProvider(branchID: appointmentVM.selectedBranchIdForAppointments);
adVM.populateAdsFilterList(); await serviceVM.getBranchAndServices();
await subscriptionsVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true);
if (dashboardRouteEnum != DashboardRouteEnum.fromAdsPayment && dashboardRouteEnum != DashboardRouteEnum.fromAdsSubmit) { if (dashboardRouteEnum != DashboardRouteEnum.fromAdsPayment && dashboardRouteEnum != DashboardRouteEnum.fromAdsSubmit) {
await adVM.getMyAds(); await adVM.getMyAds();
await adVM.getExploreAds(); await adVM.getExploreAds();
} }
await appointmentVM.getMyAppointmentsForProvider(branchID: appointmentVM.selectedBranchIdForAppointments);
adVM.populateAdsFilterList();
await requestsVM.getRequests();
await subscriptionsVM.getSubscriptionBySP(AppState().getUser.data?.userInfo?.providerId.toString() ?? "", true);
await adVM.getVehicleTypes(); await adVM.getVehicleTypes();
await adVM.getVehicleAdsDuration(); await adVM.getVehicleAdsDuration();
await requestsVM.getRequests();
await chatVM.buildHubConnection(context); await chatVM.buildHubConnection(context);
} }
@ -128,7 +130,7 @@ class DashboardVMProvider extends BaseVM {
void performCheckOnUsers(BuildContext context, Function() callBack) async { void performCheckOnUsers(BuildContext context, Function() callBack) async {
if (AppState().getproviderSubscription.isNotEmpty && AppState().getproviderSubscription.first.subUsersRemaining! > 0) { if (AppState().getproviderSubscription.isNotEmpty && AppState().getproviderSubscription.first.subUsersRemaining! > 0) {
showMyBottomSheet(context, isDismissible: false, child: const AddPhoneNumWidget(), callBackFunc: callBack); showMyBottomSheet(context, isDismissible: false, isScrollControlled: true, child: AddPhoneNumWidget(), callBackFunc: callBack);
} else { } else {
Utils.showToast(LocaleKeys.upgradeSubUsers.tr()); Utils.showToast(LocaleKeys.upgradeSubUsers.tr());
} }

@ -215,13 +215,13 @@ class RequestsVM extends BaseVM {
notifyListeners(); notifyListeners();
} }
overwriteChatMessagesInRequestsModel({required List<ChatMessageModel> messages, required int index, required BuildContext context}) { overwriteChatMessagesInRequestsModel({required List<ChatMessageModel> messages, required int index, required BuildContext context}) async {
if (myFilteredRequests.isEmpty) return; if (myFilteredRequests.isEmpty) return;
myFilteredRequests[index].chatMessages = messages; myFilteredRequests[index].chatMessages = messages;
if (myFilteredRequests[index].chatMessages.isNotEmpty) { if (myFilteredRequests[index].chatMessages.isNotEmpty) {
for (var message in myFilteredRequests[index].chatMessages) { for (var message in myFilteredRequests[index].chatMessages) {
if (message.chatMessageTypeEnum == ChatMessageTypeEnum.offer) { if (message.chatMessageTypeEnum == ChatMessageTypeEnum.offer) {
context.read<ChatVM>().updateLatestOfferId(message.reqOfferID ?? 0); await context.read<ChatVM>().updateLatestOfferId(message.reqOfferID ?? 0);
if (message.reqOffer!.requestOfferStatusEnum == RequestOfferStatusEnum.accepted) { if (message.reqOffer!.requestOfferStatusEnum == RequestOfferStatusEnum.accepted) {
updateAcceptedReqOffer(message.reqOffer!); updateAcceptedReqOffer(message.reqOffer!);
updateAcceptedRequestOfferProviderName(message.senderName ?? ""); updateAcceptedRequestOfferProviderName(message.senderName ?? "");

@ -65,6 +65,15 @@ class UserVM extends BaseVM {
_loginOtherAccount = value; _loginOtherAccount = value;
} }
bool isImagepUploading = false;
bool get getIsImagepUploading => isImagepUploading;
set setIsImagepUploading(bool value) {
isImagepUploading = value;
notifyListeners();
}
Country? userCountries; Country? userCountries;
Cities? userCities; Cities? userCities;
@ -198,11 +207,13 @@ class UserVM extends BaseVM {
notifyListeners(); notifyListeners();
} }
Future<void> performCompleteProfile(BuildContext context, { Future<void> performCompleteProfile(
BuildContext context, {
required String password, required String password,
required String confirmPassword, required String confirmPassword,
required String firstName, required String firstName,
required String lastName, required String lastName,
required String companyName,
required String email, required String email,
required String? userId, required String? userId,
bool isNeedToPassToken = false, bool isNeedToPassToken = false,
@ -212,15 +223,7 @@ class UserVM extends BaseVM {
if (Utils.passwordValidateStructure(password)) { if (Utils.passwordValidateStructure(password)) {
if (password == confirmPassword) { if (password == confirmPassword) {
Utils.showLoading(context); Utils.showLoading(context);
RegisterUserRespModel user = await userRepo.basicComplete( RegisterUserRespModel user = await userRepo.basicComplete(userId ?? "", firstName, lastName, companyName, email, password, cityID, genderID, isNeedToPassToken: isNeedToPassToken);
userId ?? "",
firstName,
lastName,
email,
password,
cityID,
genderID,
isNeedToPassToken: isNeedToPassToken);
Utils.hideLoading(context); Utils.hideLoading(context);
if (user.messageStatus == 1) { if (user.messageStatus == 1) {
Utils.showToast(LocaleKeys.successfullyRegistered.tr()); Utils.showToast(LocaleKeys.successfullyRegistered.tr());
@ -242,6 +245,7 @@ class UserVM extends BaseVM {
required String password, required String password,
required String? firstName, required String? firstName,
required String? lastName, required String? lastName,
required String? companyName,
required String? email, required String? email,
required DropValue? city, required DropValue? city,
required DropValue? gender, required DropValue? gender,
@ -255,6 +259,11 @@ class UserVM extends BaseVM {
Utils.showToast(LocaleKeys.surnameNameMandatory.tr()); Utils.showToast(LocaleKeys.surnameNameMandatory.tr());
//("Surname is mandatory"); //("Surname is mandatory");
isValid = false; isValid = false;
} else if (companyName!.isEmpty) {
if (AppState().currentAppType == AppType.provider) {
Utils.showToast(LocaleKeys.companyNameMandatory.tr());
isValid = false;
}
} else if (email!.isNotEmpty) { } else if (email!.isNotEmpty) {
if (!Utils.isEmailValid(email)) { if (!Utils.isEmailValid(email)) {
Utils.showToast(LocaleKeys.enterValidEmail.tr()); Utils.showToast(LocaleKeys.enterValidEmail.tr());
@ -585,6 +594,7 @@ class UserVM extends BaseVM {
? phoneNum ? phoneNum
: phoneNum, : phoneNum,
password); password);
Utils.hideLoading(context); Utils.hideLoading(context);
LoginPasswordRespModel user = LoginPasswordRespModel.fromJson(jsonDecode(response.body)); LoginPasswordRespModel user = LoginPasswordRespModel.fromJson(jsonDecode(response.body));
if (user.messageStatus == 1) { if (user.messageStatus == 1) {
@ -683,9 +693,22 @@ class UserVM extends BaseVM {
Future<void> updateUserImage(BuildContext context) async { Future<void> updateUserImage(BuildContext context) async {
File? myPick = await commanServices.pickFile(context, fileType: FileType.image); File? myPick = await commanServices.pickFile(context, fileType: FileType.image);
if (myPick != null) { if (myPick != null) {
await userRepo.updateUserImage(encodeBase64Image(myPick)); setIsImagepUploading = true;
AppState().getUser.data!.userInfo!.userLocalImage = myPick; ImageResponse image = await userRepo.updateUserImage(encodeBase64Image(myPick));
print(image.message);
print(image.messageStatus);
if (image.messageStatus == 1) {
UserInfo user = AppState().getUser.data!.userInfo!;
user.userLocalImage = myPick;
AppState().setUser = User(data: UserData(userInfo: user));
setIsImagepUploading = false;
notifyListeners(); notifyListeners();
} else {
Utils.showToast(image.message!);
setIsImagepUploading = false;
notifyListeners();
}
} }
notifyListeners(); notifyListeners();
} }
@ -718,13 +741,8 @@ class UserVM extends BaseVM {
} }
void changeLanguage(BuildContext context) { void changeLanguage(BuildContext context) {
print("${EasyLocalization print("${EasyLocalization.of(context)?.currentLocale}");
.of(context) if (EasyLocalization.of(context)?.currentLocale?.countryCode == "SA") {
?.currentLocale}");
if (EasyLocalization
.of(context)
?.currentLocale
?.countryCode == "SA") {
context.setLocale(const Locale("en", "US")); context.setLocale(const Locale("en", "US"));
} else { } else {
context.setLocale(const Locale('ar', 'SA')); context.setLocale(const Locale('ar', 'SA'));
@ -749,13 +767,8 @@ class UserVM extends BaseVM {
AppState().setUser = null; AppState().setUser = null;
if (AppState().currentAppType == AppType.provider) { if (AppState().currentAppType == AppType.provider) {
AppState().setproviderSubscription = null; AppState().setproviderSubscription = null;
context context.read<SubscriptionsVM>().mySubscriptionsBySp.clear();
.read<SubscriptionsVM>() context.read<SubscriptionsVM>().allSubscriptions = SubscriptionModel();
.mySubscriptionsBySp
.clear();
context
.read<SubscriptionsVM>()
.allSubscriptions = SubscriptionModel();
} }
navigateReplaceWithNameUntilRoute(context, AppRoutes.registerSelection); navigateReplaceWithNameUntilRoute(context, AppRoutes.registerSelection);

@ -1,7 +1,9 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.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/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/widgets/common_widgets/dotted_rect.dart'; import 'package:mc_common_app/widgets/common_widgets/dotted_rect.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
class DottedRoundedCard extends StatelessWidget { class DottedRoundedCard extends StatelessWidget {
final Function() onTap; final Function() onTap;
@ -26,7 +28,7 @@ class DottedRoundedCard extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
icon, icon,
SizedBox(width: 8), const SizedBox(width: 8),
text.toText( text.toText(
fontSize: 15, fontSize: 15,
isBold: true, isBold: true,
@ -44,18 +46,17 @@ class DottedRectContainer extends StatelessWidget {
final Function() onTap; final Function() onTap;
final String text; final String text;
final Widget icon; final Widget icon;
final String extensions;
const DottedRectContainer({Key? key, required this.onTap, required this.text, required this.icon}) : super(key: key); const DottedRectContainer({Key? key, required this.onTap, required this.text, required this.icon, required this.extensions}) : super(key: key);
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return InkWell( return InkWell(
onTap: onTap, onTap: onTap,
child: Container( child: Column(
height: 46, children: [
width: double.infinity, DashedRect(
color: MyColors.white,
child: DashedRect(
color: MyColors.lightIconColor, color: MyColors.lightIconColor,
strokeWidth: 2.0, strokeWidth: 2.0,
gap: 4.0, gap: 4.0,
@ -63,15 +64,28 @@ class DottedRectContainer extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.center, mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
icon, icon,
SizedBox(width: 8), const SizedBox(width: 8),
text.toText( text
.toText(
fontSize: 15, fontSize: 15,
isBold: true, isBold: true,
color: MyColors.darkPrimaryColor, color: MyColors.darkPrimaryColor,
), )
.paddingAll(6),
], ],
), ),
), ),
8.height,
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [
"( $extensions )".toText(
fontSize: 8,
color: MyColors.lightTextColor,
),
],
)
],
), ),
); );
} }

@ -300,6 +300,7 @@ class VehicleDetails extends StatelessWidget {
onTap: () => context.read<AdVM>().pickMultipleImages(), onTap: () => context.read<AdVM>().pickMultipleImages(),
text: LocaleKeys.attachImage.tr(), text: LocaleKeys.attachImage.tr(),
icon: MyAssets.attachmentIcon.buildSvg(), icon: MyAssets.attachmentIcon.buildSvg(),
extensions: GlobalConsts.allowedFileExtensions,
), ),
], ],
if (adVM.vehicleImageError != "") ...[ if (adVM.vehicleImageError != "") ...[

@ -12,6 +12,7 @@ import 'package:mc_common_app/generated/locale_keys.g.dart';
import 'package:mc_common_app/models/chat_models/chat_message_model.dart'; import 'package:mc_common_app/models/chat_models/chat_message_model.dart';
import 'package:mc_common_app/models/requests_models/request_model.dart'; import 'package:mc_common_app/models/requests_models/request_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart'; import 'package:mc_common_app/utils/dialogs_and_bottomsheets.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
@ -739,7 +740,8 @@ class _ChatMessageCustomWidgetState extends State<ChatMessageCustomWidget> {
requestVM.updateOfferPrice((offer.price ?? "").toString()); requestVM.updateOfferPrice((offer.price ?? "").toString());
requestVM.updateServiceItem((offer.serviceItemName ?? "").toString()); requestVM.updateServiceItem((offer.serviceItemName ?? "").toString());
requestVM.updateItemManufacturer((offer.manufacturedByName ?? "").toString()); requestVM.updateItemManufacturer((offer.manufacturedByName ?? "").toString());
requestVM.updateServiceItemCreatedOn((offer.manufacturedOn ?? "").toString()); requestVM.updateServiceItemCreatedOn(DateHelper.formatAsDayMonthYear(DateHelper.parseStringToDate(DateHelper.formatDateT(offer.manufacturedOn.toString() ?? ""))));
requestVM.updateOfferDescription((widget.chatMessageModel.chatText ?? "").toString()); requestVM.updateOfferDescription((widget.chatMessageModel.chatText ?? "").toString());
requestVM.updateIsDeliveryAvailableStatus((offer.isDeliveryAvailable ?? false)); requestVM.updateIsDeliveryAvailableStatus((offer.isDeliveryAvailable ?? false));
if (offer.reqOfferImages != null && offer.reqOfferImages!.isNotEmpty) { if (offer.reqOfferImages != null && offer.reqOfferImages!.isNotEmpty) {

@ -48,9 +48,6 @@ class _ProfileScreenState extends State<ProfileScreen> {
String freeTrialName = ""; String freeTrialName = "";
if (AppState().currentAppType == AppType.provider && AppState().getproviderSubscription.isNotEmpty) { if (AppState().currentAppType == AppType.provider && AppState().getproviderSubscription.isNotEmpty) {
mySubscription = AppState().getproviderSubscription.first; mySubscription = AppState().getproviderSubscription.first;
log("mySubscription!.dateStart.toString(): ${mySubscription!.dateStart}");
log("mySubscription!.dateEnd.toString(): ${mySubscription!.dateEnd}");
if (mySubscription!.id == 1) { if (mySubscription!.id == 1) {
freeTrialName = mySubscription!.name ?? ""; freeTrialName = mySubscription!.name ?? "";
} else { } else {
@ -176,7 +173,15 @@ class _ProfileScreenState extends State<ProfileScreen> {
height: 100, height: 100,
alignment: Alignment.centerLeft, alignment: Alignment.centerLeft,
child: ClipOval( child: ClipOval(
child: AppState().getUser.data!.userInfo!.userLocalImage != null child: model.isImagepUploading
? SizedBox(
width: 100,
height: 100,
child: Center(
child: CircularProgressIndicator(),
).toCircle(borderRadius: 100),
)
: AppState().getUser.data!.userInfo!.userLocalImage != null
? Image.file( ? Image.file(
AppState().getUser.data!.userInfo!.userLocalImage!, AppState().getUser.data!.userInfo!.userLocalImage!,
width: 100, width: 100,

@ -239,6 +239,7 @@ class CreateRequestPage extends StatelessWidget {
onTap: () => context.read<RequestsVM>().pickMultipleImages(), onTap: () => context.read<RequestsVM>().pickMultipleImages(),
text: LocaleKeys.attachImage.tr(), text: LocaleKeys.attachImage.tr(),
icon: MyAssets.attachmentIcon.buildSvg(), icon: MyAssets.attachmentIcon.buildSvg(),
extensions: GlobalConsts.allowedFileExtensions,
), ),
], ],
if (requestsVM.vehicleImageError != "") ...[ if (requestsVM.vehicleImageError != "") ...[

@ -2,6 +2,7 @@ import 'dart:developer';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:mc_common_app/classes/app_state.dart';
import 'package:mc_common_app/classes/consts.dart'; import 'package:mc_common_app/classes/consts.dart';
import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/config/routes.dart';
import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart';
@ -9,6 +10,7 @@ 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/chat_models/chat_message_model.dart'; import 'package:mc_common_app/models/chat_models/chat_message_model.dart';
import 'package:mc_common_app/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/utils/date_helper.dart';
import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/utils/utils.dart';
@ -66,20 +68,27 @@ Future buildSendOfferBottomSheet({
if (requestDetail.requestType == RequestsTypeEnum.serviceRequest.getIdFromRequestTypeEnum()) ...[ if (requestDetail.requestType == RequestsTypeEnum.serviceRequest.getIdFromRequestTypeEnum()) ...[
12.height, 12.height,
TxtField( TxtField(
value: requestsVM.itemManufacturer, onTap: () {},
isNeedClickAll: true,
isButtonEnable: false,
isBackgroundEnabled: true,
value: "${AppState().getUser.data!.userInfo!.firstName} ${AppState().getUser.data!.userInfo!.lastName}",
errorValue: requestsVM.offerPriceError, errorValue: requestsVM.offerPriceError,
hint: LocaleKeys.createdBy.tr(), hint: LocaleKeys.createdBy.tr(),
onChanged: (v) => requestsVM.updateItemManufacturer(v), onChanged: (v) => requestsVM.updateItemManufacturer(v),
), ),
12.height, 12.height,
TxtField( TxtField(
isButtonEnable: false,
isBackgroundEnabled: true,
errorValue: "", errorValue: "",
hint: LocaleKeys.createdOn.tr(), hint: LocaleKeys.createdOn.tr(),
value: requestsVM.serviceItemCreatedOn, value: DateHelper.formatAsYearMonthDay(DateTime.now()),
isNeedClickAll: true, isNeedClickAll: true,
postfixData: Icons.calendar_month_rounded, postfixData: Icons.calendar_month_rounded,
postFixDataColor: MyColors.darkTextColor, postFixDataColor: MyColors.darkTextColor,
onTap: () async { onTap: () async {
return;
final formattedDate = await Utils.pickDateFromDatePicker(context, firstDate: DateTime(2020), lastDate: DateTime.now()); final formattedDate = await Utils.pickDateFromDatePicker(context, firstDate: DateTime(2020), lastDate: DateTime.now());
requestsVM.updateServiceItemCreatedOn(formattedDate); requestsVM.updateServiceItemCreatedOn(formattedDate);
}, },
@ -126,6 +135,7 @@ Future buildSendOfferBottomSheet({
onTap: () => context.read<RequestsVM>().pickMultipleImages(), onTap: () => context.read<RequestsVM>().pickMultipleImages(),
text: LocaleKeys.attachImage.tr(), text: LocaleKeys.attachImage.tr(),
icon: MyAssets.attachmentIcon.buildSvg(), icon: MyAssets.attachmentIcon.buildSvg(),
extensions: GlobalConsts.allowedFileExtensions,
), ),
], ],
if (requestsVM.pickedVehicleImages.isNotEmpty) ...[ if (requestsVM.pickedVehicleImages.isNotEmpty) ...[
@ -145,6 +155,10 @@ Future buildSendOfferBottomSheet({
title: offerId == null ? LocaleKeys.submit.tr() : LocaleKeys.update.tr(), title: offerId == null ? LocaleKeys.submit.tr() : LocaleKeys.update.tr(),
maxHeight: 55, maxHeight: 55,
onPressed: () { onPressed: () {
requestsVM.updateItemManufacturer(
"${AppState().getUser.data!.userInfo!.firstName} ${AppState().getUser.data!.userInfo!.lastName}",
);
requestsVM.updateServiceItemCreatedOn(DateHelper.formatAsYearMonthDay(DateTime.now()));
if (offerId == null) { if (offerId == null) {
requestsVM.onSendOfferPressed( requestsVM.onSendOfferPressed(
context: context, context: context,

@ -235,6 +235,7 @@ class _ProviderLicensePageState extends State<ProviderLicensePage> {
onTap: () => serviceVM.pickPdfReceiptFile(context, document.documentId!, index) ?? "", onTap: () => serviceVM.pickPdfReceiptFile(context, document.documentId!, index) ?? "",
text: LocaleKeys.attachPDF.tr(), text: LocaleKeys.attachPDF.tr(),
icon: MyAssets.attachmentIcon.buildSvg(), icon: MyAssets.attachmentIcon.buildSvg(),
extensions: GlobalConsts.allowedFileExtensionsPDF,
), ),
] ]
], ],

@ -6,6 +6,7 @@ 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/user_models/register_user.dart'; import 'package:mc_common_app/models/user_models/register_user.dart';
import 'package:mc_common_app/utils/enums.dart';
import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/navigator.dart';
import 'package:mc_common_app/view_models/user_view_model.dart'; import 'package:mc_common_app/view_models/user_view_model.dart';
import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/common_widgets/app_bar.dart';
@ -27,10 +28,7 @@ class CompleteProfilePage extends StatefulWidget {
} }
class _CompleteProfilePageState extends State<CompleteProfilePage> { class _CompleteProfilePageState extends State<CompleteProfilePage> {
String? firstName = "", String? firstName = "", lastName = "", email = "", confirmPassword = "", companyName = "";
lastName = "",
email = "",
confirmPassword = "";
late String password = ""; late String password = "";
bool isChecked = false; bool isChecked = false;
DropValue? city; DropValue? city;
@ -41,12 +39,10 @@ class _CompleteProfilePageState extends State<CompleteProfilePage> {
super.initState(); super.initState();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
context.read<UserVM>().getAllCitiesForUser(AppState().getUserRegisterCountrySelection.id);
return Consumer(builder: (BuildContext context, UserVM userVM, Widget? child) { return Consumer(builder: (BuildContext context, UserVM userVM, Widget? child) {
userVM.getAllCitiesForUser(AppState().getUserRegisterCountrySelection.id);
return Scaffold( return Scaffold(
appBar: CustomAppBar( appBar: CustomAppBar(
isRemoveBackButton: widget.user.data!.roleId == 7 ? false : true, isRemoveBackButton: widget.user.data!.roleId == 7 ? false : true,
@ -93,6 +89,16 @@ class _CompleteProfilePageState extends State<CompleteProfilePage> {
lastName = v; lastName = v;
}, },
), ),
if (AppState().currentAppType == AppType.provider) ...[
12.height,
TxtField(
hint: LocaleKeys.companyName.tr(),
value: companyName,
onChanged: (v) {
companyName = v;
},
),
],
12.height, 12.height,
Container( Container(
padding: const EdgeInsets.only(right: 0, left: 0, top: 0, bottom: 0), padding: const EdgeInsets.only(right: 0, left: 0, top: 0, bottom: 0),
@ -236,12 +242,7 @@ class _CompleteProfilePageState extends State<CompleteProfilePage> {
if (!userVM.completeProfilePageCheckbox) { if (!userVM.completeProfilePageCheckbox) {
return; return;
} }
bool validateStatus = userVM.dataValidation(password: password, bool validateStatus = userVM.dataValidation(password: password, firstName: firstName, lastName: lastName, companyName: companyName, email: email, city: city, gender: gender);
firstName: firstName,
lastName: lastName,
email: email,
city: city,
gender: gender);
if (validateStatus) { if (validateStatus) {
userVM.performCompleteProfile( userVM.performCompleteProfile(
context, context,
@ -249,6 +250,7 @@ class _CompleteProfilePageState extends State<CompleteProfilePage> {
confirmPassword: confirmPassword!, confirmPassword: confirmPassword!,
firstName: firstName!, firstName: firstName!,
lastName: lastName!, lastName: lastName!,
companyName: companyName!,
email: email!, email: email!,
userId: widget.user.data!.userId ?? "", userId: widget.user.data!.userId ?? "",
isNeedToPassToken: widget.user.data!.isNeedToPassToken, isNeedToPassToken: widget.user.data!.isNeedToPassToken,
@ -265,7 +267,6 @@ class _CompleteProfilePageState extends State<CompleteProfilePage> {
), ),
), ),
); );
} });
);
} }
} }

@ -1,7 +1,10 @@
import 'dart:async'; import 'dart:async';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/gestures.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/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';
@ -12,6 +15,7 @@ import 'package:mc_common_app/utils/utils.dart';
import 'package:mc_common_app/view_models/user_view_model.dart'; import 'package:mc_common_app/view_models/user_view_model.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/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/txt_field.dart'; import 'package:mc_common_app/widgets/txt_field.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -24,13 +28,13 @@ class AddPhoneNumWidget extends StatefulWidget {
class _AddPhoneNumWidgetState extends State<AddPhoneNumWidget> { class _AddPhoneNumWidgetState extends State<AddPhoneNumWidget> {
String phoneNum = "", countryCode = ""; String phoneNum = "", countryCode = "";
DropValue? countryCodeVal;
late UserVM userVM; late UserVM userVM;
Country? _country; Country? _country;
@override @override
void initState() { void initState() {
super.initState(); super.initState();
scheduleMicrotask(() { scheduleMicrotask(() {
userVM = Provider.of(context, listen: false); userVM = Provider.of(context, listen: false);
getCountryList(); getCountryList();
@ -56,7 +60,25 @@ class _AddPhoneNumWidgetState extends State<AddPhoneNumWidget> {
children: [ children: [
"Enter Phone Number".toText(fontSize: 16, isBold: true), "Enter Phone Number".toText(fontSize: 16, isBold: true),
8.height, 8.height,
getCountry(context), Container(
decoration: Utils.containerColorRadiusBorderWidth(MyColors.white, 0, MyColors.darkPrimaryColor, 2),
margin: const EdgeInsets.all(0),
padding: const EdgeInsets.only(left: 8, right: 8),
width: null,
child: Row(
children: [
if (countryCode.isEmpty) ...[
LocaleKeys.selectCountryCode.tr().toText(color: borderColor, fontSize: 15, fontWeight: MyFonts.Medium).paddingOnly(top: 12, bottom: 12),
] else ...[
countryCode.toText(fontSize: 15, fontWeight: MyFonts.Medium).paddingOnly(top: 12, bottom: 12),
]
],
),
).onPress(() {
if (_country != null) {
getCountry(context);
}
}),
8.height, 8.height,
TxtField( TxtField(
keyboardType: TextInputType.phone, keyboardType: TextInputType.phone,
@ -103,24 +125,20 @@ class _AddPhoneNumWidgetState extends State<AddPhoneNumWidget> {
); );
} }
Widget getCountry(BuildContext context) { void getCountry(BuildContext context) {
if (_country != null) {
List<DropValue> dropList = []; List<DropValue> dropList = [];
_country!.data?.forEach((element) { _country!.data?.forEach((element) {
dropList.add(DropValue(element.id ?? 0, "${element.countryName ?? ""} ${element.countryCode ?? ""}", element.countryCode ?? "")); dropList.add(DropValue(element.id ?? 0, "${element.countryName ?? ""} ${element.countryCode ?? ""}", element.countryCode ?? ""));
}); });
return DropdownField( return showCustomBottomPicker(
(DropValue value) { items: dropList,
onItemSelected: (value) {
AppState().setUserRegisterCountrySelection = value;
countryCode = value.subValue; countryCode = value.subValue;
countryCodeVal = value;
setState(() {});
}, },
list: dropList, context: context);
hint: countryCode.isNotEmpty ? countryCode.toString() : LocaleKeys.selectCountryCode.tr(),
);
} else {
return const Center(
child: CircularProgressIndicator(),
);
}
} }
bool validation() { bool validation() {
@ -137,3 +155,73 @@ class _AddPhoneNumWidgetState extends State<AddPhoneNumWidget> {
return isValid; return isValid;
} }
} }
class CustomBottomPicker extends StatelessWidget {
final List<DropValue> items;
final void Function(DropValue selectedItem) onItemSelected;
const CustomBottomPicker({
Key? key,
required this.items,
required this.onItemSelected,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return GestureDetector(
onTap: () => Navigator.of(context).pop(),
child: Container(
color: Colors.black.withOpacity(0.4),
child: DraggableScrollableSheet(
initialChildSize: 0.2,
maxChildSize: 0.4,
minChildSize: 0.2,
expand: true,
builder: (context, scrollController) {
return Container(
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.vertical(top: Radius.circular(16)),
),
child: ListView.builder(
controller: scrollController,
itemCount: items.length,
shrinkWrap: true,
physics: const AlwaysScrollableScrollPhysics(),
itemBuilder: (context, index) {
return ListTile(
title: Text(items[index].value),
onTap: () {
onItemSelected(items[index]);
Navigator.of(context).pop();
},
);
},
),
);
},
),
),
);
}
}
// Function to show the bottom picker
void showCustomBottomPicker({
required BuildContext context,
required List<DropValue> items,
required void Function(DropValue selectedItem) onItemSelected,
}) {
showModalBottomSheet(
context: context,
isScrollControlled: true,
isDismissible: false,
backgroundColor: Colors.transparent,
builder: (context) {
return CustomBottomPicker(
items: items,
onItemSelected: onItemSelected,
);
},
);
}

@ -8,7 +8,9 @@ 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/theme/colors.dart'; import 'package:mc_common_app/theme/colors.dart';
import 'package:mc_common_app/view_models/user_view_model.dart';
import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:mc_common_app/widgets/extensions/extensions_widget.dart';
import 'package:provider/provider.dart';
class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
final Color? backgroundColor; final Color? backgroundColor;
@ -61,7 +63,8 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
onTap: onTap, onTap: onTap,
child: Row( child: Row(
children: [ children: [
profileImageUrl.isEmpty && AppState().getUser.data!.userInfo!.userLocalImage != null Consumer(builder: (BuildContext context, UserVM uvm, Widget? child) {
return profileImageUrl.isEmpty && AppState().getUser.data!.userInfo!.userLocalImage != null
? Image.file( ? Image.file(
AppState().getUser.data!.userInfo!.userLocalImage!, AppState().getUser.data!.userInfo!.userLocalImage!,
width: 34, width: 34,
@ -71,8 +74,7 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
: profileImageUrl.isEmpty && AppState().getUser.data!.userInfo!.userImageUrl != null : profileImageUrl.isEmpty && AppState().getUser.data!.userInfo!.userImageUrl != null
? CachedNetworkImage( ? CachedNetworkImage(
imageUrl: AppState().getUser.data!.userInfo!.userImageUrl, imageUrl: AppState().getUser.data!.userInfo!.userImageUrl,
imageBuilder: (context, imageProvider) => imageBuilder: (context, imageProvider) => Container(
Container(
decoration: BoxDecoration( decoration: BoxDecoration(
image: DecorationImage( image: DecorationImage(
image: imageProvider, image: imageProvider,
@ -94,7 +96,8 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
width: 34, width: 34,
height: 34, height: 34,
fit: BoxFit.fill, fit: BoxFit.fill,
).toCircle(borderRadius: 100), ).toCircle(borderRadius: 100);
}),
10.width, 10.width,
SvgPicture.asset(MyAssets.dashboardDrawerIcon), SvgPicture.asset(MyAssets.dashboardDrawerIcon),
], ],
@ -129,10 +132,7 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget {
actions: actions, actions: actions,
title: (title ?? "").toText(fontSize: 20), title: (title ?? "").toText(fontSize: 20),
), ),
if (backgroundColor == null) if (backgroundColor == null) const Divider(thickness: 1, height: 1)
const Divider(
thickness: 1,
height: 1)
], ],
); );
} }

@ -68,10 +68,11 @@ class BranchDetailCard extends StatelessWidget {
], ],
if (providerName != null) if (providerName != null)
Row( Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
("${LocaleKeys.provider.tr()}:").toText(color: MyColors.lightTextColor, fontSize: 12), ("${LocaleKeys.provider.tr()}:").toText(color: MyColors.lightTextColor, fontSize: 12),
4.width, 4.width,
providerName!.toText(fontSize: 12, isBold: true), Flexible(child: providerName!.toText(fontSize: 12, isBold: true),)
], ],
), ),
], ],

@ -28,6 +28,7 @@ class DropdownField extends StatefulWidget {
final List<DropValue>? list; final List<DropValue>? list;
final DropValue? dropdownValue; final DropValue? dropdownValue;
final Function(DropValue) onSelect; final Function(DropValue) onSelect;
final Function()? onTap;
final bool showAppointmentPickerVariant; final bool showAppointmentPickerVariant;
final TextStyle? textStyle; final TextStyle? textStyle;
final bool isSelectAble; final bool isSelectAble;
@ -50,6 +51,7 @@ class _DropdownFieldState extends State<DropdownField> {
super.initState(); super.initState();
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
dropdownValue = widget.dropdownValue; dropdownValue = widget.dropdownValue;
@ -58,13 +60,19 @@ class _DropdownFieldState extends State<DropdownField> {
IgnorePointer( IgnorePointer(
ignoring: !widget.isSelectAble, ignoring: !widget.isSelectAble,
child: Container( child: Container(
decoration: widget.showAppointmentPickerVariant ? null : Utils.containerColorRadiusBorderWidth(MyColors.white, 0, widget.isSelectAble ? MyColors.darkPrimaryColor : MyColors.greyACColor, 2), decoration:
widget.showAppointmentPickerVariant ? null : Utils.containerColorRadiusBorderWidth(MyColors.white, 0, widget.isSelectAble ? MyColors.darkPrimaryColor : MyColors.greyACColor, 2),
margin: const EdgeInsets.all(0), margin: const EdgeInsets.all(0),
padding: const EdgeInsets.only(left: 8, right: 8), padding: const EdgeInsets.only(left: 8, right: 8),
width: widget.showAppointmentPickerVariant ? 170 : null, width: widget.showAppointmentPickerVariant ? 170 : null,
child: DropdownButton<DropValue>( child: DropdownButton<DropValue>(
value: dropdownValue, value: dropdownValue,
icon: Icon(Icons.keyboard_arrow_down_sharp, color: !widget.isSelectAble ? Colors.transparent : null, size: 21,), icon: Icon(
Icons.keyboard_arrow_down_sharp,
color: !widget.isSelectAble ? Colors.transparent : null,
size: 21,
),
elevation: 16, elevation: 16,
iconSize: widget.showAppointmentPickerVariant ? 26 : 16, iconSize: widget.showAppointmentPickerVariant ? 26 : 16,
iconEnabledColor: borderColor, iconEnabledColor: borderColor,
@ -82,6 +90,8 @@ class _DropdownFieldState extends State<DropdownField> {
widget.onSelect(newValue); widget.onSelect(newValue);
}); });
}, },
onTap: widget.onTap,
items: (widget.list ?? defaultV).map<DropdownMenuItem<DropValue>>( items: (widget.list ?? defaultV).map<DropdownMenuItem<DropValue>>(
(DropValue value) { (DropValue value) {
return DropdownMenuItem<DropValue>( return DropdownMenuItem<DropValue>(

Loading…
Cancel
Save