From 6071cfd9766f401bb45c158c52ef24fc1aa812fd Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Wed, 22 Mar 2023 16:47:36 +0300 Subject: [PATCH 1/2] implement provider register page --- lib/config/routes.dart | 7 +++++-- lib/views/user/register_page.dart | 8 ++++---- lib/views/user/register_provider_page.dart | 8 ++++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 8d47fa8..6e1d741 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -21,6 +21,7 @@ import 'package:mc_common_app/views/user/login_with_password_page.dart'; // import 'package:mc_common_app/views/user/profile/profile_2_page.dart'; // import 'package:mc_common_app/views/user/profile/profile_3_page.dart'; import 'package:mc_common_app/views/user/register_page.dart'; +import 'package:mc_common_app/views/user/register_provider_page.dart'; import 'package:mc_common_app/views/user/register_selection_page.dart'; import 'package:mc_common_app/views/splash/splash_page.dart'; import 'package:mc_common_app/views/user/vertify_password_page.dart'; @@ -31,7 +32,8 @@ class AppRoutes { static const String splash = "/splash"; static const String registerSelection = "/registerSelection"; static const String loginVerifyAccount = "/loginVerifyAccount"; - static const String register = "/register"; + static const String registerCustomer = "/registerCustomer"; + static const String registerProvider= "/registerProvider"; static const String forgetPassword = "/forgetPassword"; static const String loginVerification = "/loginVerification"; static const String loginWithPassword = "/loginWithPassword"; @@ -59,7 +61,8 @@ class AppRoutes { splash: (context) => const SplashPage(), registerSelection: (context) => RegisterSelectionPage(), loginVerifyAccount: (context) => LoginVerifyAccountPage(), - register: (context) => RegisterPage(), + registerCustomer: (context) => RegisterCustomerPage(), + registerProvider: (context) => RegisterProviderPage(), forgetPassword: (context) => ForgetPasswordPage(), loginVerification: (context) => const LoginVerificationPage(), loginWithPassword: (context) => LoginWithPassword(), diff --git a/lib/views/user/register_page.dart b/lib/views/user/register_page.dart index ee7b879..74f0286 100644 --- a/lib/views/user/register_page.dart +++ b/lib/views/user/register_page.dart @@ -12,14 +12,14 @@ import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../../theme/colors.dart'; -class RegisterPage extends StatefulWidget { - const RegisterPage({Key? key}) : super(key: key); +class RegisterCustomerPage extends StatefulWidget { + const RegisterCustomerPage({Key? key}) : super(key: key); @override - State createState() => _RegisterPageState(); + State createState() => _RegisterPageState(); } -class _RegisterPageState extends State { +class _RegisterPageState extends State { String phoneNum = "", countryCode = ""; int role = 4, countryId = -1; diff --git a/lib/views/user/register_provider_page.dart b/lib/views/user/register_provider_page.dart index 5f165d0..9dbb229 100644 --- a/lib/views/user/register_provider_page.dart +++ b/lib/views/user/register_provider_page.dart @@ -18,14 +18,14 @@ import 'package:mc_common_app/widgets/tab/role_type_tab.dart'; import 'package:provider/provider.dart'; import '../../theme/colors.dart'; -class RegisterPage extends StatefulWidget { - const RegisterPage({Key? key}) : super(key: key); +class RegisterProviderPage extends StatefulWidget { + const RegisterProviderPage({Key? key}) : super(key: key); @override - State createState() => _RegisterPageState(); + State createState() => _RegisterPageState(); } -class _RegisterPageState extends State { +class _RegisterPageState extends State { String phoneNum = "", countryCode = ""; int role = -1, countryId = -1; From 86d352196d3818439cbac40a9b51807b4255db42 Mon Sep 17 00:00:00 2001 From: "mirza.shafique" Date: Thu, 23 Mar 2023 10:58:46 +0300 Subject: [PATCH 2/2] implement provider complete phase 1 --- assets/langs/ar-SA.json | 81 +++++++++++-------- assets/langs/en-US.json | 21 ++++- lib/classes/consts.dart | 4 + lib/view_models/user_view_model.dart | 54 ++++++++----- .../user/login_method_selection_page.dart | 9 ++- lib/views/user/register_selection_page.dart | 10 ++- lib/widgets/common_widgets/app_bar.dart | 31 ++++--- 7 files changed, 139 insertions(+), 71 deletions(-) diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json index 7796e9e..495e501 100644 --- a/assets/langs/ar-SA.json +++ b/assets/langs/ar-SA.json @@ -7,7 +7,7 @@ "defineLicences": "تحديد الرخص", "dealershipSettings": "اعدادات البيع", "changePassword": "تغيير كلمة المرور", - "retrievePassword" : "استرجاع كلمة المرور", + "retrievePassword": "استرجاع كلمة المرور", "changeEmail": "تغيير الايميل", "verify": "تحقق", "verified": "تم التحقق", @@ -34,8 +34,8 @@ "editAccount": "تعديل الحساب", "change": "تغيير", "verifyAccount": "التحقق من الحساب", - "login" : "تسجيل دخول", - "welcomeMessage" : "مرحبا", + "login": "تسجيل دخول", + "welcomeMessage": "مرحبا", "forgetPass": "نسيت كلمة المرور ؟", "enterPhoneNumber": "رقم جوال ", "phoneNumberVerified": "تم التحقق من الجوال", @@ -43,37 +43,37 @@ "EnterPass": "ادخل كلمة المرور", "alreadySigned": " تم تسجيل الدخول", "emailChangedSuccessfully": "تم تغيير الايميل بنجاح", - "passwordIsUpdated" : "تم تحجيث كلمة المرور", - "passwordShouldContains" : "كلمة المرور يجب ان تحتوي على رمز رقم حرف كبير حرف صغير", + "passwordIsUpdated": "تم تحجيث كلمة المرور", + "passwordShouldContains": "كلمة المرور يجب ان تحتوي على رمز رقم حرف كبير حرف صغير", " successfullyRegistered": "تم التسجيل بنجاح", - "pleaseEnterSamePassword" : "ادخل كلمة مرور مطابقه", - "firstNameMandatory" : "ادخل الأسم الأول ", - "surnameNameMandatory" : "ادخل اسم العائله", - "passwordNameMandatory" : "ادخل كلمة المرور", - "enterValidEmail" : "ادخل ايميل صحيح", - "pleaseAcceptTerms" : "يجب الموافقه على الشروط", - "emailVerified" : "تم التحقق من الايميل بنجاح", - "selectMethod" : "اختر", - "emailAddress" : "ايميل", - "loginSelection" : "اختر", - "selectCountryCode" : "اختر رمز الدوله", - "selectProviderRole" : "اختر نوع الخدمه", - "addPhoneNo" : "اضف الهاتف", + "pleaseEnterSamePassword": "ادخل كلمة مرور مطابقه", + "firstNameMandatory": "ادخل الأسم الأول ", + "surnameNameMandatory": "ادخل اسم العائله", + "passwordNameMandatory": "ادخل كلمة المرور", + "enterValidEmail": "ادخل ايميل صحيح", + "pleaseAcceptTerms": "يجب الموافقه على الشروط", + "emailVerified": "تم التحقق من الايميل بنجاح", + "selectMethod": "اختر", + "emailAddress": "ايميل", + "loginSelection": "اختر", + "selectCountryCode": "اختر رمز الدوله", + "selectProviderRole": "اختر نوع الخدمه", + "addPhoneNo": "اضف الهاتف", "onlyCustomerApp": "نأسف هذا التطبيق فقط للعملاء", - "imageUploaded" : "تم تحميل الصوره", - "fileLarger" : "1KB حجم الملف اكبر من", - "account" : "الحساب", - "edit" : "تعديل", - "imageDeleted" : "تم حذف الصوره", - "dashboard" : "الصفحه الرئيسيه", - "termsOfService":"من خلال إنشاء حساب فإنك توافق على", + "imageUploaded": "تم تحميل الصوره", + "fileLarger": "1KB حجم الملف اكبر من", + "account": "الحساب", + "edit": "تعديل", + "imageDeleted": "تم حذف الصوره", + "dashboard": "الصفحه الرئيسيه", + "termsOfService": "من خلال إنشاء حساب فإنك توافق على", "userInformation": "معلومات المتسخدم", "faceRecognition": "تحقق مع بصمة الوجه", - "fingerPrint" : "تحقق مع بصمة الاصبع", + "fingerPrint": "تحقق مع بصمة الاصبع", "whatsapp": "تحقق مع Whatsapp", "SMS": "رسائل قصيره", - "selectRole" : "حدد الدور", - "userRoleOrTitle" : "عنوان المستخدم", + "selectRole": "حدد الدور", + "userRoleOrTitle": "عنوان المستخدم", "codeSentToEmail": "تم ارسال الرمز للايميل", "number": "موبايل", "english": "English", @@ -134,18 +134,35 @@ "resend_code": "أعد إرسال الرمز", "check_code": "التحقق من الشفرة", "time_will_expire": "إعادة إرسال الرمز بتنسيق", - "sec" : "ثانية", + "sec": "ثانية", "providers": "الموفرون", "appointments": "تعيينات", "home": "بيت", "ads": "إعلانات", "settings": "إعدادات", "view_all": "مشاهدة الكل", - "my_active_Ads" : "إعلاناتي النشطة", + "my_active_Ads": "إعلاناتي النشطة", "recommended_ads": "الإعلانات الموصى بها", "upcoming_appointment": "الموعد القادم", "my_service_providers": "مزودي الخدمة الجدد", "appointment_details": "تفاصيل الموعد", - - + "no_city_available": "لا توجد مدينة متاحة لهذا البلد", + "branch_created": "تم إنشاء الفرع بنجاح", + "branch_updated": "تم تحديث الفرع بنجاح", + "branch_deleted": "تم حذف الفرع بنجاح", + "dashboard_main": "لوحة القيادة / الصفحة الرئيسية", + "logo_brand": "الشعار / العلامة التجارية", + "remove": "إزالة", + "no_branch": "لم يتم إضافة فرع حتى الآن", + "login_once": "الرجاء تسجيل الدخول مرة واحدة", + "defineLicenese": "تحميل التراخيص والشهادات", + "description": "وصف", + "attachFile": "أرفق ملف", + "branchLocation": "معلومات الفرع والموقع", + "tapToEdit": "انقر للتعديل", + "myServiceBranches": "فروع خدمتي", + "enter_licence_detail": "الرجاء إدخال تفاصيل السجلات التجارية وإرفاق صور الترخيص", + "country": "بلد", + "city": "مدينة", + "editServices": "تحرير الخدمات" } \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json index 94d85d7..e477a88 100644 --- a/assets/langs/en-US.json +++ b/assets/langs/en-US.json @@ -145,5 +145,24 @@ "recommended_ads": "Recommended Ads", "upcoming_appointment": "Upcoming Appointment", "my_service_providers": "My Recent Service Providers", - "appointment_details": "Appointment Details" + "appointment_details": "Appointment Details", + "no_city_available": "No City Available for this country", + "branch_created": "Branch is successfully created", + "branch_updated": "Branch is successfully Updated", + "branch_deleted": "Branch is successfully Deleted", + "dashboard_main": "Dashboard/Main Page", + "logo_brand": "Logo/Brand", + "remove": "Remove", + "no_branch": "No Branch Added Yet", + "login_once": "Please login once", + "defineLicenese": "Upload Licenses and Certificates", + "description": "Description", + "attachFile": "Attach File", + "branchLocation": "Branch info and Location", + "tapToEdit": "Tap to edit", + "myServiceBranches": "My Service Branches", + "enter_licence_detail": "Please enter the detail for commercial records and attach the license images", + "country": "country", + "city": "city", + "editServices": "Edit Services" } \ No newline at end of file diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index e5eef97..a2cef92 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -65,6 +65,10 @@ class GlobalConsts { class MyAssets { + //Banner + static String carBanner = "assets/images/bn_car.jpeg"; + + //NavBar Icons static String homeIcon = "assets/icons/home_icon.svg"; static String announcementIcon = "assets/icons/anouncement_icon.svg"; diff --git a/lib/view_models/user_view_model.dart b/lib/view_models/user_view_model.dart index e8256ee..dbf6362 100644 --- a/lib/view_models/user_view_model.dart +++ b/lib/view_models/user_view_model.dart @@ -1,6 +1,5 @@ import 'dart:convert'; - import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; @@ -24,6 +23,7 @@ import 'package:mc_common_app/models/user/register_user.dart'; import 'package:mc_common_app/models/user/user.dart'; import 'package:mc_common_app/models/user/verify_email.dart'; import 'package:mc_common_app/repositories/user_repo.dart'; +import 'package:mc_common_app/utils/enums.dart'; import 'package:mc_common_app/utils/navigator.dart'; import 'package:mc_common_app/utils/shared_prefrence.dart'; import 'package:mc_common_app/utils/utils.dart'; @@ -143,14 +143,14 @@ class UserVM extends BaseVM { } Future performCompleteProfile( - BuildContext context, { - required String password, - required String confirmPassword, - required String firstName, - required String lastName, - required String email, - required String? userId, - }) async { + BuildContext context, { + required String password, + required String confirmPassword, + required String firstName, + required String lastName, + required String email, + required String? userId, + }) async { if (Utils.passwordValidateStructure(password)) { if (password == confirmPassword) { Utils.showLoading(context); @@ -320,7 +320,7 @@ class UserVM extends BaseVM { } } - Future performBasicOtpLoginSelectionPage(BuildContext context, {required String userToken}) async { + Future performBasicOtpLoginSelectionPage(BuildContext context, {required String userToken, required AppType appType}) async { Utils.showLoading(context); LoginPasswordRespModel user = await userRepo.loginV2OTP(userToken, "1"); Utils.hideLoading(context); @@ -334,16 +334,30 @@ class UserVM extends BaseVM { RegisterUserRespModel verifiedUser = RegisterUserRespModel.fromJson(jsonDecode(response2.body)); if (verifiedUser.messageStatus == 1) { User user = User.fromJson(jsonDecode(response2.body)); - if (user.data!.userInfo!.roleId == 4) { - AppState().setUser = user; - SharedPrefManager.setUserToken(user.data!.accessToken ?? ""); - SharedPrefManager.setUserId(user.data!.userInfo!.userId ?? ""); - SharedPrefManager.setRefreshToken(user.data!.refreshToken ?? ""); - SharedPrefManager.setData(jsonEncode(user.data!.userInfo!.toJson())); - navigateReplaceWithName(context, AppRoutes.dashboard); - } else { - Utils.showToast - ("Sorry, Only Customer's can log in this app"); + + if (appType == AppType.provider) { + if (user.data!.userInfo!.roleId == 5 || user.data!.userInfo!.roleId == 6) { + AppState().setUser = user; + SharedPrefManager.setUserToken(user.data!.accessToken ?? ""); + SharedPrefManager.setUserId(user.data!.userInfo!.userId ?? ""); + SharedPrefManager.setRefreshToken(user.data!.refreshToken ?? ""); + SharedPrefManager.setData(jsonEncode(user.data!.userInfo!.toJson())); + navigateReplaceWithName(context, AppRoutes.dashboard); + } else { + Utils.showToast("LocaleKeys.onlyProviderApp.tr()"); + //("Sorry, Only Customer's can log in this app"); + } + } else if (user.data!.userInfo!.roleId == 4) { + if (user.data!.userInfo!.roleId == 4) { + AppState().setUser = user; + SharedPrefManager.setUserToken(user.data!.accessToken ?? ""); + SharedPrefManager.setUserId(user.data!.userInfo!.userId ?? ""); + SharedPrefManager.setRefreshToken(user.data!.refreshToken ?? ""); + SharedPrefManager.setData(jsonEncode(user.data!.userInfo!.toJson())); + navigateReplaceWithName(context, AppRoutes.dashboard); + } else { + Utils.showToast("Sorry, Only Customer's can log in this app"); + } } } else { Utils.showToast(verifiedUser.message ?? ""); diff --git a/lib/views/user/login_method_selection_page.dart b/lib/views/user/login_method_selection_page.dart index 4103331..9eb3915 100644 --- a/lib/views/user/login_method_selection_page.dart +++ b/lib/views/user/login_method_selection_page.dart @@ -18,6 +18,7 @@ class LoginMethodSelectionPage extends StatelessWidget { @override Widget build(BuildContext context) { UserVM userVM = context.read(); + return Scaffold( appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.log_in.tr()), body: Container( @@ -36,7 +37,7 @@ class LoginMethodSelectionPage extends StatelessWidget { Expanded( child: ShowImageButton( onClick: () { - userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken); + userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken,appType: userVM.currentAppType); }, title: LocaleKeys.fingerPrint.tr(), icon: icons + "ic_fingerprint.svg", @@ -46,7 +47,7 @@ class LoginMethodSelectionPage extends StatelessWidget { Expanded( child: ShowImageButton( onClick: () { - userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken); + userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken,appType: userVM.currentAppType); }, title: LocaleKeys.faceRecognition.tr(), icon: icons + "ic_face.svg", @@ -60,7 +61,7 @@ class LoginMethodSelectionPage extends StatelessWidget { Expanded( child: ShowImageButton( onClick: () { - userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken); + userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken,appType: userVM.currentAppType); }, title: LocaleKeys.SMS.tr(), icon: icons + "ic_sms.svg", @@ -71,7 +72,7 @@ class LoginMethodSelectionPage extends StatelessWidget { child: ShowImageButton( onClick: () { // navigateWithName(context, AppRoutes.dashboard); - userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken); + userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken,appType: userVM.currentAppType); }, title: LocaleKeys.whatsapp.tr(), icon: icons + "ic_whatsapp.svg", diff --git a/lib/views/user/register_selection_page.dart b/lib/views/user/register_selection_page.dart index 4796208..c76a956 100644 --- a/lib/views/user/register_selection_page.dart +++ b/lib/views/user/register_selection_page.dart @@ -2,12 +2,15 @@ import 'package:mc_common_app/config/routes.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/generated/locale_keys.g.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/view_models/user_view_model.dart'; import 'package:mc_common_app/widgets/show_fill_button.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; +import 'package:provider/provider.dart'; import '../../theme/colors.dart'; @@ -16,6 +19,7 @@ class RegisterSelectionPage extends StatelessWidget { @override Widget build(BuildContext context) { + UserVM userVM = Provider.of(context, listen: false); return Scaffold( body: Container( width: double.infinity, @@ -57,7 +61,11 @@ class RegisterSelectionPage extends StatelessWidget { isFlatButton: true, txtColor: Colors.black, onPressed: () { - navigateWithName(context, AppRoutes.register); + if (userVM.currentAppType == AppType.customer) { + navigateWithName(context, AppRoutes.registerCustomer); + } else { + navigateWithName(context, AppRoutes.registerProvider); + } }, ), 10.height, diff --git a/lib/widgets/common_widgets/app_bar.dart b/lib/widgets/common_widgets/app_bar.dart index 3145c75..bb41f49 100644 --- a/lib/widgets/common_widgets/app_bar.dart +++ b/lib/widgets/common_widgets/app_bar.dart @@ -71,6 +71,7 @@ class CustomAppBar extends StatelessWidget with PreferredSizeWidget { final bool isRemoveBackButton; final String profileImageUrl; final bool isDrawerEnabled; + final VoidCallback? onTap; const CustomAppBar({ Key? key, @@ -84,6 +85,7 @@ class CustomAppBar extends StatelessWidget with PreferredSizeWidget { this.elevation, this.isTitleCenter, this.titleColor, + this.onTap, }) : super(key: key); @override @@ -94,18 +96,21 @@ class CustomAppBar extends StatelessWidget with PreferredSizeWidget { elevation: elevation ?? 0, centerTitle: isTitleCenter ?? true, leading: isDrawerEnabled - ? Row( - children: [ - Image.asset( - profileImageUrl, - width: 34, - height: 34, - fit: BoxFit.fill, - ).toCircle(borderRadius: 100), - 10.width, - SvgPicture.asset(MyAssets.dashboardDrawerIcon), - ], - ).paddingOnly(left: 21) + ? InkWell( + onTap: onTap, + child: Row( + children: [ + Image.asset( + profileImageUrl, + width: 34, + height: 34, + fit: BoxFit.fill, + ).toCircle(borderRadius: 100), + 10.width, + SvgPicture.asset(MyAssets.dashboardDrawerIcon), + ], + ).paddingOnly(left: 21), + ) : isRemoveBackButton ? null : IconButton( @@ -121,5 +126,5 @@ class CustomAppBar extends StatelessWidget with PreferredSizeWidget { } @override - Size get preferredSize => const Size.fromHeight(80); + Size get preferredSize => const Size.fromHeight(55); }