From 95814fca308d481e13177857344be02a4f9d5f9e Mon Sep 17 00:00:00 2001 From: FaizHashmiCS22 Date: Wed, 22 Mar 2023 14:50:32 +0300 Subject: [PATCH] Added Packages Stuff --- lib/classes/consts.dart | 21 +- lib/extensions/string_extensions.dart | 2 +- lib/generated/codegen_loader.g.dart | 294 ++++++++++++++++++ lib/generated/locale_keys.g.dart | 84 ++--- lib/theme/app_theme.dart | 10 +- lib/theme/colors.dart | 4 +- lib/views/user/change_email_page.dart | 4 +- lib/views/user/change_mobile_page.dart | 4 +- lib/views/user/change_password_page.dart | 4 +- lib/views/user/complete_profile_page.dart | 5 +- lib/views/user/confirm_new_password.dart | 4 +- lib/views/user/confirm_new_password_page.dart | 4 +- lib/views/user/edit_account_page.dart | 4 +- .../user/forget_password_method_page.dart | 4 +- lib/views/user/forget_password_page.dart | 4 +- .../user/login_method_selection_page.dart | 4 +- lib/views/user/login_verification_page.dart | 4 +- lib/views/user/login_verify_account_page.dart | 4 +- lib/views/user/login_with_password_page.dart | 4 +- lib/views/user/register_page.dart | 4 +- lib/views/user/register_selection_page.dart | 1 - lib/views/user/vertify_password_page.dart | 4 +- lib/widgets/app_bar.dart | 33 -- lib/widgets/common_widgets/ad_widget.dart | 111 +++++++ lib/widgets/common_widgets/app_bar.dart | 125 ++++++++ .../appointment_slider_widget.dart | 168 ++++++++++ .../common_widgets/bottom_nav_bar.dart | 61 ++++ .../common_widgets/my_service_provider.dart | 39 +++ .../common_widgets/view_all_widget.dart | 30 ++ lib/widgets/extensions/extensions_widget.dart | 79 ++++- pubspec.lock | 8 + 31 files changed, 974 insertions(+), 157 deletions(-) create mode 100644 lib/generated/codegen_loader.g.dart delete mode 100644 lib/widgets/app_bar.dart create mode 100644 lib/widgets/common_widgets/ad_widget.dart create mode 100644 lib/widgets/common_widgets/app_bar.dart create mode 100644 lib/widgets/common_widgets/appointment_slider_widget.dart create mode 100644 lib/widgets/common_widgets/bottom_nav_bar.dart create mode 100644 lib/widgets/common_widgets/my_service_provider.dart create mode 100644 lib/widgets/common_widgets/view_all_widget.dart diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index ff16d46..f08f443 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -1,8 +1,3 @@ - -class AppCommonConst{ - static String baseUrl = "https://ms.hmg.com/"; // production server -} - class ApiConsts { // static String baseUrl = "http://10.200.204.20:2801/"; // Local server static String baseUrl = "https://ms.hmg.com/"; // production server @@ -59,6 +54,22 @@ class GlobalConsts { static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo"; } +class MyAssets { + + //NavBar Icons + static String homeIcon = "assets/icons/home_icon.svg"; + static String announcementIcon = "assets/icons/anouncement_icon.svg"; + static String dashboardDrawerIcon = "assets/icons/drawer_icon.svg"; + static String closeIcon = "assets/icons/close_icon.svg"; + static String appointmentsIcon = "assets/icons/appointments_icon.svg"; + static String providersIcon = "assets/icons/providers_icon.svg"; + static String miniClock = "assets/icons/mini_clock.svg"; + static String nextIcon = "assets/icons/next_icon.svg"; + static String settingsIcon = "assets/icons/settings_icon.svg"; + static String notificationsIcon = "assets/icons/notification_bell.svg"; + +} + const String icons = "assets/icons/"; const String categorySvgIcons = "assets/category/svg/"; const String svgIcons = "assets/svg/"; diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 9c33a44..ac17df6 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -10,7 +10,7 @@ extension EmailValidator on String { textAlign: textAlign, style: TextStyle( height: height, - decoration: textDecoration ?? TextDecoration.none, + decoration: isUnderLine ? TextDecoration.underline : textDecoration ?? TextDecoration.none, fontSize: fontSize ?? 10, fontWeight: isBold ? FontWeight.bold : FontWeight.w600, color: color ?? MyColors.darkTextColor, diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart new file mode 100644 index 0000000..85fd4ca --- /dev/null +++ b/lib/generated/codegen_loader.g.dart @@ -0,0 +1,294 @@ +// DO NOT EDIT. This is code generated via package:easy_localization/generate.dart + +// ignore_for_file: prefer_single_quotes + +import 'dart:ui'; + +import 'package:easy_localization/easy_localization.dart' show AssetLoader; + +class CodegenLoader extends AssetLoader{ + const CodegenLoader(); + + @override + Future> load(String fullPath, Locale locale ) { + return Future.value(mapLocales[locale.toString()]); + } + + static const Map ar_SA = { + "firstTimeLogIn": "تسجيل الدخول لأول مره", + "signUp": "التسجيل", + "changeMobile": "تغيير رقم الجوال", + "notifications": "الاشعارات", + "general": "عام", + "defineLicences": "تحديد الرخص", + "dealershipSettings": "اعدادات البيع", + "changePassword": "تغيير كلمة المرور", + "retrievePassword": "استرجاع كلمة المرور", + "changeEmail": "تغيير الايميل", + "verify": "تحقق", + "verified": "تم التحقق", + "signOut": "تسجيل خروج", + "enterEmail": "ادخل الايميل", + "enterNewEmail": "ادخل ايميل جديد", + "enterCurrentPassword": "كلمة المرور الحاليه", + "enterNewPassword": "كلمة المرور الجديده", + "enterOldPassword": "كلمة المرور القديمه", + "confirm": "تأكيد", + "enterNewPhoneNumber": "رقم جوال جديد", + "completeProfile": "الملف الشخصي", + "continu": "استمرار", + "confirmPassword": "تأكيد كلمة المرور", + "createPassword": "انشاء كلمة مرور جديده", + "email": "ايميل", + "firstName": "الأسم الأول *", + "surname": "اسم العائله *", + "confirmPass": "تأكيد كلمة المرور *", + "createPass": "انشاء كلمة مرور جديده *", + "newPassword": " كلمة مرور جديده", + "forgetPassword": "نسيت كلمة المرور", + "forgetPasswordRecover": "نسيت كلمة المرور؟ استعادة", + "editAccount": "تعديل الحساب", + "change": "تغيير", + "verifyAccount": "التحقق من الحساب", + "login": "تسجيل دخول", + "welcomeMessage": "مرحبا", + "forgetPass": "نسيت كلمة المرور ؟", + "enterPhoneNumber": "رقم جوال ", + "phoneNumberVerified": "تم التحقق من الجوال", + "verifyNewPassword": "التحقق من كلمة المرور", + "EnterPass": "ادخل كلمة المرور", + "alreadySigned": " تم تسجيل الدخول", + "emailChangedSuccessfully": "تم تغيير الايميل بنجاح", + "passwordIsUpdated": "تم تحجيث كلمة المرور", + "passwordShouldContains": "كلمة المرور يجب ان تحتوي على رمز رقم حرف كبير حرف صغير", + " successfullyRegistered": "تم التسجيل بنجاح", + "pleaseEnterSamePassword": "ادخل كلمة مرور مطابقه", + "firstNameMandatory": "ادخل الأسم الأول ", + "surnameNameMandatory": "ادخل اسم العائله", + "passwordNameMandatory": "ادخل كلمة المرور", + "enterValidEmail": "ادخل ايميل صحيح", + "pleaseAcceptTerms": "يجب الموافقه على الشروط", + "emailVerified": "تم التحقق من الايميل بنجاح", + "selectMethod": "اختر", + "emailAddress": "ايميل", + "loginSelection": "اختر", + "selectCountryCode": "اختر رمز الدوله", + "selectProviderRole": "اختر نوع الخدمه", + "addPhoneNo": "اضف الهاتف", + "onlyCustomerApp": "نأسف هذا التطبيق فقط للعملاء", + "imageUploaded": "تم تحميل الصوره", + "fileLarger": "1KB حجم الملف اكبر من", + "account": "الحساب", + "edit": "تعديل", + "imageDeleted": "تم حذف الصوره", + "dashboard": "الصفحه الرئيسيه", + "termsOfService": "من خلال إنشاء حساب فإنك توافق على", + "userInformation": "معلومات المتسخدم", + "faceRecognition": "تحقق مع بصمة الوجه", + "fingerPrint": "تحقق مع بصمة الاصبع", + "whatsapp": "تحقق مع Whatsapp", + "SMS": "رسائل قصيره", + "selectRole": "حدد الدور", + "userRoleOrTitle": "عنوان المستخدم", + "codeSentToEmail": "تم ارسال الرمز للايميل", + "number": "موبايل", + "english": "English", + "title": "Hello", + "msg": "Hello {} in the {} world ", + "msg_named": "{} are written in the {lang} language", + "clickMe": "Click me", + "profile": { + "reset_password": { + "label": "Reset Password", + "username": "Username", + "password": "password" + } + }, + "clicked": { + "zero": "You clicked {} times!", + "one": "You clicked {} time!", + "two": "You clicked {} times!", + "few": "You clicked {} times!", + "many": "You clicked {} times!", + "other": "You clicked {} times!" + }, + "amount": { + "zero": "Your amount : {} ", + "one": "Your amount : {} ", + "two": "Your amount : {} ", + "few": "Your amount : {} ", + "many": "Your amount : {} ", + "other": "Your amount : {} " + }, + "gender": { + "male": "Hi man ;) ", + "female": "Hello girl :)", + "with_arg": { + "male": "Hi man ;) {}", + "female": "Hello girl :) {}" + } + }, + "reset_locale": "Reset Language", + "welcomeDes": "أنت مكان واحد لكل ما تحتاجه سيارتك", + "log_in": "تسجيل الدخول", + "send": "إرسال", + "phoneNumber": "رقم الهاتف", + "forgetPasswordQ": "نسيت كلمة المرور؟", + "recover": "استعادة", + "retrivePassword": "استرجع كلمة المرور بإحدى الطرق التالية", + "retriveOnPhone": "سوف نرسل الاختيار إلى رقم هاتفك المحمول المسجل", + "retriveOnEmail": "سوف نرسل الاختيار إلى عنوان بريدك الإلكتروني المسجل", + "enterPhoneForVerfication": "الرجاء إدخال رقم هاتفك وسنرسل لك رمز التحقق", + "welcomeBack": "مرحبًا بعودتك!!!", + "selectYourCountry": "اختر بلدك", + "chooseCountry": "اختر الدوله", + "terms": "بنود الخدمة وخصوصية السياسة", + "profileMsg": "أدخل التفاصيل أدناه وأكمل معلومات الملف الشخصي", + "save": "حفظ", + "insert_otp_code": "ادخل الرمز", + "type_code": "الرجاء كتابة الرمز الذي أرسلناه إلى", + "resend_code": "أعد إرسال الرمز", + "check_code": "التحقق من الشفرة", + "time_will_expire": "إعادة إرسال الرمز بتنسيق", + "sec": "ثانية" +}; +static const Map en_US = { + "firstTimeLogIn": "First Time Log In", + "signUp": "Sign Up", + "changeMobile": "Change Mobile", + "notifications": "Notifications", + "general": "General", + "defineLicences": "Define Licences", + "dealershipSettings": "Dealership Settings", + "changePassword": "Change Password", + "retrievePassword": "Retrieve Password", + "changeEmail": "Change Email", + "verify": "Verify", + "verified": "Verified", + "signOut": "Sign Out", + "enterEmail": "Enter Email", + "enterNewEmail": "Enter New Email", + "enterNewPassword": "Enter New Password", + "enterCurrentPassword": "Enter Current Password", + "enterOldPassword": "Enter Old Password", + "confirm": "Confirm", + "completeProfile": "Complete Profile", + "enterNewPhoneNumber": "Enter New Phone Number", + "enterPhoneNumber": "Enter Phone Number", + "continu": "Continue", + "confirmPassword": "Confirm Password", + "createPassword": "Create Password", + "email": "Email", + "firstName": "First Name *", + "surname": "Surname *", + "confirmPass": "Confirm Password *", + "createPass": "Create Password *", + "newPassword": "New Password", + "forgetPassword": "Forget Password", + "forgetPasswordRecover": "Forget Password? Recover", + "editAccount": "Edit Account", + "change": "Change", + "verifyAccount": "Verify Account", + "login": "Log In", + "welcomeMessage": "Welcome Message", + "forgetPass": "Forget Password ?", + "phoneNumberVerified": "Phone Number Verified", + "verifyNewPassword": "Verify New Password", + "EnterPass": "Enter Password ?", + "alreadySigned": " Already Signed Up and Logged In", + "emailChangedSuccessfully": "Email is Changed Successfully", + "passwordIsUpdated": "Password is Updated", + "passwordShouldContains": "Password Should contains Character, Number, Capital and small letters,", + " successfullyRegistered": " Successfully Registered, Please login once,", + "pleaseEnterSamePassword": "Please enter same password", + "firstNameMandatory": "First name is mandatory", + "surnameNameMandatory": "Surname is mandatory", + "passwordNameMandatory": "Password is mandatory", + "enterValidEmail": "Enter Valid Email", + "pleaseAcceptTerms": "Please accept terms", + "emailVerified": "Email is verified successfully", + "selectMethod": "Select Method", + "emailAddress": "Email Address", + "loginSelection": "Login Selection", + "selectCountryCode": "Please select Country Code", + "selectProviderRole": "Please select Provider Role", + "addPhoneNo": "Please add Phone No", + "onlyCustomerApp": "Sorry, Only Customer's can log in this app", + "imageUploaded": "Image is uploaded", + "fileLarger": "File is larger then 1KB", + "account": "Account", + "edit": "EDIT", + "imageDeleted": "Image is Deleted", + "dashboard": "Dashboard/Main Page", + "termsOfService": "By creating an account you agree to our", + "userInformation": "User Information", + "faceRecognition": "Face Recognition", + "fingerPrint": "Finger Print", + "whatsapp": "With Whatsapp", + "SMS": "With SMS", + "selectRole": "Select Role", + "userRoleOrTitle": "User role or title", + "codeSentToEmail": "Code is sent to email", + "number": "Number", + "english": "عربي", + "title": "Hello", + "msg": "Hello {} in the {} world ", + "msg_named": "{} are written in the {lang} language", + "clickMe": "Click me", + "profile": { + "reset_password": { + "label": "Reset Password", + "username": "Username", + "password": "password" + } + }, + "clicked": { + "zero": "You clicked {} times!", + "one": "You clicked {} time!", + "two": "You clicked {} times!", + "few": "You clicked {} times!", + "many": "You clicked {} times!", + "other": "You clicked {} times!" + }, + "amount": { + "zero": "Your amount : {} ", + "one": "Your amount : {} ", + "two": "Your amount : {} ", + "few": "Your amount : {} ", + "many": "Your amount : {} ", + "other": "Your amount : {} " + }, + "gender": { + "male": "Hi man ;) ", + "female": "Hello girl :)", + "with_arg": { + "male": "Hi man ;) {}", + "female": "Hello girl :) {}" + } + }, + "reset_locale": "Reset Language", + "welcomeDes": "You one stop place all your car needs", + "log_in": "Log In", + "send": "Send", + "phoneNumber": "Phone Number", + "forgetPasswordQ": "Forget Password?", + "recover": "Recover", + "retrivePassword": "Retrive password by one of following method", + "retriveOnPhone": "We will send the opt to your registered mobile number", + "retriveOnEmail": "We will send the opt to your registered email address", + "enterPhoneForVerfication": "Please enter your phone number We will send you the verification code", + "welcomeBack": "Welcome Back!!!", + "selectYourCountry": "Select Your Country", + "chooseCountry": "Choose Country", + "terms": "Terms of Service and Privacy Policy", + "profileMsg": "Enter the details below and complete the profile info", + "save": "Save", + "insert_otp_code": "Enter the code", + "type_code": "Please type the code we sent to", + "resend_code": "Resend Code", + "check_code": "Check Code", + "time_will_expire": "Resend code in", + "sec": "sec" +}; +static const Map> mapLocales = {"ar_SA": ar_SA, "en_US": en_US}; +} diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index b3e0e18..fbbf4a1 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -32,28 +32,17 @@ abstract class LocaleKeys { static const createPass = 'createPass'; static const newPassword = 'newPassword'; static const forgetPassword = 'forgetPassword'; - static const forgetPasswordQ = 'forgetPasswordQ'; - static const recover = 'recover'; static const forgetPasswordRecover = 'forgetPasswordRecover'; static const editAccount = 'editAccount'; static const change = 'change'; static const verifyAccount = 'verifyAccount'; static const login = 'login'; - static const log_in = 'log_in'; static const welcomeMessage = 'welcomeMessage'; - static const welcomeDes = 'welcomeDes'; static const forgetPass = 'forgetPass'; static const enterPhoneNumber = 'enterPhoneNumber'; static const phoneNumberVerified = 'phoneNumberVerified'; static const verifyNewPassword = 'verifyNewPassword'; static const EnterPass = 'EnterPass'; - static const send = 'send'; - static const retrivePassword = 'retrivePassword'; - static const retriveOnPhone = 'retriveOnPhone'; - static const retriveOnEmail = 'retriveOnEmail'; - static const enterPhoneForVerfication = 'enterPhoneForVerfication'; - static const selectYourCountry = 'selectYourCountry'; - static const welcomeBack = 'welcomeBack'; static const alreadySigned = 'alreadySigned'; static const emailChangedSuccessfully = 'emailChangedSuccessfully'; static const passwordIsUpdated = 'passwordIsUpdated'; @@ -72,43 +61,14 @@ abstract class LocaleKeys { static const selectCountryCode = 'selectCountryCode'; static const selectProviderRole = 'selectProviderRole'; static const addPhoneNo = 'addPhoneNo'; - static const onlyProviderApp = 'onlyProviderApp'; + static const onlyCustomerApp = 'onlyCustomerApp'; static const imageUploaded = 'imageUploaded'; static const fileLarger = 'fileLarger'; static const account = 'account'; static const edit = 'edit'; static const imageDeleted = 'imageDeleted'; static const dashboard = 'dashboard'; - static const pickAddress = 'pickAddress'; - static const pickLocation = 'pickLocation'; - static const save = 'save'; - static const defineServices = 'defineServices'; - static const selectBranch = 'selectBranch '; - static const selectServiceCategory = 'selectServiceCategory'; - static const defineBranches = 'defineBranches'; - static const defineProviders = 'defineProviders'; - static const closeAccount = 'closeAccount'; - static const createBranch = 'createBranch'; - static const updateBranch = 'updateBranch'; - static const address = 'address'; - static const branchDescription = 'branchDescription'; - static const branchName = 'branchName'; - static const chooseCity = 'chooseCity'; - static const chooseCountry = 'chooseCountry'; - static const selectAttachment = 'selectAttachment'; - static const somethingWrong = 'somethingWrong'; - static const documentsUploaded = 'documentsUploaded'; - static const update = 'update'; static const termsOfService = 'termsOfService'; - static const terms = 'terms'; - static const profileMsg = 'profileMsg'; - static const branchInfo = 'branchInfo'; - static const profileCompleted = 'profileCompleted'; - static const selectLocationMap = 'selectLocationMap'; - static const licensesAndCertifications = 'licensesAndCertifications'; - static const completeProfile1 = 'completeProfile1'; - static const completeProfile2 = 'completeProfile2'; - static const completeProfile3 = 'completeProfile3'; static const userInformation = 'userInformation'; static const faceRecognition = 'faceRecognition'; static const fingerPrint = 'fingerPrint'; @@ -118,9 +78,7 @@ abstract class LocaleKeys { static const userRoleOrTitle = 'userRoleOrTitle'; static const codeSentToEmail = 'codeSentToEmail'; static const number = 'number'; - static const phoneNumber = 'phoneNumber'; static const english = 'english'; - static const provider = 'provider'; static const title = 'title'; static const msg = 'msg'; static const msg_named = 'msg_named'; @@ -135,30 +93,32 @@ abstract class LocaleKeys { static const gender_with_arg = 'gender.with_arg'; static const gender = 'gender'; static const reset_locale = 'reset_locale'; + static const welcomeDes = 'welcomeDes'; + static const log_in = 'log_in'; + static const send = 'send'; + static const phoneNumber = 'phoneNumber'; + static const forgetPasswordQ = 'forgetPasswordQ'; + static const recover = 'recover'; + static const retrivePassword = 'retrivePassword'; + static const retriveOnPhone = 'retriveOnPhone'; + static const retriveOnEmail = 'retriveOnEmail'; + static const enterPhoneForVerfication = 'enterPhoneForVerfication'; + static const welcomeBack = 'welcomeBack'; + static const selectYourCountry = 'selectYourCountry'; + static const chooseCountry = 'chooseCountry'; + static const terms = 'terms'; + static const profileMsg = 'profileMsg'; + static const save = 'save'; static const insert_otp_code = 'insert_otp_code'; static const type_code = 'type_code'; static const resend_code = 'resend_code'; static const check_code = 'check_code'; static const time_will_expire = 'time_will_expire'; static const sec = 'sec'; - static const no_city_available = 'no_city_available'; - static const branch_created = 'branch_created'; - static const branch_updated = 'branch_updated'; - static const branch_deleted = 'branch_deleted'; - static const dashboard_main = 'dashboard_main'; - static const logo_brand = 'logo_brand'; - static const remove = 'remove'; - static const no_branch = 'no_branch'; - static const login_once = 'login_once'; - static const defineLicenese = 'defineLicenese'; - static const description = 'description'; - static const attachFile = 'attachFile'; - static const branchLocation = 'branchLocation'; - static const tapToEdit = 'tapToEdit'; - static const myServiceBranches = 'myServiceBranches'; - static const enter_licence_detail = 'enter_licence_detail'; - static const country = 'country'; - static const city = 'city'; - static const editServices = 'editServices'; + static const home = 'home'; + static const providers = 'providers'; + static const appointments = 'appointments'; + static const ads = 'ads'; + static const settings = 'settings'; } diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart index 8d0252d..e2a070c 100644 --- a/lib/theme/app_theme.dart +++ b/lib/theme/app_theme.dart @@ -4,15 +4,7 @@ import 'colors.dart'; class AppTheme { static getTheme(isArabic) => ThemeData( - // This is the theme of your application. - // - // Try running your application with "flutter run". You'll see the - // application has a blue toolbar. Then, without quitting the app, try - // changing the primarySwatch below to Colors.green and then invoke - // "hot reload" (press "r" in the console where you ran "flutter run", - // or simply save your changes to "hot reload" in a Flutter IDE). - // Notice that the counter didn't reset back to zero; the application - // is not restarted. + fontFamily: !isArabic ? "Poppins" : null, primaryColor: primaryColor, primaryTextTheme: const TextTheme( titleLarge: TextStyle(color: Colors.white), diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart index d65575d..b48a406 100644 --- a/lib/theme/colors.dart +++ b/lib/theme/colors.dart @@ -8,6 +8,7 @@ class MyColors { static const Color textColor = Color(0xff777777); static const Color textFieldColor = Color(0xffF3F5F7); static const Color darkIconColor = Color(0xff28323A); + static const Color lightIconColor = Color(0xff767676); static const Color darkTextColor = Color(0xff2B353E); static const Color normalTextColor = Color(0xff5A5A5A); static const Color gradiantStartColor = Color(0xff33c0a5); @@ -18,6 +19,7 @@ class MyColors { static const Color grey77Color = Color(0xff777777); static const Color grey70Color = Color(0xff707070); static const Color greyACColor = Color(0xffACACAC); + static const Color greyShadowColor = Color(0xFFE8E7E7); static const Color grey98Color = Color(0xff989898); static const Color lightGreyEFColor = Color(0xffEFEFEF); static const Color lightGreyEDColor = Color(0xffEDEDED); @@ -37,7 +39,7 @@ class MyColors { primaryColor, ]), boxShadow: [ - BoxShadow( + BoxShadow( color: primaryColor.withOpacity(0.5), blurRadius: 20.0, spreadRadius: 1.0, diff --git a/lib/views/user/change_email_page.dart b/lib/views/user/change_email_page.dart index 0874ff6..ad85777 100644 --- a/lib/views/user/change_email_page.dart +++ b/lib/views/user/change_email_page.dart @@ -2,7 +2,7 @@ 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/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/show_fill_button.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -31,7 +31,7 @@ class _ChangeEmailPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: appBar(context, title: LocaleKeys.changeEmail.tr()), + appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.changeEmail.tr()), body: SingleChildScrollView( child: Container( // width: double.infinity, diff --git a/lib/views/user/change_mobile_page.dart b/lib/views/user/change_mobile_page.dart index 47e976a..3c66c81 100644 --- a/lib/views/user/change_mobile_page.dart +++ b/lib/views/user/change_mobile_page.dart @@ -2,7 +2,7 @@ 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/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/show_fill_button.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -31,7 +31,7 @@ class _ChangeMobilePageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: appBar(context, title: LocaleKeys.changeMobile.tr()), + appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.changeMobile.tr()), body: SingleChildScrollView( child: Container( // width: double.infinity, diff --git a/lib/views/user/change_password_page.dart b/lib/views/user/change_password_page.dart index 4e65da2..9709867 100644 --- a/lib/views/user/change_password_page.dart +++ b/lib/views/user/change_password_page.dart @@ -2,7 +2,7 @@ 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/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/show_fill_button.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -31,7 +31,7 @@ class _ChangePasswordPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: appBar(context, title: LocaleKeys.changePassword.tr()), + appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.changePassword.tr()), body: SingleChildScrollView( child: Container( // width: double.infinity, diff --git a/lib/views/user/complete_profile_page.dart b/lib/views/user/complete_profile_page.dart index dd125ee..562c7d6 100644 --- a/lib/views/user/complete_profile_page.dart +++ b/lib/views/user/complete_profile_page.dart @@ -4,7 +4,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/models/user/register_user.dart'; import 'package:mc_common_app/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/show_fill_button.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -35,8 +35,7 @@ class _CompleteProfilePageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: appBar( - context, + appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.signUp.tr(), ), body: SizedBox( diff --git a/lib/views/user/confirm_new_password.dart b/lib/views/user/confirm_new_password.dart index 5f7dcb0..ef5a754 100644 --- a/lib/views/user/confirm_new_password.dart +++ b/lib/views/user/confirm_new_password.dart @@ -3,7 +3,7 @@ import 'package:mc_common_app/extensions/string_extensions.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/show_fill_button.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -21,7 +21,7 @@ class ConfirmNewPasswordPage extends StatelessWidget { Widget build(BuildContext context) { UserVM userVM = context.read(); return Scaffold( - appBar: appBar(context, title: LocaleKeys.forgetPassword.tr()), + appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.forgetPassword.tr()), body: Container( width: double.infinity, height: double.infinity, diff --git a/lib/views/user/confirm_new_password_page.dart b/lib/views/user/confirm_new_password_page.dart index 5ea08fa..ac3287f 100644 --- a/lib/views/user/confirm_new_password_page.dart +++ b/lib/views/user/confirm_new_password_page.dart @@ -3,7 +3,7 @@ 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/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/show_fill_button.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -26,7 +26,7 @@ class _ConfirmNewPasswordPageState extends State { Widget build(BuildContext context) { UserVM userVM = context.read(); return Scaffold( - appBar: appBar(context, title: LocaleKeys.forgetPassword.tr()), + appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.forgetPassword.tr()), body: SingleChildScrollView( child: Container( // width: double.infinity, diff --git a/lib/views/user/edit_account_page.dart b/lib/views/user/edit_account_page.dart index 1888c34..ddeb756 100644 --- a/lib/views/user/edit_account_page.dart +++ b/lib/views/user/edit_account_page.dart @@ -5,7 +5,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/utils/navigator.dart'; import 'package:mc_common_app/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_svg/flutter_svg.dart'; @@ -27,7 +27,7 @@ class _EditAccountPageState extends State { Widget build(BuildContext context) { UserVM userVM = context.read(); return Scaffold( - appBar: appBar(context, title: LocaleKeys.editAccount.tr()), + appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.editAccount.tr()), body: Container( width: double.infinity, height: double.infinity, diff --git a/lib/views/user/forget_password_method_page.dart b/lib/views/user/forget_password_method_page.dart index c38e9f8..1eed6c7 100644 --- a/lib/views/user/forget_password_method_page.dart +++ b/lib/views/user/forget_password_method_page.dart @@ -4,7 +4,7 @@ import 'package:mc_common_app/utils/utils.dart'; import 'package:mc_common_app/extensions/int_extensions.dart'; import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/button/show_image_button.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -27,7 +27,7 @@ class _ForgetPasswordMethodPageState extends State { Widget build(BuildContext context) { UserVM userVM = context.read(); return Scaffold( - appBar: appBar(context, title: LocaleKeys.forgetPassword.tr()), + appBar: CustomAppBar( isRemoveBackButton: true,title: LocaleKeys.forgetPassword.tr(),), body: Container( width: double.infinity, height: double.infinity, diff --git a/lib/views/user/forget_password_page.dart b/lib/views/user/forget_password_page.dart index 4f4fac0..fedc92d 100644 --- a/lib/views/user/forget_password_page.dart +++ b/lib/views/user/forget_password_page.dart @@ -6,7 +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/generated/locale_keys.g.dart'; import 'package:mc_common_app/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; import 'package:mc_common_app/widgets/show_fill_button.dart'; import 'package:mc_common_app/widgets/tab/login_email_tab.dart'; @@ -50,7 +50,7 @@ class _ForgetPasswordPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: appBar(context, title: LocaleKeys.changePassword.tr()), + appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.changePassword.tr()), body: Container( width: double.infinity, height: double.infinity, diff --git a/lib/views/user/login_method_selection_page.dart b/lib/views/user/login_method_selection_page.dart index c144c9c..4103331 100644 --- a/lib/views/user/login_method_selection_page.dart +++ b/lib/views/user/login_method_selection_page.dart @@ -4,7 +4,7 @@ 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/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/button/show_image_button.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; @@ -19,7 +19,7 @@ class LoginMethodSelectionPage extends StatelessWidget { Widget build(BuildContext context) { UserVM userVM = context.read(); return Scaffold( - appBar: appBar(context, title: LocaleKeys.log_in.tr()), + appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.log_in.tr()), body: Container( width: double.infinity, height: double.infinity, diff --git a/lib/views/user/login_verification_page.dart b/lib/views/user/login_verification_page.dart index d766cb0..bbd0766 100644 --- a/lib/views/user/login_verification_page.dart +++ b/lib/views/user/login_verification_page.dart @@ -6,7 +6,7 @@ import 'package:mc_common_app/generated/locale_keys.g.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/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/button/show_image_button.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -38,7 +38,7 @@ class _LoginVerificationPageState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: appBar(context, title: LocaleKeys.login.tr()), + appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.login.tr()), body: Container( width: double.infinity, height: double.infinity, diff --git a/lib/views/user/login_verify_account_page.dart b/lib/views/user/login_verify_account_page.dart index 377fa26..4f963af 100644 --- a/lib/views/user/login_verify_account_page.dart +++ b/lib/views/user/login_verify_account_page.dart @@ -4,7 +4,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/utils/utils.dart'; import 'package:mc_common_app/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/button/show_image_button.dart'; import 'package:mc_common_app/widgets/txt_field.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -21,7 +21,7 @@ class LoginVerifyAccountPage extends StatelessWidget { Widget build(BuildContext context) { UserVM userVM = context.read(); return Scaffold( - appBar: appBar(context,title: LocaleKeys.login.tr()), + appBar: CustomAppBar( isRemoveBackButton: true,title: LocaleKeys.login.tr()), body: Container( width: double.infinity, height: double.infinity, diff --git a/lib/views/user/login_with_password_page.dart b/lib/views/user/login_with_password_page.dart index 748c397..5701025 100644 --- a/lib/views/user/login_with_password_page.dart +++ b/lib/views/user/login_with_password_page.dart @@ -8,7 +8,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/utils/navigator.dart'; import 'package:mc_common_app/view_models/user_view_model.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; import 'package:mc_common_app/widgets/show_fill_button.dart'; import 'package:mc_common_app/widgets/tab/login_email_tab.dart'; @@ -53,7 +53,7 @@ class _LoginWithPasswordState extends State { @override Widget build(BuildContext context) { return Scaffold( - appBar: appBar(context, title: ""), + appBar: CustomAppBar( isRemoveBackButton: true, title: ""), body: Container( width: double.infinity, height: double.infinity, diff --git a/lib/views/user/register_page.dart b/lib/views/user/register_page.dart index b6be23f..2eae5dd 100644 --- a/lib/views/user/register_page.dart +++ b/lib/views/user/register_page.dart @@ -4,7 +4,7 @@ import 'package:mc_common_app/generated/locale_keys.g.dart'; import 'package:mc_common_app/models/user/country.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/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; import 'package:mc_common_app/widgets/show_fill_button.dart'; import 'package:easy_localization/easy_localization.dart'; @@ -30,7 +30,7 @@ class _RegisterPageState extends State { Widget build(BuildContext context) { final UserVM userVM = context.read(); return Scaffold( - appBar: appBar(context, title: ""), + appBar: CustomAppBar( isRemoveBackButton: true, title: ""), body: Container( width: double.infinity, height: double.infinity, diff --git a/lib/views/user/register_selection_page.dart b/lib/views/user/register_selection_page.dart index 4293036..4796208 100644 --- a/lib/views/user/register_selection_page.dart +++ b/lib/views/user/register_selection_page.dart @@ -17,7 +17,6 @@ class RegisterSelectionPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - // appBar: appBar(title: LocaleKeys.login.tr()), body: Container( width: double.infinity, height: double.infinity, diff --git a/lib/views/user/vertify_password_page.dart b/lib/views/user/vertify_password_page.dart index 59ee590..c67ce50 100644 --- a/lib/views/user/vertify_password_page.dart +++ b/lib/views/user/vertify_password_page.dart @@ -5,7 +5,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/utils/navigator.dart'; import 'package:mc_common_app/utils/utils.dart'; -import 'package:mc_common_app/widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; import 'package:mc_common_app/widgets/button/show_image_button.dart'; import 'package:mc_common_app/widgets/dialog/dialogs.dart'; import 'package:mc_common_app/widgets/dialog/message_dialog.dart'; @@ -26,7 +26,7 @@ class VerifyPasswordPage extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( - appBar: appBar(context, title: LocaleKeys.changePassword.tr()), + appBar: CustomAppBar( isRemoveBackButton: true, title: LocaleKeys.changePassword.tr()), body: Container( width: double.infinity, height: double.infinity, diff --git a/lib/widgets/app_bar.dart b/lib/widgets/app_bar.dart deleted file mode 100644 index 9935442..0000000 --- a/lib/widgets/app_bar.dart +++ /dev/null @@ -1,33 +0,0 @@ - -import 'package:flutter/material.dart'; -import 'package:mc_common_app/extensions/string_extensions.dart'; -import 'package:mc_common_app/theme/colors.dart'; - -AppBar appBar( - BuildContext context, { - Color? backgroundColor, - double? elevation, - String? title, - Color? titleColor, - bool? isTitleCenter, - Color? backIconColor, - List? actions, - bool isRemoveBackButton = false, - }) { - return AppBar( - backgroundColor: backgroundColor ?? appBackgroundColor, - elevation: elevation ?? 0, - centerTitle: isTitleCenter ?? true, - leading: isRemoveBackButton - ? null - : IconButton( - icon: Icon(Icons.arrow_back_ios, color: Colors.black), - onPressed: () => Navigator.of(context).pop(), - ), - iconTheme: IconThemeData( - color: backIconColor ?? Colors.black, //change your color here - ), - actions: actions, - title: (title ?? "").toText(fontSize: 20, isBold: true), - ); -} diff --git a/lib/widgets/common_widgets/ad_widget.dart b/lib/widgets/common_widgets/ad_widget.dart new file mode 100644 index 0000000..4cf8920 --- /dev/null +++ b/lib/widgets/common_widgets/ad_widget.dart @@ -0,0 +1,111 @@ + +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/theme/colors.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; + +class AdWidget extends StatelessWidget { + final int count; + + const AdWidget({Key? key, required this.count}) : super(key: key); + + @override + Widget build(BuildContext context) { + return ListView.builder( + itemCount: count, + shrinkWrap: true, + physics: const NeverScrollableScrollPhysics(), + itemBuilder: (BuildContext context, int index) { + return Padding( + padding: const EdgeInsets.only(bottom: 15), + child: buildAdContainer(), + ); + }); + } + + Widget buildAdContainer() { + return Row( + children: [ + Image.asset( + "assets/images/bn_car.jpeg", + width: 80, + height: 80, + fit: BoxFit.cover, + ), + 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: [ + "Toyota Crolla".toText(fontSize: 16, isBold: true), + Row( + children: [ + "Model:".toText( + color: MyColors.lightTextColor, + ), + 2.width, + "2019".toText(), + ], + ), + Row( + children: [ + "Mileage:".toText( + color: MyColors.lightTextColor, + ), + 2.width, + "73,000 km".toText(), + ], + ), + ], + ), + ), + Column( + crossAxisAlignment: CrossAxisAlignment.end, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Riyadh".toText( + color: MyColors.lightTextColor, + ), + "9 Hours Ago".toText( + color: MyColors.lightTextColor, + ), + ], + ), + ], + ), + 8.height, + Row( + children: [ + Expanded( + child: Row( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + "30,000".toText(fontSize: 16, isBold: true), + 2.width, + "SAR:".toText( + color: MyColors.lightTextColor, + ), + ], + ), + ), + const Icon(Icons.arrow_forward) + ], + ), + ], + ), + ), + ], + ).toWhiteContainer(width: double.infinity, allPading: 12); + } +} diff --git a/lib/widgets/common_widgets/app_bar.dart b/lib/widgets/common_widgets/app_bar.dart new file mode 100644 index 0000000..7ff234e --- /dev/null +++ b/lib/widgets/common_widgets/app_bar.dart @@ -0,0 +1,125 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.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/theme/colors.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; + +//import 'package:flutter/material.dart'; +// import 'package:flutter_svg/flutter_svg.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/theme/colors.dart'; +// import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; +// import 'package:sizer/sizer.dart'; +// +// class CustomAppBar extends StatelessWidget with PreferredSizeWidget { +// final Color? backgroundColor; +// final double? elevation; +// final String? title; +// final Color? titleColor; +// final bool? isTitleCenter; +// final Color? backIconColor; +// final List? actions; +// final bool isRemoveBackButton; +// +// const CustomAppBar({ +// Key? key, +// this.title, +// required this.isRemoveBackButton, +// this.backgroundColor, +// this.actions, +// this.backIconColor, +// this.elevation, +// this.isTitleCenter, +// this.titleColor, +// }) : super(key: key); +// +// @override +// Widget build(BuildContext context) { +// return AppBar( +// backgroundColor: backgroundColor ?? appBackgroundColor, +// elevation: elevation ?? 0, +// centerTitle: isTitleCenter ?? true, +// leading: isRemoveBackButton +// ? null +// : IconButton( +// icon: const Icon(Icons.arrow_back_ios, color: Colors.black), +// onPressed: () => Navigator.of(context).pop(), +// ), +// iconTheme: IconThemeData( +// color: backIconColor ?? Colors.black, //change your color here +// ), +// actions: actions, +// title: (title ?? "").toText(fontSize: 20, isBold: true), +// ); +// } +// +// @override +// Size get preferredSize => const Size.fromHeight(kToolbarHeight); +// } +class CustomAppBar extends StatelessWidget with PreferredSizeWidget { + final Color? backgroundColor; + final double? elevation; + final String? title; + final Color? titleColor; + final bool? isTitleCenter; + final Color? backIconColor; + final List? actions; + final bool isRemoveBackButton; + final String profileImageUrl; + final bool isDrawerEnabled; + + const CustomAppBar({ + Key? key, + this.title, + this.isDrawerEnabled = false, + this.profileImageUrl = "", + required this.isRemoveBackButton, + this.backgroundColor, + this.actions, + this.backIconColor, + this.elevation, + this.isTitleCenter, + this.titleColor, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + return AppBar( + leadingWidth: 100, + backgroundColor: backgroundColor ?? appBackgroundColor, + 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) + : isRemoveBackButton + ? null + : IconButton( + icon: const Icon(Icons.arrow_back_ios, color: Colors.black), + onPressed: () => Navigator.of(context).pop(), + ), + iconTheme: IconThemeData( + color: backIconColor ?? Colors.black, //change your color here + ), + actions: actions, + title: (title ?? "").toText(fontSize: 20, isBold: true), + ); + } + + @override + Size get preferredSize => const Size.fromHeight(80); +} diff --git a/lib/widgets/common_widgets/appointment_slider_widget.dart b/lib/widgets/common_widgets/appointment_slider_widget.dart new file mode 100644 index 0000000..dbf7827 --- /dev/null +++ b/lib/widgets/common_widgets/appointment_slider_widget.dart @@ -0,0 +1,168 @@ +import 'package:carousel_slider/carousel_slider.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/theme/colors.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; + +class AppointmentSliderWidget extends StatelessWidget { + const AppointmentSliderWidget({Key? key}) : super(key: key); + + Widget buildAppointmentContainerForProvider() { + return Container( + margin: EdgeInsets.only(bottom: 21, left: 21, right: 21, top: 7), + child: Column( + children: [ + Row( + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Olaya Brach".toText( + color: MyColors.lightTextColor, + isBold: true, + ), + "Abdullah Alhbas".toText( + isBold: true, + fontSize: 14, + ), + Row( + children: [ + "Appt. On:".toText( + color: MyColors.lightTextColor, + ), + 2.width, + "19-Mar-2023 11:48 AM".toText(), + ], + ), + ], + ), + ), + "1+ Requests".toText(fontSize: 10).toContainer( + borderRadius: 15, + backgroundColor: MyColors.lightGreyEAColor, + padding: const EdgeInsets.symmetric( + vertical: 6, + horizontal: 12, + ), + ), + ], + ), + 8.height, + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: Column( + children: [ + showServices("Maintenance"), + 2.height, + showServices("Accessories and Modification"), + ], + ), + ), + const Icon( + Icons.arrow_forward, + ), + ], + ), + ], + ).toWhiteContainer(width: double.infinity, allPading: 12), + ); + } + + Widget buildAppointmentSliderForConsumer() { + return Container( + margin: EdgeInsets.only(bottom: 21, left: 21, right: 21, top: 7), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset( + "assets/images/bn_car.jpeg", + width: 56, + height: 56, + fit: BoxFit.fill, + ).toCircle(borderRadius: 100), + 8.width, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Al Aziz Service Station".toText(color: MyColors.black, isBold: true, fontSize: 16), + Row( + children: [ + MyAssets.miniClock.buildSvg(height: 12), + 2.width, + "08:00 to 08:30 25 July, 2023".toText( + color: MyColors.lightTextColor, + fontSize: 12, + ), + ], + ), + 9.height, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + "Appointment Details".toText( + color: MyColors.primaryColor, + isUnderLine: true, + isBold: true, + fontSize: 14, + ), + const Icon(Icons.arrow_forward), + ], + ), + ], + ), + ), + ], + ), + ], + ).toWhiteContainer(width: double.infinity, allPading: 12), + ); + } + + @override + Widget build(BuildContext context) { + return CarouselSlider.builder( + options: CarouselOptions( + height: 140, + viewportFraction: 1.0, + enlargeCenterPage: false, + enableInfiniteScroll: false, + // + // onPageChanged: (index) { + // setState(() { + // _current = index; + // }); + // }, + ), + itemCount: 10, + itemBuilder: (BuildContext context, int itemIndex, int pageViewIndex) => buildAppointmentSliderForConsumer(), + ); + } + + Widget showServices(String title) { + return Row( + children: [ + const Icon( + Icons.ac_unit, + color: MyColors.primaryColor, + size: 18, + ), + 8.width, + title.toText( + fontSize: 14, + isBold: true, + ), + ], + ); + } +} diff --git a/lib/widgets/common_widgets/bottom_nav_bar.dart b/lib/widgets/common_widgets/bottom_nav_bar.dart new file mode 100644 index 0000000..8011bdb --- /dev/null +++ b/lib/widgets/common_widgets/bottom_nav_bar.dart @@ -0,0 +1,61 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:mc_common_app/extensions/widget_extensions.dart'; +import 'package:mc_common_app/generated/locale_keys.g.dart'; +import 'package:mc_common_app/theme/colors.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:mc_common_app/classes/consts.dart'; + +class CustomBottomNavbar extends StatelessWidget { + final int selectedNavbarBarIndex; + final Function(int) onSelected; + + const CustomBottomNavbar({Key? key, required this.onSelected, required this.selectedNavbarBarIndex}) : super(key: key); + + @override + Widget build(BuildContext context) { + return BottomNavigationBar( + items: [ + BottomNavigationBarItem( + icon: SvgPicture.asset(MyAssets.providersIcon).paddingAll(5), + activeIcon: SvgPicture.asset(MyAssets.providersIcon, color: MyColors.darkIconColor).paddingAll(5), + label: LocaleKeys.providers.tr(), + ), + BottomNavigationBarItem( + icon: SvgPicture.asset(MyAssets.appointmentsIcon).paddingAll(5), + activeIcon: SvgPicture.asset(MyAssets.appointmentsIcon, color: MyColors.darkIconColor).paddingAll(5), + label: LocaleKeys.appointments.tr(), + ), + BottomNavigationBarItem( + icon: SvgPicture.asset( + MyAssets.homeIcon, + color: MyColors.lightIconColor, + ).paddingAll(5), + activeIcon: SvgPicture.asset(MyAssets.homeIcon, color: MyColors.darkIconColor).paddingAll(5), + label: LocaleKeys.home.tr(), + ), + BottomNavigationBarItem( + icon: SvgPicture.asset(MyAssets.announcementIcon).paddingAll(5), + activeIcon: SvgPicture.asset(MyAssets.announcementIcon, color: MyColors.darkIconColor).paddingAll(5), + label: LocaleKeys.ads.tr(), + ), + BottomNavigationBarItem( + icon: SvgPicture.asset(MyAssets.settingsIcon).paddingAll(5), + activeIcon: SvgPicture.asset(MyAssets.settingsIcon, color: MyColors.darkIconColor).paddingAll(5), + label: LocaleKeys.settings.tr(), + ), + ], + currentIndex: selectedNavbarBarIndex, + type: BottomNavigationBarType.fixed, + selectedItemColor: MyColors.darkIconColor, + showSelectedLabels: true, + showUnselectedLabels: true, + unselectedItemColor: MyColors.lightTextColor, + unselectedFontSize: 11, + selectedFontSize: 11, + selectedLabelStyle: const TextStyle(fontFamily: "Poppins"), + unselectedLabelStyle: const TextStyle(fontFamily: "Poppins"), + onTap: (index) => onSelected(index), + ); + } +} diff --git a/lib/widgets/common_widgets/my_service_provider.dart b/lib/widgets/common_widgets/my_service_provider.dart new file mode 100644 index 0000000..0f250fe --- /dev/null +++ b/lib/widgets/common_widgets/my_service_provider.dart @@ -0,0 +1,39 @@ + +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/widgets/extensions/extensions_widget.dart'; + +class ServiceProviderWidget extends StatelessWidget { + const ServiceProviderWidget({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: double.infinity, + height: 140, + child: ListView.builder( + itemCount: 9, + scrollDirection: Axis.horizontal, + shrinkWrap: true, + itemBuilder: (BuildContext context, int index) { + return SizedBox( + width: 90, + child: Column( + children: [ + Image.asset( + "assets/images/bn_car.jpeg", + width: 80, + height: 80, + fit: BoxFit.cover, + ).toCircle(borderRadius: 100), + 8.height, + "Olaya Branch".toText(fontSize: 14, isBold: true, textAlign: TextAlign.center), + ], + ), + ); + }, + ), + ); + } +} diff --git a/lib/widgets/common_widgets/view_all_widget.dart b/lib/widgets/common_widgets/view_all_widget.dart new file mode 100644 index 0000000..b46d67c --- /dev/null +++ b/lib/widgets/common_widgets/view_all_widget.dart @@ -0,0 +1,30 @@ + +import 'package:flutter/cupertino.dart'; +import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/theme/colors.dart'; + +class ViewAllWidget extends StatelessWidget { + final String title; + final String subTitle; + + const ViewAllWidget({Key? key, required this.title, required this.subTitle}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + width: double.infinity, + padding: const EdgeInsets.only(bottom: 7), + child: Row( + children: [ + Expanded(child: title.toText(isBold: true, fontSize: 18)), + subTitle.toText( + fontSize: 11, + isBold: true, + color: MyColors.primaryColor, + textDecoration: TextDecoration.underline, + ) + ], + ), + ); + } +} diff --git a/lib/widgets/extensions/extensions_widget.dart b/lib/widgets/extensions/extensions_widget.dart index c046072..669c9d9 100644 --- a/lib/widgets/extensions/extensions_widget.dart +++ b/lib/widgets/extensions/extensions_widget.dart @@ -1,7 +1,9 @@ import 'package:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:mc_common_app/theme/colors.dart'; extension ExtendedText on Widget { - showOverlay({double? width, double? height}){ + showOverlay({double? width, double? height}) { return Container( width: width ?? double.infinity, height: height ?? 60, @@ -17,15 +19,39 @@ extension ExtendedText on Widget { } } +extension ContainerExt on Widget { + Widget toWhiteContainer({required double width, required double allPading}) { + return Container( + decoration: const BoxDecoration( + color: MyColors.white, + boxShadow: [ + BoxShadow( + blurRadius: 8, + spreadRadius: 3, + offset: Offset(0, 3), + color: MyColors.greyShadowColor, + ), + ], + ), + padding: EdgeInsets.all(allPading), + child: this, + ); + } - - + Widget toContainer({required double borderRadius, required Color backgroundColor, required EdgeInsetsGeometry padding}) { + return Container( + decoration: BoxDecoration(color: backgroundColor, borderRadius: BorderRadius.circular(borderRadius)), + padding: padding, + child: this, + ); + } +} extension ImageExt on Image { - Widget circular() { + Widget toCircle({required double borderRadius}) { return ClipRRect( clipBehavior: Clip.hardEdge, - borderRadius: BorderRadius.circular(100), + borderRadius: BorderRadius.circular(borderRadius), child: this, ); } @@ -33,7 +59,7 @@ extension ImageExt on Image { extension WidgetExt on Widget { Widget toWidget() { - return this as Widget; + return this; } Widget sized({double? width, double? height}) { @@ -43,12 +69,17 @@ extension WidgetExt on Widget { child: this, ); } - Widget inkWell({required VoidCallback onTap,double radius=0}){ + + Widget inkWell({required VoidCallback onTap, double radius = 0}) { return InkWell( - child: Material(child: this,color: Colors.transparent,), onTap: onTap, + child: Material( + color: Colors.transparent, + child: this, + ), ); } + Widget sizeSq(double size) { return SizedBox( width: size, @@ -65,10 +96,8 @@ extension WidgetExt on Widget { ); } - Widget margin( - {double top = 0, double bottom = 0, double left = 0, double right = 0}) { - var pad = - EdgeInsets.only(top: top, left: left, bottom: bottom, right: right); + Widget margin({double top = 0, double bottom = 0, double left = 0, double right = 0}) { + var pad = EdgeInsets.only(top: top, left: left, bottom: bottom, right: right); try { (this as dynamic).margin = pad; } catch (err) { @@ -132,6 +161,18 @@ extension WidgetExt on Widget { ); } + Widget horPaddingMain() { + return Padding( + padding: EdgeInsets.symmetric(horizontal: 21), + child: this, + ); + } + + Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this); + + 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); + // Widget onTap(VoidCallback onTap, {double corners = 0}) { // return Clickable.widget(child: this, corners: corners, onTap: onTap); // } @@ -218,8 +259,7 @@ extension StateExt on State { extension xFuture on Future { thenWithDelay(int millis, Function(T) thenBlock) { then((value) { - Future.delayed(Duration(milliseconds: millis)) - .then((value) => thenBlock(value)); + Future.delayed(Duration(milliseconds: millis)).then((value) => thenBlock(value)); }); } } @@ -231,3 +271,14 @@ extension xDouble on int { Duration durationHour() => Duration(hours: this); } + +extension BuildSVG on String { + Widget buildSvg({double? height, double? width, BoxFit fit = BoxFit.contain}) { + return SvgPicture.asset( + this, + fit: fit, + height: height, + width: width, + ); + } +} diff --git a/pubspec.lock b/pubspec.lock index 70ed0f7..6993d82 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -57,6 +57,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.1" + carousel_slider: + dependency: "direct main" + description: + name: carousel_slider + sha256: "9c695cc963bf1d04a47bd6021f68befce8970bcd61d24938e1fb0918cf5d9c42" + url: "https://pub.dev" + source: hosted + version: "4.2.1" characters: dependency: transitive description: