diff --git a/android/app/build.gradle b/android/app/build.gradle index 09fd0fb..6ac2704 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -44,7 +44,7 @@ android { defaultConfig { // TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html). applicationId "com.example.car_customer_app" - minSdkVersion 16 + minSdkVersion 20 targetSdkVersion 31 versionCode flutterVersionCode.toInteger() versionName flutterVersionName diff --git a/assets/assets/fonts/Poppins-Medium.ttf b/assets/assets/fonts/Poppins-Medium.ttf deleted file mode 100644 index 6bcdcc2..0000000 Binary files a/assets/assets/fonts/Poppins-Medium.ttf and /dev/null differ diff --git a/assets/assets/icons/Group 17.png b/assets/assets/icons/Group 17.png deleted file mode 100644 index 7bb404a..0000000 Binary files a/assets/assets/icons/Group 17.png and /dev/null differ diff --git a/assets/assets/icons/ic_branchs.svg b/assets/assets/icons/ic_branchs.svg deleted file mode 100644 index d074656..0000000 --- a/assets/assets/icons/ic_branchs.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/assets/icons/ic_close_account.svg b/assets/assets/icons/ic_close_account.svg deleted file mode 100644 index 93adb61..0000000 --- a/assets/assets/icons/ic_close_account.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/assets/icons/ic_face.svg b/assets/assets/icons/ic_face.svg deleted file mode 100644 index 5fa9a9c..0000000 --- a/assets/assets/icons/ic_face.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/assets/assets/icons/ic_face_id.png b/assets/assets/icons/ic_face_id.png deleted file mode 100644 index 913e850..0000000 Binary files a/assets/assets/icons/ic_face_id.png and /dev/null differ diff --git a/assets/assets/icons/ic_fingerprint.png b/assets/assets/icons/ic_fingerprint.png deleted file mode 100644 index bf73197..0000000 Binary files a/assets/assets/icons/ic_fingerprint.png and /dev/null differ diff --git a/assets/assets/icons/ic_fingerprint.svg b/assets/assets/icons/ic_fingerprint.svg deleted file mode 100644 index ba45417..0000000 --- a/assets/assets/icons/ic_fingerprint.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/assets/assets/icons/ic_provider.svg b/assets/assets/icons/ic_provider.svg deleted file mode 100644 index e22c356..0000000 --- a/assets/assets/icons/ic_provider.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/assets/icons/ic_services.svg b/assets/assets/icons/ic_services.svg deleted file mode 100644 index b0d0606..0000000 --- a/assets/assets/icons/ic_services.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/assets/assets/icons/ic_settings.svg b/assets/assets/icons/ic_settings.svg deleted file mode 100644 index 6435135..0000000 --- a/assets/assets/icons/ic_settings.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/assets/icons/ic_sms.png b/assets/assets/icons/ic_sms.png deleted file mode 100644 index aa72e0e..0000000 Binary files a/assets/assets/icons/ic_sms.png and /dev/null differ diff --git a/assets/assets/icons/ic_sms.svg b/assets/assets/icons/ic_sms.svg deleted file mode 100644 index 132ab7f..0000000 --- a/assets/assets/icons/ic_sms.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/assets/assets/icons/ic_whatsapp.png b/assets/assets/icons/ic_whatsapp.png deleted file mode 100644 index 3f36403..0000000 Binary files a/assets/assets/icons/ic_whatsapp.png and /dev/null differ diff --git a/assets/assets/icons/ic_whatsapp.svg b/assets/assets/icons/ic_whatsapp.svg deleted file mode 100644 index 073e581..0000000 --- a/assets/assets/icons/ic_whatsapp.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/assets/assets/images/bn_car.jpeg b/assets/assets/images/bn_car.jpeg deleted file mode 100644 index 5a6bd85..0000000 Binary files a/assets/assets/images/bn_car.jpeg and /dev/null differ diff --git a/assets/assets/images/bn_logo.svg b/assets/assets/images/bn_logo.svg deleted file mode 100644 index b0c971d..0000000 --- a/assets/assets/images/bn_logo.svg +++ /dev/null @@ -1,560 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/assets/images/bn_map.png b/assets/assets/images/bn_map.png deleted file mode 100644 index b04b5aa..0000000 Binary files a/assets/assets/images/bn_map.png and /dev/null differ diff --git a/assets/assets/images/ic_car.svg b/assets/assets/images/ic_car.svg deleted file mode 100644 index 804f607..0000000 --- a/assets/assets/images/ic_car.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/assets/assets/images/ic_edit.svg b/assets/assets/images/ic_edit.svg deleted file mode 100644 index c14165f..0000000 --- a/assets/assets/images/ic_edit.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/assets/images/ic_email.svg b/assets/assets/images/ic_email.svg deleted file mode 100644 index 81c4573..0000000 --- a/assets/assets/images/ic_email.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/assets/assets/images/ic_engine.png b/assets/assets/images/ic_engine.png deleted file mode 100644 index 0256ff0..0000000 Binary files a/assets/assets/images/ic_engine.png and /dev/null differ diff --git a/assets/assets/images/ic_lock.svg b/assets/assets/images/ic_lock.svg deleted file mode 100644 index 1273157..0000000 --- a/assets/assets/images/ic_lock.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/assets/images/ic_logo_white.png b/assets/assets/images/ic_logo_white.png deleted file mode 100644 index 779fda4..0000000 Binary files a/assets/assets/images/ic_logo_white.png and /dev/null differ diff --git a/assets/assets/images/ic_logout.svg b/assets/assets/images/ic_logout.svg deleted file mode 100644 index 2be107f..0000000 --- a/assets/assets/images/ic_logout.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/assets/assets/images/ic_mobile.svg b/assets/assets/images/ic_mobile.svg deleted file mode 100644 index 068cf7a..0000000 --- a/assets/assets/images/ic_mobile.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/assets/images/ic_notes.svg b/assets/assets/images/ic_notes.svg deleted file mode 100644 index 009cf17..0000000 --- a/assets/assets/images/ic_notes.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/assets/assets/images/ic_notification.svg b/assets/assets/images/ic_notification.svg deleted file mode 100644 index e45bab2..0000000 --- a/assets/assets/images/ic_notification.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/assets/images/ic_settings.svg b/assets/assets/images/ic_settings.svg deleted file mode 100644 index 83b64c9..0000000 --- a/assets/assets/images/ic_settings.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/assets/images/ic_world.png b/assets/assets/images/ic_world.png deleted file mode 100644 index 01ea634..0000000 Binary files a/assets/assets/images/ic_world.png and /dev/null differ diff --git a/assets/assets/images/logo.svg b/assets/assets/images/logo.svg deleted file mode 100644 index 8552147..0000000 --- a/assets/assets/images/logo.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/assets/images/splash_logo.svg b/assets/assets/images/splash_logo.svg deleted file mode 100644 index 481226e..0000000 --- a/assets/assets/images/splash_logo.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/assets/fonts/Poppins-Medium.ttf b/assets/fonts/Poppins-Medium.ttf deleted file mode 100644 index 6bcdcc2..0000000 Binary files a/assets/fonts/Poppins-Medium.ttf and /dev/null differ diff --git a/assets/icons/Group 17.png b/assets/icons/Group 17.png deleted file mode 100644 index 7bb404a..0000000 Binary files a/assets/icons/Group 17.png and /dev/null differ diff --git a/assets/icons/ic_branchs.svg b/assets/icons/ic_branchs.svg deleted file mode 100644 index d074656..0000000 --- a/assets/icons/ic_branchs.svg +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/icons/ic_close_account.svg b/assets/icons/ic_close_account.svg deleted file mode 100644 index 93adb61..0000000 --- a/assets/icons/ic_close_account.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/icons/ic_face.svg b/assets/icons/ic_face.svg deleted file mode 100644 index 5fa9a9c..0000000 --- a/assets/icons/ic_face.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/assets/icons/ic_face_id.png b/assets/icons/ic_face_id.png deleted file mode 100644 index 913e850..0000000 Binary files a/assets/icons/ic_face_id.png and /dev/null differ diff --git a/assets/icons/ic_fingerprint.png b/assets/icons/ic_fingerprint.png deleted file mode 100644 index bf73197..0000000 Binary files a/assets/icons/ic_fingerprint.png and /dev/null differ diff --git a/assets/icons/ic_fingerprint.svg b/assets/icons/ic_fingerprint.svg deleted file mode 100644 index ba45417..0000000 --- a/assets/icons/ic_fingerprint.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - - - - diff --git a/assets/icons/ic_provider.svg b/assets/icons/ic_provider.svg deleted file mode 100644 index e22c356..0000000 --- a/assets/icons/ic_provider.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/icons/ic_services.svg b/assets/icons/ic_services.svg deleted file mode 100644 index b0d0606..0000000 --- a/assets/icons/ic_services.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/assets/icons/ic_settings.svg b/assets/icons/ic_settings.svg deleted file mode 100644 index 6435135..0000000 --- a/assets/icons/ic_settings.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/icons/ic_sms.png b/assets/icons/ic_sms.png deleted file mode 100644 index aa72e0e..0000000 Binary files a/assets/icons/ic_sms.png and /dev/null differ diff --git a/assets/icons/ic_sms.svg b/assets/icons/ic_sms.svg deleted file mode 100644 index 132ab7f..0000000 --- a/assets/icons/ic_sms.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/assets/icons/ic_whatsapp.png b/assets/icons/ic_whatsapp.png deleted file mode 100644 index 3f36403..0000000 Binary files a/assets/icons/ic_whatsapp.png and /dev/null differ diff --git a/assets/icons/ic_whatsapp.svg b/assets/icons/ic_whatsapp.svg deleted file mode 100644 index 073e581..0000000 --- a/assets/icons/ic_whatsapp.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/assets/images/bc_Intro.svg b/assets/images/bc_Intro.svg deleted file mode 100644 index deb4ffa..0000000 --- a/assets/images/bc_Intro.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/bn_Intro.png b/assets/images/bn_Intro.png deleted file mode 100644 index 8c342d2..0000000 Binary files a/assets/images/bn_Intro.png and /dev/null differ diff --git a/assets/images/bn_car.jpeg b/assets/images/bn_car.jpeg deleted file mode 100644 index 5a6bd85..0000000 Binary files a/assets/images/bn_car.jpeg and /dev/null differ diff --git a/assets/images/bn_logo.svg b/assets/images/bn_logo.svg deleted file mode 100644 index b0c971d..0000000 --- a/assets/images/bn_logo.svg +++ /dev/null @@ -1,560 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/bn_map.png b/assets/images/bn_map.png deleted file mode 100644 index b04b5aa..0000000 Binary files a/assets/images/bn_map.png and /dev/null differ diff --git a/assets/images/ic_car.svg b/assets/images/ic_car.svg deleted file mode 100644 index 804f607..0000000 --- a/assets/images/ic_car.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/assets/images/ic_edit.svg b/assets/images/ic_edit.svg deleted file mode 100644 index c14165f..0000000 --- a/assets/images/ic_edit.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/images/ic_email.svg b/assets/images/ic_email.svg deleted file mode 100644 index 81c4573..0000000 --- a/assets/images/ic_email.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/assets/images/ic_engine.png b/assets/images/ic_engine.png deleted file mode 100644 index 0256ff0..0000000 Binary files a/assets/images/ic_engine.png and /dev/null differ diff --git a/assets/images/ic_lock.svg b/assets/images/ic_lock.svg deleted file mode 100644 index 1273157..0000000 --- a/assets/images/ic_lock.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/assets/images/ic_logo_white.png b/assets/images/ic_logo_white.png deleted file mode 100644 index 779fda4..0000000 Binary files a/assets/images/ic_logo_white.png and /dev/null differ diff --git a/assets/images/ic_logout.svg b/assets/images/ic_logout.svg deleted file mode 100644 index 2be107f..0000000 --- a/assets/images/ic_logout.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/assets/images/ic_mobile.svg b/assets/images/ic_mobile.svg deleted file mode 100644 index 068cf7a..0000000 --- a/assets/images/ic_mobile.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/assets/images/ic_notes.svg b/assets/images/ic_notes.svg deleted file mode 100644 index 009cf17..0000000 --- a/assets/images/ic_notes.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/assets/images/ic_notification.svg b/assets/images/ic_notification.svg deleted file mode 100644 index e45bab2..0000000 --- a/assets/images/ic_notification.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/images/ic_settings.svg b/assets/images/ic_settings.svg deleted file mode 100644 index 83b64c9..0000000 --- a/assets/images/ic_settings.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/assets/images/ic_world.png b/assets/images/ic_world.png deleted file mode 100644 index 01ea634..0000000 Binary files a/assets/images/ic_world.png and /dev/null differ diff --git a/assets/images/logo.svg b/assets/images/logo.svg deleted file mode 100644 index 8552147..0000000 --- a/assets/images/logo.svg +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/assets/images/splash_logo.svg b/assets/images/splash_logo.svg deleted file mode 100644 index 481226e..0000000 --- a/assets/images/splash_logo.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/assets/langs/ar-SA.json b/assets/langs/ar-SA.json deleted file mode 100644 index 4d542b6..0000000 --- a/assets/langs/ar-SA.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "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" : "ثانية" -} \ No newline at end of file diff --git a/assets/langs/en-US.json b/assets/langs/en-US.json deleted file mode 100644 index ae3143e..0000000 --- a/assets/langs/en-US.json +++ /dev/null @@ -1,138 +0,0 @@ -{ - "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" -} \ No newline at end of file diff --git a/lib/api/api_client.dart b/lib/api/api_client.dart deleted file mode 100644 index 65d38dd..0000000 --- a/lib/api/api_client.dart +++ /dev/null @@ -1,317 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; -import 'dart:io'; - -import 'package:car_customer_app/classes/app_state.dart'; -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/exceptions/api_exception.dart'; -import 'package:car_customer_app/models/user/refresh_token.dart'; -import 'package:car_customer_app/models/user/user.dart'; -import 'package:car_customer_app/utils/shared_prefrence.dart'; -import 'package:flutter/foundation.dart'; -import 'package:http/http.dart'; -import 'package:http/io_client.dart'; - -typedef FactoryConstructor = U Function(dynamic); - -class APIError { - int errorCode; - String errorMessage; - - APIError(this.errorCode, this.errorMessage); - - Map toJson() => {'errorCode': errorCode, 'errorMessage': errorMessage}; - - @override - String toString() { - return jsonEncode(this); - } - - - static APIException throwAPIException(Response response) { - switch (response.statusCode) { - case 400: - APIError? apiError; - if (response.body != null && response.body.isNotEmpty) { - var jsonError = jsonDecode(response.body); - apiError = APIError(jsonError['errorCode'], jsonError['errorMessage']); - } - return APIException(APIException.BAD_REQUEST, error: apiError); - case 401: - return const APIException(APIException.UNAUTHORIZED); - case 403: - return const APIException(APIException.FORBIDDEN); - case 404: - return const APIException(APIException.NOT_FOUND); - case 500: - return const APIException(APIException.INTERNAL_SERVER_ERROR); - case 444: - var downloadUrl = response.headers["location"]; - return APIException(APIException.UPGRADE_REQUIRED, arguments: downloadUrl); - default: - return const APIException(APIException.OTHER); - } - } - -} - -abstract class ApiClient { - Future postJsonForObject(FactoryConstructor factoryConstructor, String url, T jsonObject, - {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}); - - Future postJsonForResponse(String url, T jsonObject, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}); - - Future getJsonForObject(FactoryConstructor factoryConstructor, String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}); - - Future getJsonForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}); -} - -class ApiClientImp implements ApiClient { - @override - Future postJsonForObject(FactoryConstructor factoryConstructor, String url, T jsonObject, - {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { - var _headers = {'Accept': 'application/json'}; - if (headers != null && headers.isNotEmpty) { - _headers.addAll(headers); - } - if (!kReleaseMode) { - debugPrint("Url:$url"); - debugPrint("body:$jsonObject"); - } - var response = await postJsonForResponse(url, jsonObject, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes); - try { - if (!kReleaseMode) { - debugPrint("res121:" + response.body); - debugPrint("res121:" + response.statusCode.toString()); - } - var jsonData = jsonDecode(response.body); - return factoryConstructor(jsonData); - } catch (ex) { - debugPrint(ex.toString()); - debugPrint("exception:" + ex.toString()); - throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); - } - } - - @override - Future postJsonForResponse(String url, T jsonObject, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { - String? requestBody; - if (jsonObject != null) { - requestBody = jsonEncode(jsonObject); - if (headers == null) { - headers = {'Content-Type': 'application/json'}; - } else { - headers['Content-Type'] = 'application/json'; - } - } - - return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); - } - - Future _postForResponse( - String url, - requestBody, { - String? token, - Map? queryParameters, - Map? headers, - int retryTimes = 0, - }) async { - try { - var _headers = {}; - if (token != null) { - _headers['Authorization'] = 'Bearer $token'; - } - - if (headers != null && headers.isNotEmpty) { - _headers.addAll(headers); - } - - if (queryParameters != null) { - var queryString = Uri(queryParameters: queryParameters).query; - url = url + '?' + queryString; - } - - Response response; - - response = await _post(Uri.parse(url), body: requestBody, headers: _headers).timeout(const Duration(seconds: 100)); - - if (!kReleaseMode) { - debugPrint("Url:$url"); - debugPrint("body:$requestBody"); - debugPrint("res: " + response.body); - } - if (response.statusCode >= 200 && response.statusCode < 500) { - var jsonData = jsonDecode(response.body); - if (jsonData["StatusMessage"] != null && jsonData["StatusMessage"] == "Unauthorized user attempt to access API") { - String mToken = await updateUserToken(); - return await _postForResponse(url, requestBody, token: mToken, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); - } - return response; - } else { - throw APIError.throwAPIException(response); - } - } on SocketException catch (e) { - if (retryTimes > 0) { - debugPrint('will retry after 3 seconds...'); - await Future.delayed(const Duration(seconds: 3)); - return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } on HttpException catch (e) { - if (retryTimes > 0) { - debugPrint('will retry after 3 seconds...'); - await Future.delayed(const Duration(seconds: 3)); - return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } on TimeoutException catch (e) { - throw APIException(APIException.TIMEOUT, arguments: e); - } on ClientException catch (e) { - if (retryTimes > 0) { - debugPrint('will retry after 3 seconds...'); - await Future.delayed(const Duration(seconds: 3)); - return await _postForResponse(url, requestBody, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } catch (ex) { - debugPrint("exception1:" + ex.toString()); - throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); - } - } - - bool _certificateCheck(X509Certificate cert, String host, int port) => true; - - Future _withClient(Future Function(Client) fn) async { - var httpClient = HttpClient()..badCertificateCallback = _certificateCheck; - var client = IOClient(httpClient); - try { - return await fn(client); - } finally { - client.close(); - } - } - - Future _post(url, {Map? headers, body, Encoding? encoding}) => _withClient((client) => client.post(url, headers: headers, body: body, encoding: encoding)); - - @override - Future getJsonForObject(FactoryConstructor factoryConstructor, String url, - {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { - var _headers = {'Accept': 'application/json'}; - if (headers != null && headers.isNotEmpty) { - _headers.addAll(headers); - } - var response = await getJsonForResponse(url, token: token, queryParameters: queryParameters, headers: _headers, retryTimes: retryTimes); - try { - if (!kReleaseMode) { - debugPrint("res:" + response.body); - } - var jsonData = jsonDecode(response.body); - return factoryConstructor(jsonData); - } catch (ex) { - debugPrint("exception:" + response.body); - throw APIException(APIException.BAD_RESPONSE_FORMAT, arguments: ex); - } - } - - @override - Future getJsonForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { - if (headers == null) { - headers = {'Content-Type': 'application/json'}; - } else { - headers['Content-Type'] = 'application/json'; - } - return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); - } - - bool isFirstCall = true; - - Future _getForResponse(String url, {String? token, Map? queryParameters, Map? headers, int retryTimes = 0}) async { - try { - var _headers = {}; - if (token != null) { - _headers['Authorization'] = 'Bearer $token'; - } - - if (headers != null && headers.isNotEmpty) { - _headers.addAll(headers); - } - if (queryParameters != null) { - String queryString = Uri(queryParameters: queryParameters).query; - if (isFirstCall) url = url + '?' + queryString.toString(); - } - - if (!kReleaseMode) { - debugPrint("Url:$url"); - debugPrint("queryParameters:$queryParameters"); - } - var response = await _get(Uri.parse(url), headers: _headers).timeout(const Duration(seconds: 60)); - - if (!kReleaseMode) { - debugPrint("res: " + response.body.toString()); - } - if (response.statusCode >= 200 && response.statusCode < 500) { - var jsonData = jsonDecode(response.body); - if (jsonData["StatusMessage"] != null && jsonData["StatusMessage"] == "Unauthorized user attempt to access API") { - String mToken = await updateUserToken(); - isFirstCall = false; - return await _getForResponse(url, token: mToken, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes); - } - return response; - } else { - throw APIError.throwAPIException(response); - } - } on SocketException catch (e) { - if (retryTimes > 0) { - debugPrint('will retry after 3 seconds...'); - await Future.delayed(const Duration(seconds: 3)); - return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } on HttpException catch (e) { - if (retryTimes > 0) { - debugPrint('will retry after 3 seconds...'); - await Future.delayed(const Duration(seconds: 3)); - return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } on TimeoutException catch (e) { - throw APIException(APIException.TIMEOUT, arguments: e); - } on ClientException catch (e) { - if (retryTimes > 0) { - await Future.delayed(const Duration(seconds: 3)); - return await _getForResponse(url, token: token, queryParameters: queryParameters, headers: headers, retryTimes: retryTimes - 1); - } else { - throw APIException(APIException.OTHER, arguments: e); - } - } catch (e) { - throw APIException(APIException.OTHER, arguments: e); - } - } - - Future _get(url, {Map? headers}) => _withClient((client) => client.get(url, headers: headers)); - - Future refreshTokenAPI(String token, String refreshToken) async { - var postParams = {"token": token, "refreshToken": refreshToken}; - // String t = AppState().getUser.data!.accessToken ?? ""; - return await postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.RefreshToken, postParams); - } - - Future updateUserToken() async { - String token = await SharedPrefManager.getUserToken(); - String refreshToken = await SharedPrefManager.getRefreshToken(); - RefreshToken refresh = await refreshTokenAPI(token, refreshToken); - SharedPrefManager.setUserToken(refresh.data!.accessToken ?? ""); - SharedPrefManager.setRefreshToken(refresh.data!.refreshToken ?? ""); - String mdata = await SharedPrefManager.getData(); - UserInfo info = UserInfo.fromJson(jsonDecode(mdata)); - User user = User(); - user.data = UserData(accessToken: refresh.data!.accessToken ?? "", refreshToken: refresh.data!.refreshToken ?? "", userInfo: info); - AppState().setUser = user; - return refresh.data!.accessToken??""; - } -} diff --git a/lib/api/client/branch_api_client.dart b/lib/api/client/branch_api_client.dart deleted file mode 100644 index f1fc0b3..0000000 --- a/lib/api/client/branch_api_client.dart +++ /dev/null @@ -1,57 +0,0 @@ -// import 'dart:async'; -// -// import 'package:car_customer_app/classes/app_state.dart'; -// import 'package:car_customer_app/classes/consts.dart'; -// import 'package:car_customer_app/config/dependencies.dart'; -// import 'package:car_customer_app/models/m_response.dart'; -// import 'package:car_customer_app/models/profile/branch.dart'; -// import 'package:car_customer_app/models/profile/categroy.dart'; -// import 'package:car_customer_app/models/profile/services.dart'; -// -// import '../api_client.dart'; -// -// class BranchApiClient { -// -// Future createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async { -// var postParams = { -// // "id": 0, -// "serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "", -// "branchName": branchName, -// "branchDescription": branchDescription, -// "cityID": cityId, -// "address": address, -// "latitude": latitude, -// "longitude": longitude, -// "isActive": true -// }; -// String t = AppState().getUser.data!.accessToken ?? ""; -// print("tokeen " + t); -// return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t); -// } -// -// Future fetchAllBranches() async { -// var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; -// String t = AppState().getUser.data!.accessToken ?? ""; -// print("tokeen " + t); -// return await injector.get().getJsonForObject((json) => Branch.fromJson(json), ApiConsts.ServiceProviderBranchGet, queryParameters: postParams, token: t); -// } -// -// Future fetchBranchCategory() async { -// var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; -// String t = AppState().getUser.data!.accessToken ?? ""; -// print("tokeen " + t); -// return await injector.get().getJsonForObject((json) => Category.fromJson(json), ApiConsts.ServiceCategory_Get, queryParameters: postParams, token: t); -// } -// -// Future fetchServices(String serviceCategoryId) async { -// var postParams = {"ServiceCategoryID": serviceCategoryId}; -// String t = AppState().getUser.data!.accessToken ?? ""; -// print("tokeen " + t); -// return await injector.get().getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: postParams, token: t); -// } -// -// Future createService(List> map) async { -// String t = AppState().getUser.data!.accessToken ?? ""; -// return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t); -// } -// } diff --git a/lib/api/client/profile_api_client.dart b/lib/api/client/profile_api_client.dart deleted file mode 100644 index ac65413..0000000 --- a/lib/api/client/profile_api_client.dart +++ /dev/null @@ -1,47 +0,0 @@ -// import 'dart:async'; -// -// import 'package:car_customer_app/classes/app_state.dart'; -// import 'package:car_customer_app/classes/consts.dart'; -// import 'package:car_customer_app/config/dependencies.dart'; -// import 'package:car_customer_app/models/m_response.dart'; -// import 'package:car_customer_app/models/profile/document.dart'; -// import 'package:flutter/cupertino.dart'; -// -// import '../api_client.dart'; -// -// class ProfileApiClient { -// static final ProfileApiClient _instance = ProfileApiClient._internal(); -// -// ProfileApiClient._internal(); -// -// factory ProfileApiClient() => _instance; -// -// Future getServiceProviderDocument(dynamic userId) async { -// var queryParameters = { -// "ServiceProviderID": userId.toString(), -// }; -// String? token = AppState().getUser.data?.accessToken; -// debugPrint(token); -// return await injector.get().getJsonForObject((json) => Document.fromJson(json), ApiConsts.GetProviderDocument, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? ""); -// } -// -// Future serviceProviderDocumentsUpdate(List? documents) async { -// List> map = []; -// for (int i = 0; i < documents!.length; i++) { -// if (documents[i].document != null) { -// var postParams = { -// "id": documents[i].id, -// "serviceProviderID": documents[i].serviceProviderId, -// "documentID": documents[i].documentId, -// "documentExt": documents[i].fileExt, -// "documentImage": documents[i].document, -// "isActive": true -// }; -// map.add(postParams); -// } -// } -// String t = AppState().getUser.data!.accessToken ?? ""; -// debugPrint("token " + t); -// return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderDocument_Update, map, token: t); -// } -// } diff --git a/lib/api/client/user_api_client.dart b/lib/api/client/user_api_client.dart deleted file mode 100644 index c3f19f1..0000000 --- a/lib/api/client/user_api_client.dart +++ /dev/null @@ -1,214 +0,0 @@ -// import 'dart:async'; -// import 'dart:convert'; -// -// import 'package:car_customer_app/classes/consts.dart'; -// import 'package:car_customer_app/config/dependencies.dart'; -// import 'package:car_customer_app/models/user/basic_otp.dart'; -// import 'package:car_customer_app/models/user/change_email.dart'; -// import 'package:car_customer_app/models/user/change_mobile.dart'; -// import 'package:car_customer_app/models/user/cities.dart'; -// import 'package:car_customer_app/models/user/confirm_email.dart'; -// import 'package:car_customer_app/models/user/confirm_mobile.dart'; -// import 'package:car_customer_app/models/user/country.dart'; -// import 'package:car_customer_app/models/user/image_response.dart'; -// import 'package:car_customer_app/models/user/refresh_token.dart'; -// import 'package:car_customer_app/models/user/register_user.dart'; -// import 'package:car_customer_app/models/user/role.dart'; -// import 'package:car_customer_app/models/user/verify_email.dart'; -// import 'package:http/http.dart'; -// -// import '../../classes/app_state.dart'; -// import '../../models/m_response.dart'; -// import '../../models/user/user.dart'; -// import '../api_client.dart'; -// import '../../utils/shared_prefrence.dart'; -// -// class UserApiClient { -// -// Future basicOtp(String phoneNo, {int otpType = 1, int roleId = 4, int countryId = 1}) async { -// var postParams = {"countryID": countryId, "userMobileNo": phoneNo, "otpType": otpType, "userRole": roleId}; -// return await injector.get().postJsonForObject((json) => BasicOtpRespModel.fromJson(json), ApiConsts.BasicOTP, postParams); -// } -// -// Future basicVerify(String phoneNo, String otp, String userToken) async { -// var postParams = { -// "userMobileNo": phoneNo, -// "userOTP": otp, -// "userToken": userToken, -// }; -// return await injector.get().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicVerify, postParams); -// } -// -// Future basicComplete(String userId, String firstName, String lastName, String email, String password) async { -// var postParams; -// if (email.isEmpty) { -// postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "companyName": "string", "isEmailVerified": true, "password": password}; -// } else { -// postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "email": email, "companyName": "string", "isEmailVerified": true, "password": password}; -// } -// -// return await injector.get().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicComplete, postParams); -// } -// -// Future login_V1(String phoneNo, String password) async { -// var postParams = { -// "mobileorEmail": phoneNo, -// "password": password, -// }; -// return await injector.get().postJsonForResponse(ApiConsts.Login_V1, postParams); -// //return await injector.get().postJsonForObject((json) => BasicOtp.fromJson(json), ApiConsts.Login_V1, postParams); -// } -// -// Future login_V2_OTP(String userToken, String loginType) async { -// var postParams = { -// "userToken": userToken, -// "loginType": loginType, -// }; -// return await injector.get().postJsonForResponse(ApiConsts.Login_V2_OTP, postParams); -// } -// -// Future login_V2_OTPVerify(String userToken, String otp) async { -// var postParams = {"userToken": userToken, "userOTP": otp}; -// return await injector.get().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams); -// } -// -// Future RefreshTokenAPI(String token, String refreshToken) async { -// var postParams = {"token": token, "refreshToken": refreshToken}; -// // String t = AppState().getUser.data!.accessToken ?? ""; -// return await injector.get().postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.RefreshToken, postParams); -// } -// -// Future getAllCountries() async { -// var postParams = {}; -// return await injector.get().getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry); -// } -// -// Future getAllCites(String countryId) async { -// var postParams = { -// "CountryID": countryId, -// }; -// return await injector.get().getJsonForObject((json) => Cities.fromJson(json), ApiConsts.GetAllCities, queryParameters: postParams); -// } -// -// Future getRoles() async { -// return await injector.get().getJsonForObject((json) => Role.fromJson(json), ApiConsts.GetProviderRoles); -// } -// -// Future ForgetPasswordOTPRequest(String userName, int otpType) async { -// var postParams = { -// "userName": userName, -// "otpType": 1, -// }; -// return await injector.get().postJsonForResponse(ApiConsts.ForgetPasswordOTPRequest, postParams); -// //return await injector.get().postJsonForObject((json) => PasswordOTPRequest.fromJson(json), ApiConsts.ForgetPasswordOTPRequest, postParams); -// } -// -// Future ForgetPasswordOTPCompare(String userToken, String userOTP) async { -// var postParams = {"userToken": userToken, "userOTP": userOTP}; -// return await injector.get().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams); -// // return await injector.get().postJsonForObject((json) => PasswordOTPCompare.fromJson(json), ApiConsts.ForgetPasswordOTPCompare, postParams); -// } -// -// Future ForgetPassword(String userToken, String newPassword) async { -// var postParams = { -// "userToken": userToken, -// "newPassword": newPassword, -// }; -// return await injector.get().postJsonForResponse(ApiConsts.ForgetPassword, postParams); -// //return await injector.get().postJsonForObject((json) => ConfirmPassword.fromJson(json), ApiConsts.ForgetPassword, postParams); -// } -// -// Future ChangePassword(String currentPasswor, String newPassword) async { -// var postParams = { -// "currentPassword": currentPasswor, -// "newPassword": newPassword, -// }; -// // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); -// -// String t = AppState().getUser.data!.accessToken ?? ""; -// print("tokeen " + t); -// return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ChangePassword, postParams, token: t); -// } -// -// Future ChangeMobileNoOTPRequest( -// countryID, -// String mobileNo, -// String password, -// ) async { -// var postParams = {"countryID": 1, "mobileNo": mobileNo, "password": password}; -// String t = AppState().getUser.data!.accessToken ?? ""; -// return await injector.get().postJsonForObject((json) => ChangeMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNoOTPRequest, postParams, token: t); -// } -// -// Future ChangeMobileNo(String userToken, String userOTP) async { -// var postParams = { -// "userToken": userToken, -// "userOTP": userOTP, -// }; -// String t = AppState().getUser.data!.accessToken ?? ""; -// return await injector.get().postJsonForObject((json) => ConfirmMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNo, postParams, token: t); -// } -// -// Future ChangeEmailOTPRequest(String email, String password) async { -// var postParams = {"email": email, "password": password}; -// String t = AppState().getUser.data!.accessToken ?? ""; -// return await injector.get().postJsonForObject((json) => ChanEmailRespModel.fromJson(json), ApiConsts.ChangeEmailOTPRequest, postParams, token: t); -// } -// -// Future ChangeEmail(String userToken, String userOTP) async { -// var postParams = {"userToken": userToken, "userOTP": userOTP}; -// String t = AppState().getUser.data!.accessToken ?? ""; -// return await injector.get().postJsonForObject((json) => ConfirmEmailRespModel.fromJson(json), ApiConsts.ChangeEmail, postParams, token: t); -// } -// -// Future EmailVerify(String email, String userID) async { -// var postParams = { -// // "email": email, -// // "userID": userID, -// "email": AppState().getUser.data!.userInfo!.email ?? "", -// "userID": AppState().getUser.data!.userInfo!.userId ?? "", -// }; -// -// String t = AppState().getUser.data!.accessToken ?? ""; -// return await injector.get().postJsonForObject((json) => VerifyEmailRespModel.fromJson(json), ApiConsts.EmailVerify, postParams, token: t); -// } -// -// Future EmailVerifyOTPVerify(String userToken, String userOTP) async { -// var postParams = {"userToken": userToken, "userOTP": userOTP}; -// -// String t = AppState().getUser.data!.accessToken ?? ""; -// return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.EmailVerifyOTPVerify, postParams, token: t); -// } -// -// Future UpdateUserImage(String image) async { -// var postParams = {"userID": AppState().getUser.data!.userInfo!.userId, "userImage": image}; -// // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); -// -// String t = AppState().getUser.data!.accessToken ?? ""; -// print("tokeen " + t); -// return await injector.get().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t); -// } -// -// Future GetUserImage(String image) async { -// var postParams = {}; -// // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); -// -// String t = AppState().getUser.data!.accessToken ?? ""; -// print("tokeen " + t); -// return await injector.get().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t); -// } -// -// Future UpdateUserToken() async { -// String token = await SharedPrefManager.getUserToken(); -// String refreshToken = await SharedPrefManager.getRefreshToken(); -// RefreshToken refresh = await RefreshTokenAPI(token, refreshToken); -// SharedPrefManager.setUserToken(refresh.data!.accessToken ?? ""); -// SharedPrefManager.setRefreshToken(refresh.data!.refreshToken ?? ""); -// String mdata = await SharedPrefManager.getData(); -// UserInfo info = UserInfo.fromJson(jsonDecode(mdata)); -// User user = new User(); -// user.data = new UserData(accessToken: refresh.data!.accessToken ?? "", refreshToken: refresh.data!.refreshToken ?? "", userInfo: info); -// AppState().setUser = user; -// return refresh.data!.accessToken??""; -// } -// } diff --git a/lib/classes/app_state.dart b/lib/classes/app_state.dart deleted file mode 100644 index 302f055..0000000 --- a/lib/classes/app_state.dart +++ /dev/null @@ -1,33 +0,0 @@ - - -import 'package:car_customer_app/models/post_params_model.dart'; -import 'package:car_customer_app/models/user/user.dart'; - -class AppState { - static final AppState _instance = AppState._internal(); - - AppState._internal(); - - factory AppState() => _instance; - - bool isLogged = false; - - set setLogged(v) => isLogged = v; - - bool? get getIsLogged => isLogged; - - User? _user = null; - - set setUser(v) => _user = v; - - User get getUser => _user??User(); - - PostParamsModel? _postParams; - - PostParamsModel? get postParamsObject => _postParams; - - Map get postParamsJson => _postParams?.toJson() ?? {}; - void setPostParamsModel(PostParamsModel _postParams) { - this._postParams = _postParams; - } -} diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart deleted file mode 100644 index f853522..0000000 --- a/lib/classes/consts.dart +++ /dev/null @@ -1,64 +0,0 @@ -class ApiConsts { - // static String baseUrl = "http://10.200.204.20:2801/"; // Local server - static String baseUrl = "https://ms.hmg.com/"; // production server - static String baseUrlServices = baseUrl + ""; // production server - static String BasicOTP = baseUrlServices + "api/Register/BasicOTP"; - static String BasicVerify = baseUrlServices + "api/Register/BasicVerify"; - static String BasicComplete = baseUrlServices + "api/Register/BasicComplete"; - static String RefreshToken = baseUrlServices + "api/Account/RefreshToken"; - - - //User - static String Login_V1 = baseUrlServices + "api/Account/Login_V1"; - static String Login_V2_OTP = baseUrlServices + "api/Account/Login_V2_OTP"; - static String Login_V2_OTPVerify = baseUrlServices + "api/Account/Login_V2_OTPVerify"; - static String user = baseUrlServices + "api/User/"; - static String GetAllCountry = baseUrlServices + "api/Master/Country_Get"; - static String GetProviderRoles = baseUrlServices + "api/Master/RoleServiceProvider_Get"; - static String GetAllCities = baseUrlServices + "api/Master/City_Get"; - static String ForgetPasswordOTPRequest = baseUrlServices + "api/Account/ForgetPasswordOTPRequest"; - static String ForgetPasswordOTPCompare = baseUrlServices + "api/Account/ForgetPasswordOTPCompare"; - static String ForgetPassword = baseUrlServices + "api/Account/ForgetPassword"; - static String Login_Email_OTP = baseUrlServices + "api/Account/EmailVerify"; - static String Login_Email_OTPVerify = baseUrlServices + "api/Account/EmailVerifyOTPVerify"; - static String ChangePassword = baseUrlServices + "api/Account/ChangePassword"; - static String ChangeMobileNoOTPRequest = baseUrlServices + "api/Account/ChangeMobileNoOTPRequest"; - static String ChangeMobileNo = baseUrlServices + "api/Account/ChangeMobileNo"; - static String ChangeEmailOTPRequest = baseUrlServices + "api/Account/ChangeEmailOTPRequest"; - static String ChangeEmail = baseUrlServices + "api/Account/ChangeEmail"; - static String EmailVerify = baseUrlServices + "api/Account/EmailVerify"; - static String EmailVerifyOTPVerify = baseUrlServices + "api/Account/EmailVerifyOTPVerify"; - static String UpdateUserImage = baseUrlServices + "api/User_UpdateProfileImage"; - static String GetUserImage = baseUrlServices + "api/ProfileImage"; - - - //Profile - static String GetProviderDocument = baseUrlServices + "api/ServiceProviders/ServiceProviderDocument_Get"; - static String ServiceProviderDocument_Update = baseUrlServices + "api/ServiceProviders/ServiceProviderDocument_Update"; - - //Branch - static String createProviderBranch = baseUrlServices + "api/ServiceProviders/ServiceProviderBranch_Create"; - static String ServiceProviderBranchGet = baseUrlServices + "api/ServiceProviders/ServiceProviderBranch_Get"; - static String ServiceCategory_Get = baseUrlServices + "api/Master/ServiceCategory_Get"; - static String Services_Get = baseUrlServices + "api/ServiceProviders/Services_Get"; - static String ServiceProviderService_Create = baseUrlServices + "api/ServiceProviders/ServiceProviderService_Create"; -} - -class GlobalConsts { - static String isRememberMe = "remember_me"; - static String email = "email"; - static String password = "password"; - static String bookmark = "bookmark"; - static String fontZoomSize = "font_zoom_size"; - static String welcomeVideoUrl = "welcomeVideoUrl"; - static String doNotShowWelcomeVideo = "doNotShowWelcomeVideo"; -} - -const String icons = "assets/icons/"; -const String categorySvgIcons = "assets/category/svg/"; -const String svgIcons = "assets/svg/"; - -RegExp numReg = RegExp(r".*[0-9].*"); -RegExp letterReg = RegExp(r".*[A-Za-z].*"); - - diff --git a/lib/config/constants.dart b/lib/config/constants.dart deleted file mode 100644 index 8b13789..0000000 --- a/lib/config/constants.dart +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lib/config/customer_dependencies.dart b/lib/config/customer_dependencies.dart new file mode 100644 index 0000000..3debdff --- /dev/null +++ b/lib/config/customer_dependencies.dart @@ -0,0 +1,10 @@ +import 'package:car_customer_app/repositories/provider_repo.dart'; +import 'package:mc_common_app/config/dependencies.dart'; + +class CustomerDependencies { + static void addDependencies() { + AppDependencies.addDependencies(); + injector.registerSingleton(() => ProviderRepoImp()); + + } +} diff --git a/lib/config/customer_routes.dart b/lib/config/customer_routes.dart new file mode 100644 index 0000000..f68dfef --- /dev/null +++ b/lib/config/customer_routes.dart @@ -0,0 +1,28 @@ +import 'package:car_customer_app/views/appointments/appointment_detail_view.dart'; +import 'package:car_customer_app/views/appointments/book_appointment_services_view.dart'; +import 'package:car_customer_app/views/appointments/pick_items_view.dart'; +import 'package:car_customer_app/views/dashboard/dashboard_page.dart'; +import 'package:car_customer_app/views/provider/branch_detail_page.dart'; +import 'package:car_customer_app/views/provider/provider_profile_page.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:mc_common_app/config/routes.dart'; +import 'package:mc_common_app/models/advertisment_models/ad_details_model.dart'; +import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart'; +import 'package:mc_common_app/models/services/branch_model.dart'; +import 'package:mc_common_app/views/advertisement/ads_detail_view.dart'; +import 'package:mc_common_app/views/advertisement/create_ad_view.dart'; +import 'package:mc_common_app/views/payments/payment_methods_view.dart'; + +class CustomerAppRoutes { + static final Map routes = { + AppRoutes.dashboard: (context) => DashboardPage(), + AppRoutes.bookProviderAppView: (context) => BookProviderAppView(), + AppRoutes.appointmentDetailView: (context) => AppointmentDetailView(appointmentListModel: ModalRoute.of(context)!.settings.arguments as AppointmentListModel), + AppRoutes.adsDetailView: (context) => AdsDetailView(adDetails: ModalRoute.of(context)!.settings.arguments as AdDetailsModel), + AppRoutes.createAdView: (context) => CreateAdView(), + AppRoutes.bookAppointmenServicesView: (context) => BookAppointmentServicesView(), + AppRoutes.paymentMethodsView: (context) => PaymentMethodsView(), + AppRoutes.branchDetailPage: (context) => BranchDetailPage(branchModel: ModalRoute.of(context)!.settings.arguments as BranchModel), + AppRoutes.providerProfilePage: (context) => ProviderProfilePage(providerId: ModalRoute.of(context)!.settings.arguments as int), + }; +} diff --git a/lib/config/dependencies.dart b/lib/config/dependencies.dart deleted file mode 100644 index ce9c53d..0000000 --- a/lib/config/dependencies.dart +++ /dev/null @@ -1,24 +0,0 @@ -// import 'package:firebase_crashlytics/firebase_crashlytics.dart'; -// import 'package:flutter/material.dart'; - -import 'package:car_customer_app/api/api_client.dart'; -import 'package:car_customer_app/classes/app_state.dart'; -import 'package:car_customer_app/repositories/branch_repo.dart'; -import 'package:car_customer_app/repositories/user_repo.dart'; -import 'package:car_customer_app/services/services.dart'; -import 'package:injector/injector.dart'; - -Injector injector = Injector.appInstance; - -class AppDependencies { - static void addDependencies() { - //services - injector.registerSingleton(() => AppState()); - injector.registerSingleton(() => ApiClientImp()); - injector.registerSingleton(() => CommonServicesImp()); - - //repos - injector.registerSingleton(() => UserRepoImp()); - injector.registerSingleton(() => BranchRepoImp()); - } -} diff --git a/lib/config/routes.dart b/lib/config/routes.dart deleted file mode 100644 index d9517ba..0000000 --- a/lib/config/routes.dart +++ /dev/null @@ -1,90 +0,0 @@ -import 'package:car_customer_app/models/user/register_user.dart'; -import 'package:car_customer_app/views/dashboard/dashboard_page.dart'; -// import 'package:car_customer_app/views/settings/create_services_page.dart'; -// import 'package:car_customer_app/views/settings/dealership_page.dart'; -// import 'package:car_customer_app/views/settings/define_branch_page.dart'; -// import 'package:car_customer_app/views/settings/define_license_page.dart'; -import 'package:car_customer_app/views/user/change_email_page.dart'; -import 'package:car_customer_app/views/user/change_mobile_page.dart'; -import 'package:car_customer_app/views/user/change_password_page.dart'; -import 'package:car_customer_app/views/user/complete_profile_page.dart'; -import 'package:car_customer_app/views/user/confirm_new_password_page.dart'; -import 'package:car_customer_app/views/user/edit_account_page.dart'; -import 'package:car_customer_app/views/user/forget_password_method_page.dart'; -import 'package:car_customer_app/views/user/forget_password_page.dart'; -import 'package:car_customer_app/views/user/login_method_selection_page.dart'; -import 'package:car_customer_app/views/user/login_verification_page.dart'; -import 'package:car_customer_app/views/user/login_verify_account_page.dart'; -import 'package:car_customer_app/views/user/login_with_password_page.dart'; -// import 'package:car_customer_app/views/user/profile/profile_1_page.dart'; -// import 'package:car_customer_app/views/user/profile/profile_2_page.dart'; -// import 'package:car_customer_app/views/user/profile/profile_3_page.dart'; -import 'package:car_customer_app/views/user/register_page.dart'; -import 'package:car_customer_app/views/user/register_selection_page.dart'; -import 'package:car_customer_app/views/splash/splash_page.dart'; -import 'package:car_customer_app/views/user/vertify_password_page.dart'; -import 'package:flutter/material.dart'; - -class AppRoutes { - //User - static const String splash = "/splash"; - static const String registerSelection = "/registerSelection"; - static const String loginVerifyAccount = "/loginVerifyAccount"; - static const String register = "/register"; - static const String forgetPassword = "/forgetPassword"; - static const String loginVerification = "/loginVerification"; - static const String loginWithPassword = "/loginWithPassword"; - static const String loginMethodSelection = "/loginMethodSelection"; - static const String completeProfile = "/completeProfile"; - static const String profile1 = "/profile1"; - static const String profile2 = "/profile2"; - static const String profile3 = "/profile3"; - static const String verifyPassword = "/vertifyPassword"; - static const String confirmNewPasswordPage = "/confirmNewPasswordPage"; - static const String defineLicense = "/defineLicese"; - static const String changePassword = "/changePassword"; - static const String forgetPasswordMethodPage = "/forgetPasswordMethodPage"; - static const String changeMobilePage = "/changeMobilePage"; - static const String changeEmailPage = "/changeEmailPage"; - static const String editAccountPage = "/editAccoundPage"; - - static const String dashboard = "/dashboard"; - - //settings - static const String dealershipSetting = "/dealershipSetting"; - static const String defineBranch = "/defineBranch"; - static const String createServices = "/createServices"; - - static const String initialRoute = splash; - - static final Map routes = { - //User - splash: (context) => const SplashPage(), - registerSelection: (context) => RegisterSelectionPage(), - loginVerifyAccount: (context) => LoginVerifyAccountPage(), - register: (context) => RegisterPage(), - forgetPassword: (context) => ForgetPasswordPage(), - loginVerification: (context) => const LoginVerificationPage(), - loginWithPassword: (context) => LoginWithPassword(), - loginMethodSelection: (context) => LoginMethodSelectionPage(ModalRoute.of(context)!.settings.arguments as String), - completeProfile: (context) => CompleteProfilePage(ModalRoute.of(context)!.settings.arguments as RegisterUserRespModel), - // profile1: (context) => Profile1Page(), - // profile2: (context) => Profile2Page(), - // profile3: (context) => Profile3Page(), - // defineLicense: (context) => DefineLicensePage(), - verifyPassword: (context) => VerifyPasswordPage(), - confirmNewPasswordPage: (context) => ConfirmNewPasswordPage(ModalRoute.of(context)!.settings.arguments as String), - changePassword: (context) => ChangePasswordPage(), - forgetPasswordMethodPage: (context) => ForgetPasswordMethodPage(ModalRoute.of(context)!.settings.arguments as String), - changeMobilePage: (context) => ChangeMobilePage(), - changeEmailPage : (context) => const ChangeEmailPage(), - editAccountPage : (context) => EditAccountPage(), - //Home page - dashboard: (context) => const DashboardPage(), - - //setting - // dealershipSetting: (context) => DealershipPage(), - // defineBranch: (context) => DefineBranchPage(), - // createServices: (context) => CreateServicesPage(), - }; -} diff --git a/lib/exceptions/api_exception.dart b/lib/exceptions/api_exception.dart deleted file mode 100644 index 9729795..0000000 --- a/lib/exceptions/api_exception.dart +++ /dev/null @@ -1,29 +0,0 @@ -import 'dart:convert'; - -import 'package:car_customer_app/api/api_client.dart'; - -class APIException implements Exception { - static const String BAD_REQUEST = 'api_common_bad_request'; - static const String UNAUTHORIZED = 'api_common_unauthorized'; - static const String FORBIDDEN = 'api_common_forbidden'; - static const String NOT_FOUND = 'api_common_not_found'; - static const String INTERNAL_SERVER_ERROR = 'api_common_internal_server_error'; - static const String UPGRADE_REQUIRED = 'api_common_upgrade_required'; - static const String BAD_RESPONSE_FORMAT = 'api_common_bad_response_format'; - static const String OTHER = 'api_common_http_error'; - static const String TIMEOUT = 'api_common_http_timeout'; - static const String UNKNOWN = 'unexpected_error'; - - final String message; - final APIError? error; - final arguments; - - const APIException(this.message, {this.arguments, this.error}); - - Map toJson() => {'message': message, 'error': error, 'arguments': '$arguments'}; - - @override - String toString() { - return jsonEncode(this); - } -} diff --git a/lib/extensions/int_extensions.dart b/lib/extensions/int_extensions.dart deleted file mode 100644 index 9b90b2f..0000000 --- a/lib/extensions/int_extensions.dart +++ /dev/null @@ -1,7 +0,0 @@ -import 'package:flutter/cupertino.dart'; - -extension IntExtensions on int { - Widget get height => SizedBox(height: toDouble()); - - Widget get width => SizedBox(width: toDouble()); -} diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart deleted file mode 100644 index 603d40f..0000000 --- a/lib/extensions/string_extensions.dart +++ /dev/null @@ -1,121 +0,0 @@ -import 'package:car_customer_app/theme/colors.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:intl/intl.dart'; - -extension EmailValidator on String { - Widget toText({Color? color, bool isBold = false, double? fontSize, bool isUnderLine = false, TextDecoration? textDecoration, double letterSpacing = -0.4, TextAlign? textAlign, double? height}) => - Text( - this, - textAlign: textAlign, - style: TextStyle( - height: height, - decoration: textDecoration ?? TextDecoration.none, - fontSize: fontSize ?? 10, - fontWeight: isBold ? FontWeight.bold : FontWeight.w600, - color: color ?? MyColors.darkTextColor, - letterSpacing: letterSpacing, - ), - ); - - // Widget toText12({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0}) => Text( - // this, - // textAlign: isCenter ? TextAlign.center : null, - // maxLines: (maxLine > 0) ? maxLine : null, - // style: TextStyle( - // fontSize: 12, - // fontWeight: isBold ? FontWeight.bold : FontWeight.w600, - // color: color ?? MyColors.darkTextColor, - // letterSpacing: -0.72, - // decoration: isUnderLine ? TextDecoration.underline : null), - // ); - - // Widget toText13({Color? color, bool isUnderLine = false}) => Text( - // this, - // style: TextStyle(fontSize: 13, fontWeight: FontWeight.w600, color: color ?? MyColors.darkTextColor, letterSpacing: -0.52, decoration: isUnderLine ? TextDecoration.underline : null), - // ); - - // Widget toText14({ - // Color? color, - // bool isBold = false, - // TextAlign? textAlign, - // }) => - // Text( - // this, - // textAlign: textAlign, - // style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 14, letterSpacing: -0.48, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), - // ); - - // Widget toText16({Color? color, bool isBold = false}) => Text( - // this, - // style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 16, letterSpacing: -0.64, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), - // ); - - // Widget toText17({Color? color, bool isBold = false}) => Text( - // this, - // style: TextStyle(color: color ?? MyColors.darkTextColor, fontSize: 17, letterSpacing: -0.68, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), - // ); - - // Widget toText20({Color? color, bool isBold = false}) => Text( - // this, - // style: TextStyle(height: 23 / 24, color: color ?? MyColors.darkTextColor, fontSize: 20, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), - // ); - - // Widget toText22({Color? color, bool isBold = false}) => Text( - // this, - // style: TextStyle(height: 1, color: color ?? MyColors.darkTextColor, fontSize: 22, letterSpacing: -1.44, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), - // ); - - // Widget toText24({Color? color, bool isBold = false}) => Text( - // this, - // style: TextStyle(height: 23 / 24, fontSize: 24, letterSpacing: -1.44, color: color ?? MyColors.darkTextColor, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), - // ); - - // Widget toText32({Color? color, bool isBold = false}) => Text( - // this, - // style: TextStyle(height: 32 / 32, color: color ?? MyColors.darkTextColor, fontSize: 32, letterSpacing: -1.92, fontWeight: isBold ? FontWeight.bold : FontWeight.w600), - // ); - - bool isValidEmail() { - return RegExp(r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$').hasMatch(this); - } - - bool isNum() { - return RegExp(r'^[0-9]+$').hasMatch(this); - } - - String toFormattedDate() { - String date = split("T")[0]; - String time = split("T")[1]; - var dates = date.split("-"); - return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}"; - } - - getMonth(int month) { - switch (month) { - case 1: - return "January"; - case 2: - return "February"; - case 3: - return "March"; - case 4: - return "April"; - case 5: - return "May"; - case 6: - return "June"; - case 7: - return "July"; - case 8: - return "August"; - case 9: - return "September"; - case 10: - return "October"; - case 11: - return "November"; - case 12: - return "December"; - } - } -} diff --git a/lib/extensions/widget_extensions.dart b/lib/extensions/widget_extensions.dart deleted file mode 100644 index 474cbee..0000000 --- a/lib/extensions/widget_extensions.dart +++ /dev/null @@ -1,10 +0,0 @@ -import 'package:flutter/material.dart'; - -extension WidgetExtensions on Widget { - Widget onPress(VoidCallback onTap) => InkWell(onTap: onTap, child: this); - - Widget paddingAll(double _value) => Padding(padding: EdgeInsets.all(_value), 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); -} diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart deleted file mode 100644 index 85fd4ca..0000000 --- a/lib/generated/codegen_loader.g.dart +++ /dev/null @@ -1,294 +0,0 @@ -// 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/main.dart b/lib/main.dart index 147c191..e053104 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -1,50 +1,77 @@ -import 'package:car_customer_app/classes/app_state.dart'; -import 'package:car_customer_app/config/dependencies.dart'; -import 'package:car_customer_app/models/post_params_model.dart'; -import 'package:car_customer_app/repositories/user_repo.dart'; -import 'package:car_customer_app/services/services.dart'; -import 'package:car_customer_app/theme/app_theme.dart'; -import 'package:car_customer_app/view_models/base_view_model.dart'; +import 'package:car_customer_app/config/customer_dependencies.dart'; +import 'package:car_customer_app/config/customer_routes.dart'; +import 'package:car_customer_app/repositories/provider_repo.dart'; +import 'package:car_customer_app/view_models/appointments_view_model.dart'; import 'package:car_customer_app/view_models/dashboard_view_model.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; +import 'package:car_customer_app/view_models/providers_view_model.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:sizer/sizer.dart'; +import 'package:mc_common_app/classes/app_state.dart'; +import 'package:mc_common_app/config/dependencies.dart'; +import 'package:mc_common_app/config/routes.dart'; +import 'package:mc_common_app/models/post_params_model.dart'; +import 'package:mc_common_app/repositories/ads_repo.dart'; +import 'package:mc_common_app/repositories/common_repo.dart'; +import 'package:mc_common_app/repositories/payments_repo.dart'; +import 'package:mc_common_app/repositories/user_repo.dart'; +import 'package:mc_common_app/services/common_services.dart'; +import 'package:mc_common_app/services/payments_service.dart'; +import 'package:mc_common_app/theme/app_theme.dart'; +import 'package:mc_common_app/utils/enums.dart'; +import 'package:mc_common_app/view_models/ad_view_model.dart'; +import 'package:mc_common_app/view_models/base_view_model.dart'; +import 'package:mc_common_app/view_models/payment_view_model.dart'; +import 'package:mc_common_app/view_models/user_view_model.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; import 'package:provider/single_child_widget.dart'; - -import 'config/routes.dart'; -import 'generated/codegen_loader.g.dart'; +import 'package:sizer/sizer.dart'; Future main() async { WidgetsFlutterBinding.ensureInitialized(); - AppDependencies.addDependencies(); + CustomerDependencies.addDependencies(); await EasyLocalization.ensureInitialized(); + CustomerAppRoutes.routes.addAll(AppRoutes.routes); + runApp( - EasyLocalization( - supportedLocales: const [Locale('ar', 'SA'), Locale('en', 'US')], - fallbackLocale: const Locale('en', 'US'), - startLocale: const Locale('en', 'US'), - assetLoader: const CodegenLoader(), - path: "assetsl/langs", - child: MultiProvider( - providers: [ - ChangeNotifierProvider( - create: (_) => BaseVM(), + MultiProvider( + providers: [ + ChangeNotifierProvider(create: (_) => BaseVM()), + ChangeNotifierProvider( + create: (_) => DashboardVM( + commonServices: injector.get(), + userRepo: injector.get(), + ), + ), + ChangeNotifierProvider( + create: (_) => UserVM(userRepo: injector.get()), + ), + ChangeNotifierProvider( + create: (_) => AdVM( + commonServices: injector.get(), + commonRepo: injector.get(), + adsRepo: injector.get(), ), - ChangeNotifierProvider( - create: (_) => DashboardVM( - userRepo: injector.get(), - commonServices: injector.get(), - ), + ), + ChangeNotifierProvider( + create: (_) => ProvidersVM( + commonServices: injector.get(), + commonRepo: injector.get(), + providerRepo: injector.get(), ), - ChangeNotifierProvider( - create: (_) => UserVM(userRepo: injector.get()), + ), + ChangeNotifierProvider( + create: (_) => AppointmentsVM( + commonServices: injector.get(), + commonRepo: injector.get(), ), - ], - child: const MyApp(), - ), - ), + ), + ChangeNotifierProvider( + create: (_) => PaymentVM(paymentService: injector.get(), paymentRepo: injector.get()), + ), + ], + child: const MyApp(), + ).setupLocale(), ); } @@ -61,19 +88,22 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { return Sizer( builder: (context, orientation, deviceType) { + injector.get().setAppType(AppType.customer); AppState().setPostParamsModel( PostParamsModel( languageID: EasyLocalization.of(context)?.locale.languageCode == "ar" ? 1 : 2, ), ); return MaterialApp( - theme: AppTheme.getTheme(EasyLocalization.of(context)?.locale.languageCode == "ar"), + theme: AppTheme.getTheme( + isArabic: EasyLocalization.of(context)?.locale.languageCode == "ar", + ), debugShowCheckedModeBanner: false, localizationsDelegates: context.localizationDelegates, supportedLocales: context.supportedLocales, locale: context.locale, initialRoute: AppRoutes.initialRoute, - routes: AppRoutes.routes, + routes: CustomerAppRoutes.routes, ); }, ); diff --git a/lib/models/account.dart b/lib/models/account.dart deleted file mode 100644 index 1cfb548..0000000 --- a/lib/models/account.dart +++ /dev/null @@ -1,44 +0,0 @@ -// To parse this JSON data, do -// -// final account = accountFromJson(jsonString); - -import 'dart:convert'; - -import 'package:car_customer_app/models/parent_list.dart'; - - - - -Account accountFromJson(String str) => Account.fromJson(json.decode(str)); - -String accountToJson(Account data) => json.encode(data.toJson()); - -class Account { - Account({ - required this.parentList, - required this.selectedItem, - }); - - List? parentList; - int selectedItem; - - factory Account.fromJson(Map json) => Account( - parentList: json["parentList"] == null - ? null - : List.from( - json["parentList"].map((x) => ParentList.fromJson(x))), - selectedItem: - json["selectedItem"] == null ? null : json["selectedItem"], - ); - - Map toJson() => { - "parentList": parentList == null - ? null - : List.from(parentList!.map((x) => x.toJson())), - "selectedItem": selectedItem == null ? null : selectedItem, - }; - - Map toJsonData() => { - "selectedItem": selectedItem == null ? null : selectedItem, - }; -} diff --git a/lib/models/config_model.dart b/lib/models/config_model.dart deleted file mode 100644 index 0245ede..0000000 --- a/lib/models/config_model.dart +++ /dev/null @@ -1,12 +0,0 @@ -class ConfigModel { - ConfigModel(this.endpoint, this.organizationName); - - String endpoint; - - String organizationName; - - factory ConfigModel.fromJson(Map json) => - ConfigModel("", ""); - -// Map toJson() => _$ConfigModelToJson(this); -} diff --git a/lib/models/content_info_model.dart b/lib/models/content_info_model.dart deleted file mode 100644 index 4eec746..0000000 --- a/lib/models/content_info_model.dart +++ /dev/null @@ -1,65 +0,0 @@ -class ContentInfoModel { - int? totalItemsCount; - int? statusCode; - String? message; - List? data; - - ContentInfoModel({this.totalItemsCount, this.statusCode, this.message, this.data}); - - ContentInfoModel.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - statusCode = json['statusCode']; - message = json['message']; - if (json['data'] != null) { - data = []; - json['data'].forEach((v) { - data?.add(new ContentInfoDataModel.fromJson(v)); - }); - } - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = this.totalItemsCount; - data['statusCode'] = this.statusCode; - data['message'] = this.message; - if (this.data != null) { - data['data'] = this.data?.map((v) => v.toJson()).toList(); - } - return data; - } -} - -class ContentInfoDataModel { - int? contentInfoId; - int? contentTypeId; - String? content; - String? contentTypeNameEn; - String? contentTypeNameAr; - String? fileName; - String? exposeFilePath; - - ContentInfoDataModel({this.contentInfoId, this.contentTypeId, this.content, this.contentTypeNameEn, this.contentTypeNameAr, this.fileName, this.exposeFilePath}); - - ContentInfoDataModel.fromJson(Map json) { - contentInfoId = json['contentInfoId']; - contentTypeId = json['contentTypeId']; - content = json['content']; - contentTypeNameEn = json['contentTypeNameEn']; - contentTypeNameAr = json['contentTypeNameAr']; - fileName = json['fileName']; - exposeFilePath = json['exposeFilePath']; - } - - Map toJson() { - final Map data = new Map(); - data['contentInfoId'] = this.contentInfoId; - data['contentTypeId'] = this.contentTypeId; - data['content'] = this.content; - data['contentTypeNameEn'] = this.contentTypeNameEn; - data['contentTypeNameAr'] = this.contentTypeNameAr; - data['fileName'] = this.fileName; - data['exposeFilePath'] = this.exposeFilePath; - return data; - } -} diff --git a/lib/models/m_response.dart b/lib/models/m_response.dart deleted file mode 100644 index 5926e33..0000000 --- a/lib/models/m_response.dart +++ /dev/null @@ -1,33 +0,0 @@ -// To parse this JSON data, do -// -// final mResponse = mResponseFromJson(jsonString); - -import 'dart:convert'; - -MResponse mResponseFromJson(String str) => MResponse.fromJson(json.decode(str)); - -String mResponseToJson(MResponse data) => json.encode(data.toJson()); - -class MResponse { - MResponse({ - this.totalItemsCount, - this.messageStatus, - this.message, - }); - - int? totalItemsCount; - int? messageStatus; - String? message; - - factory MResponse.fromJson(Map json) => MResponse( - totalItemsCount: json["totalItemsCount"], - messageStatus: json["messageStatus"], - message: json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount, - "messageStatus": messageStatus, - "message": message, - }; -} diff --git a/lib/models/member_model.dart b/lib/models/member_model.dart deleted file mode 100644 index d968827..0000000 --- a/lib/models/member_model.dart +++ /dev/null @@ -1,62 +0,0 @@ -class MemberModel { - int? totalItemsCount; - int? statusCode; - String? message; - List? data; - - MemberModel({this.totalItemsCount, this.statusCode, this.message, this.data}); - - MemberModel.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - statusCode = json['statusCode']; - message = json['message']; - if (json['data'] != null) { - data = []; - json['data'].forEach((v) { - data?.add(new MemberDataModel.fromJson(v)); - }); - } - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = this.totalItemsCount; - data['statusCode'] = this.statusCode; - data['message'] = this.message; - if (this.data != null) { - data['data'] = this.data?.map((v) => v.toJson()).toList(); - } - return data; - } -} - -class MemberDataModel { - int? committeeId; - String? firstName; - String? lastName; - String? description; - String? picture; - int? orderNo; - - MemberDataModel({this.committeeId, this.firstName, this.lastName, this.description, this.picture, this.orderNo}); - - MemberDataModel.fromJson(Map json) { - committeeId = json['committeeId']; - firstName = json['firstName']; - lastName = json['lastName']; - description = json['description']; - picture = json['picture']; - orderNo = json['orderNo']; - } - - Map toJson() { - final Map data = new Map(); - data['committeeId'] = this.committeeId; - data['firstName'] = this.firstName; - data['lastName'] = this.lastName; - data['description'] = this.description; - data['picture'] = this.picture; - data['orderNo'] = this.orderNo; - return data; - } -} diff --git a/lib/models/parent_list.dart b/lib/models/parent_list.dart deleted file mode 100644 index 3f2286f..0000000 --- a/lib/models/parent_list.dart +++ /dev/null @@ -1,26 +0,0 @@ -class ParentList { - ParentList({ - required this.dbId, - required this.text, - required this.path, - required this.isSelected, - }); - - int dbId; - String text; - String path; - bool isSelected; - - factory ParentList.fromJson(Map json) => ParentList( - dbId: json["dbId"] == null ? null : json["dbId"], - text: json["text"] == null ? null : json["text"], - path: json["path"] == null ? null : json["path"], - isSelected: false, - ); - - Map toJson() => { - "dbId": dbId == null ? null : dbId, - "text": text == null ? null : text, - "path": path == null ? null : path, - }; -} diff --git a/lib/models/post_params_model.dart b/lib/models/post_params_model.dart deleted file mode 100644 index 780210b..0000000 --- a/lib/models/post_params_model.dart +++ /dev/null @@ -1,35 +0,0 @@ - -class PostParamsModel { - double? versionID; - int? channel; - int? languageID; - String? mobileType; - String? logInTokenID; - String? tokenID; - - PostParamsModel({this.versionID, this.channel, this.languageID, this.mobileType, this.logInTokenID, this.tokenID}); - - PostParamsModel.fromJson(Map json) { - versionID = json['VersionID']; - channel = json['Channel']; - languageID = json['LanguageID']; - mobileType = json['MobileType']; - logInTokenID = json['LogInTokenID']; - tokenID = json['TokenID']; - } - - Map toJson() { - final Map data = new Map(); - data['VersionID'] = this.versionID; - data['Channel'] = this.channel; - data['LanguageID'] = this.languageID; - data['MobileType'] = this.mobileType; - data['LogInTokenID'] = this.logInTokenID; - data['TokenID'] = this.tokenID; - return data; - } - - set setLogInTokenID(String? token) => logInTokenID = token; - - set setTokenID(String? token) => tokenID = token; -} diff --git a/lib/models/profile/branch.dart b/lib/models/profile/branch.dart deleted file mode 100644 index cc7d68a..0000000 --- a/lib/models/profile/branch.dart +++ /dev/null @@ -1,85 +0,0 @@ -// To parse this JSON data, do -// -// final branch = branchFromJson(jsonString); - -import 'dart:convert'; - -Branch branchFromJson(String str) => Branch.fromJson(json.decode(str)); - -String branchToJson(Branch data) => json.encode(data.toJson()); - -class Branch { - Branch({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - int? totalItemsCount; - List? data; - int? messageStatus; - String? message; - - factory Branch.fromJson(Map json) => Branch( - totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"], - data: json["data"] == null ? null : List.from(json["data"].map((x) => BranchData.fromJson(x))), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount == null ? null : totalItemsCount, - "data": data == null ? null : List.from(data!.map((x) => x.toJson())), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} - -class BranchData { - BranchData({ - this.id, - this.serviceProviderId, - this.branchName, - this.branchDescription, - this.cityId, - this.address, - this.latitude, - this.longitude, - this.status, - }); - - int? id; - int? serviceProviderId; - String? branchName; - String? branchDescription; - int? cityId; - String? address; - String? latitude; - String? longitude; - int? status; - - factory BranchData.fromJson(Map json) => BranchData( - id: json["id"] == null ? null : json["id"], - serviceProviderId: json["serviceProviderID"] == null ? null : json["serviceProviderID"], - branchName: json["branchName"] == null ? null : json["branchName"], - branchDescription: json["branchDescription"] == null ? null : json["branchDescription"], - cityId: json["cityID"] == null ? null : json["cityID"], - address: json["address"] == null ? null : json["address"], - latitude: json["latitude"] == null ? null : json["latitude"], - longitude: json["longitude"] == null ? null : json["longitude"], - status: json["status"] == null ? null : json["status"], - ); - - Map toJson() => { - "id": id == null ? null : id, - "serviceProviderID": serviceProviderId == null ? null : serviceProviderId, - "branchName": branchName == null ? null : branchName, - "branchDescription": branchDescription == null ? null : branchDescription, - "cityID": cityId == null ? null : cityId, - "address": address == null ? null : address, - "latitude": latitude == null ? null : latitude, - "longitude": longitude == null ? null : longitude, - "status": status == null ? null : status, - }; -} diff --git a/lib/models/profile/categroy.dart b/lib/models/profile/categroy.dart deleted file mode 100644 index 6f566f1..0000000 --- a/lib/models/profile/categroy.dart +++ /dev/null @@ -1,69 +0,0 @@ -// To parse this JSON data, do -// -// final category = categoryFromJson(jsonString); - -import 'dart:convert'; - -Category categoryFromJson(String str) => Category.fromJson(json.decode(str)); - -String categoryToJson(Category data) => json.encode(data.toJson()); - -class Category { - Category({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - int? totalItemsCount; - List? data; - int? messageStatus; - String? message; - - factory Category.fromJson(Map json) => Category( - totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"], - data: json["data"] == null ? null : List.from(json["data"].map((x) => CategoryData.fromJson(x))), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount == null ? null : totalItemsCount, - "data": data == null ? null : List.from(data!.map((x) => x.toJson())), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} - -class CategoryData { - CategoryData({ - this.id, - this.categoryName, - this.categoryNameN, - this.serviceCategoryIconUrl, - this.serviceCategoryImageUrl, - }); - - int? id; - String? categoryName; - String? categoryNameN; - dynamic? serviceCategoryIconUrl; - dynamic? serviceCategoryImageUrl; - - factory CategoryData.fromJson(Map json) => CategoryData( - id: json["id"] == null ? null : json["id"], - categoryName: json["categoryName"] == null ? null : json["categoryName"], - categoryNameN: json["categoryNameN"] == null ? null : json["categoryNameN"], - serviceCategoryIconUrl: json["serviceCategoryIconUrl"], - serviceCategoryImageUrl: json["serviceCategoryImageUrl"], - ); - - Map toJson() => { - "id": id == null ? null : id, - "categoryName": categoryName == null ? null : categoryName, - "categoryNameN": categoryNameN == null ? null : categoryNameN, - "serviceCategoryIconUrl": serviceCategoryIconUrl, - "serviceCategoryImageUrl": serviceCategoryImageUrl, - }; -} diff --git a/lib/models/profile/document.dart b/lib/models/profile/document.dart deleted file mode 100644 index da082b3..0000000 --- a/lib/models/profile/document.dart +++ /dev/null @@ -1,83 +0,0 @@ -// To parse this JSON data, do -// -// final document = documentFromJson(jsonString); - -import 'dart:convert'; - -Document documentFromJson(String str) => Document.fromJson(json.decode(str)); - -String documentToJson(Document data) => json.encode(data.toJson()); - -class Document { - Document({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - int? totalItemsCount; - List? data; - int? messageStatus; - String? message; - - factory Document.fromJson(Map json) => Document( - totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"], - data: json["data"] == null ? null : List.from(json["data"].map((x) => DocumentData.fromJson(x))), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount == null ? null : totalItemsCount, - "data": data == null ? null : List.from(data!.map((x) => x.toJson())), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} - -class DocumentData { - DocumentData({ - this.id, - this.serviceProviderId, - this.documentId, - this.documentUrl, - this.status, - this.comment, - this.isActive, - this.document, - this.fileExt, - }); - - int? id; - int? serviceProviderId; - int? documentId; - dynamic? documentUrl; - int? status; - dynamic? comment; - bool? isActive; - String? document; - String? fileExt; - - factory DocumentData.fromJson(Map json) => DocumentData( - id: json["id"] == null ? null : json["id"], - serviceProviderId: json["serviceProviderID"] == null ? null : json["serviceProviderID"], - documentId: json["documentID"] == null ? null : json["documentID"], - documentUrl: json["documentURL"], - status: json["status"] == null ? null : json["status"], - comment: json["comment"], - isActive: json["isActive"] == null ? null : json["isActive"], - document: null, - fileExt: null, - ); - - Map toJson() => { - "id": id == null ? null : id, - "serviceProviderID": serviceProviderId == null ? null : serviceProviderId, - "documentID": documentId == null ? null : documentId, - "documentURL": documentUrl, - "status": status == null ? null : status, - "comment": comment, - "isActive": isActive == null ? null : isActive, - }; -} diff --git a/lib/models/profile/services.dart b/lib/models/profile/services.dart deleted file mode 100644 index d296300..0000000 --- a/lib/models/profile/services.dart +++ /dev/null @@ -1,80 +0,0 @@ -// To parse this JSON data, do -// -// final services = servicesFromJson(jsonString); - -import 'dart:convert'; - -Services servicesFromJson(String str) => Services.fromJson(json.decode(str)); - -String servicesToJson(Services data) => json.encode(data.toJson()); - -class Services { - Services({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - int? totalItemsCount; - List? data; - int? messageStatus; - String? message; - - factory Services.fromJson(Map json) => Services( - totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"], - data: json["data"] == null ? null : List.from(json["data"].map((x) => ServicesData.fromJson(x))), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount == null ? null : totalItemsCount, - "data": data == null ? null : List.from(data!.map((x) => x.toJson())), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} - -class ServicesData { - ServicesData({ - this.id, - this.description, - this.descriptionN, - this.serviceIconUrl, - this.serviceImageUrl, - this.serviceCategoryId, - this.categoryName, - this.isSelected, - }); - - int? id; - String? description; - String? descriptionN; - dynamic? serviceIconUrl; - dynamic? serviceImageUrl; - int? serviceCategoryId; - dynamic? categoryName; - bool? isSelected; - - factory ServicesData.fromJson(Map json) => ServicesData( - id: json["id"] == null ? null : json["id"], - description: json["description"] == null ? null : json["description"], - descriptionN: json["descriptionN"] == null ? null : json["descriptionN"], - serviceIconUrl: json["serviceIconUrl"], - serviceImageUrl: json["serviceImageUrl"], - serviceCategoryId: json["serviceCategoryID"] == null ? null : json["serviceCategoryID"], - categoryName: json["categoryName"], - isSelected: false, - ); - - Map toJson() => { - "id": id == null ? null : id, - "description": description == null ? null : description, - "descriptionN": descriptionN == null ? null : descriptionN, - "serviceIconUrl": serviceIconUrl, - "serviceImageUrl": serviceImageUrl, - "serviceCategoryID": serviceCategoryId == null ? null : serviceCategoryId, - "categoryName": categoryName, - }; -} diff --git a/lib/models/response_models.dart b/lib/models/response_models.dart deleted file mode 100644 index 872893b..0000000 --- a/lib/models/response_models.dart +++ /dev/null @@ -1,34 +0,0 @@ -/// -/// This example was taken from -/// https://flutter.dev/docs/development/data-and-backend/json -/// - -/// This allows the `User` class to access private members in -/// the generated file. The value for this is *.g.dart, where -/// the star denotes the source file name. - -/// An annotation for the code generator to know that this class needs the -/// JSON serialization logic to be generated. - -class BackendResponse { - BackendResponse({required this.id, required this.isOk, required this.result}); - - int id; - bool isOk; - dynamic result; - - /// A necessary factory constructor for creating a new User instance - /// from a map. Pass the map to the generated `_$UserFromJson()` constructor. - /// The constructor is named after the source class, in this case, User. - factory BackendResponse.fromJson(Map json) => - BackendResponse( - id: 1, - isOk: false, - result: null, - ); -// -// /// `toJson` is the convention for a class to declare support for serialization -// /// to JSON. The implementation simply calls the private, generated -// /// helper method `_$UserToJson`. -// Map toJson() => _$BackendResponseToJson(this); -} diff --git a/lib/models/surah_model.dart b/lib/models/surah_model.dart deleted file mode 100644 index acc171a..0000000 --- a/lib/models/surah_model.dart +++ /dev/null @@ -1,74 +0,0 @@ -class SurahModel { - int? totalItemsCount; - int? statusCode; - String? message; - List? data; - - SurahModel({this.totalItemsCount, this.statusCode, this.message, this.data}); - - SurahModel.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - statusCode = json['statusCode']; - message = json['message']; - if (json['data'] != null) { - data = []; - json['data'].forEach((v) { - data?.add(SurahModelData.fromJson(v)); - }); - } - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = totalItemsCount; - data['statusCode'] = statusCode; - data['message'] = message; - if (this.data != null) { - data['data'] = this.data?.map((v) => v.toJson()).toList(); - } - return data; - } -} - -class SurahModelData { - int? id; - int? surahID; - String? nameAR; - String? nameEN; - int? numberOfAyahs; - String? englishNameTranslation; - int? revelationID; - String? revelationType; - int? startPageNo; - int? endPageNo; - - SurahModelData({this.id, this.surahID, this.nameAR, this.nameEN, this.numberOfAyahs, this.englishNameTranslation, this.revelationID, this.revelationType, this.startPageNo, this.endPageNo}); - - SurahModelData.fromJson(Map json) { - id = json['id']; - surahID = json['surahID']; - nameAR = json['nameAR']; - nameEN = json['nameEN']; - numberOfAyahs = json['numberOfAyahs']; - englishNameTranslation = json['englishNameTranslation']; - revelationID = json['revelation_ID']; - revelationType = json['revelationType']; - startPageNo = json['startPageNo']; - endPageNo = json['endPageNo']; - } - - Map toJson() { - final Map data = new Map(); - data['id'] = this.id; - data['surahID'] = this.surahID; - data['nameAR'] = this.nameAR; - data['nameEN'] = this.nameEN; - data['numberOfAyahs'] = this.numberOfAyahs; - data['englishNameTranslation'] = this.englishNameTranslation; - data['revelation_ID'] = this.revelationID; - data['revelationType'] = this.revelationType; - data['startPageNo'] = this.startPageNo; - data['endPageNo'] = this.endPageNo; - return data; - } -} diff --git a/lib/models/user/basic_otp.dart b/lib/models/user/basic_otp.dart deleted file mode 100644 index bfa6d23..0000000 --- a/lib/models/user/basic_otp.dart +++ /dev/null @@ -1,61 +0,0 @@ -// To parse this JSON data, do -// -// final basicOtp = basicOtpFromJson(jsonString); - -import 'dart:convert'; - -BasicOtpRespModel basicOtpFromJson(String str) => BasicOtpRespModel.fromJson(json.decode(str)); - -String basicOtpToJson(BasicOtpRespModel data) => json.encode(data.toJson()); - -class BasicOtpRespModel { - BasicOtpRespModel({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - dynamic totalItemsCount; - Data? data; - int? messageStatus; - String? message; - - factory BasicOtpRespModel.fromJson(Map json) => BasicOtpRespModel( - totalItemsCount: json["totalItemsCount"], - data: json["data"] == null ? null : Data.fromJson(json["data"]), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount, - "data": data == null ? null : data!.toJson(), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} - -class Data { - Data({ - this.userToken, - }); - - String? userToken; - - factory Data.fromJson(Map json) => Data( - userToken: checkValue(json), - ); - - static String checkValue(Map json) { - try { - return json["userToken"] == null ? null : json["userToken"]; - } catch (e) { - return json["token"] == null ? null : json["token"]; - } - } - - Map toJson() => { - "userToken": userToken == null ? null : userToken, - }; -} diff --git a/lib/models/user/change_email.dart b/lib/models/user/change_email.dart deleted file mode 100644 index 3e5d800..0000000 --- a/lib/models/user/change_email.dart +++ /dev/null @@ -1,51 +0,0 @@ - - -import 'dart:convert'; - -ChanEmailRespModel changeEmailFromJson(String str) => ChanEmailRespModel.fromJson(json.decode(str)); - -String changeEmailToJson(ChanEmailRespModel data) => json.encode(data.toJson()); - -class ChanEmailRespModel { - int? messageStatus; - Null? totalItemsCount; - Data? data; - String? message; - - ChanEmailRespModel( - {this.messageStatus, this.totalItemsCount, this.data, this.message}); - - ChanEmailRespModel.fromJson(Map json) { - messageStatus = json['messageStatus']; - totalItemsCount = json['totalItemsCount']; - data = json['data'] != null ? new Data.fromJson(json['data']) : null; - message = json['message']; - } - - Map toJson() { - final Map data = new Map(); - data['messageStatus'] = this.messageStatus; - data['totalItemsCount'] = this.totalItemsCount; - if (this.data != null) { - data['data'] = this.data!.toJson(); - } - data['message'] = this.message; - return data; - } -} - -class Data { - String? userToken; - - Data({this.userToken}); - - Data.fromJson(Map json) { - userToken = json['userToken']; - } - - Map toJson() { - final Map data = new Map(); - data['userToken'] = this.userToken; - return data; - } -} \ No newline at end of file diff --git a/lib/models/user/change_mobile.dart b/lib/models/user/change_mobile.dart deleted file mode 100644 index 4a3f7e0..0000000 --- a/lib/models/user/change_mobile.dart +++ /dev/null @@ -1,51 +0,0 @@ - - -import 'dart:convert'; - -ChangeMobileRespModel changeMobileFromJson(String str) => ChangeMobileRespModel.fromJson(json.decode(str)); - -String changeMobileToJson(ChangeMobileRespModel data) => json.encode(data.toJson()); - -class ChangeMobileRespModel { - int? messageStatus; - Null? totalItemsCount; - Data? data; - String? message; - - ChangeMobileRespModel( - {this.messageStatus, this.totalItemsCount, this.data, this.message}); - - ChangeMobileRespModel.fromJson(Map json) { - messageStatus = json['messageStatus']; - totalItemsCount = json['totalItemsCount']; - data = json['data'] != null ? new Data.fromJson(json['data']) : null; - message = json['message']; - } - - Map toJson() { - final Map data = new Map(); - data['messageStatus'] = this.messageStatus; - data['totalItemsCount'] = this.totalItemsCount; - if (this.data != null) { - data['data'] = this.data!.toJson(); - } - data['message'] = this.message; - return data; - } -} - -class Data { - String? userToken; - - Data({this.userToken}); - - Data.fromJson(Map json) { - userToken = json['userToken']; - } - - Map toJson() { - final Map data = new Map(); - data['userToken'] = this.userToken; - return data; - } -} \ No newline at end of file diff --git a/lib/models/user/change_password.dart b/lib/models/user/change_password.dart deleted file mode 100644 index fc74d4b..0000000 --- a/lib/models/user/change_password.dart +++ /dev/null @@ -1,34 +0,0 @@ - - - -import 'dart:convert'; - -ChangePassword changePasswordFromJson(String str) => ChangePassword.fromJson(json.decode(str)); - -String changePasswordToJson(ChangePassword data) => json.encode(data.toJson()); - -class ChangePassword { - int? messageStatus; - Null? totalItemsCount; - bool? data; - String? message; - - ChangePassword( - {this.messageStatus, this.totalItemsCount, this.data, this.message}); - - ChangePassword.fromJson(Map json) { - messageStatus = json['messageStatus']; - totalItemsCount = json['totalItemsCount']; - data = json['data']; - message = json['message']; - } - - Map toJson() { - final Map data = new Map(); - data['messageStatus'] = this.messageStatus; - data['totalItemsCount'] = this.totalItemsCount; - data['data'] = this.data; - data['message'] = this.message; - return data; - } -} \ No newline at end of file diff --git a/lib/models/user/cities.dart b/lib/models/user/cities.dart deleted file mode 100644 index 5c32405..0000000 --- a/lib/models/user/cities.dart +++ /dev/null @@ -1,65 +0,0 @@ -// To parse this JSON data, do -// -// final cities = citiesFromJson(jsonString); - -import 'dart:convert'; - -Cities citiesFromJson(String str) => Cities.fromJson(json.decode(str)); - -String citiesToJson(Cities data) => json.encode(data.toJson()); - -class Cities { - Cities({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - int? totalItemsCount; - List? data; - int? messageStatus; - String? message; - - factory Cities.fromJson(Map json) => Cities( - totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"], - data: json["data"] == null ? null : List.from(json["data"].map((x) => CityData.fromJson(x))), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount == null ? null : totalItemsCount, - "data": data == null ? null : List.from(data!.map((x) => x.toJson())), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} - -class CityData { - CityData({ - this.id, - this.cityName, - this.cityNameN, - this.countryId, - }); - - int? id; - String? cityName; - String? cityNameN; - int? countryId; - - factory CityData.fromJson(Map json) => CityData( - id: json["id"] == null ? null : json["id"], - cityName: json["cityName"] == null ? null : json["cityName"], - cityNameN: json["cityNameN"] == null ? null : json["cityNameN"], - countryId: json["countryID"] == null ? null : json["countryID"], - ); - - Map toJson() => { - "id": id == null ? null : id, - "cityName": cityName == null ? null : cityName, - "cityNameN": cityNameN == null ? null : cityNameN, - "countryID": countryId == null ? null : countryId, - }; -} diff --git a/lib/models/user/confirm_email.dart b/lib/models/user/confirm_email.dart deleted file mode 100644 index 0292c8c..0000000 --- a/lib/models/user/confirm_email.dart +++ /dev/null @@ -1,51 +0,0 @@ - - -import 'dart:convert'; - -ConfirmEmailRespModel confirmEmailFromJson(String str) => ConfirmEmailRespModel.fromJson(json.decode(str)); - -String confirmEmailToJson(ConfirmEmailRespModel data) => json.encode(data.toJson()); - -class ConfirmEmailRespModel { - int? messageStatus; - Null? totalItemsCount; - Data? data; - String? message; - - ConfirmEmailRespModel( - {this.messageStatus, this.totalItemsCount, this.data, this.message}); - - ConfirmEmailRespModel.fromJson(Map json) { - messageStatus = json['messageStatus']; - totalItemsCount = json['totalItemsCount']; - data = json['data'] != null ? new Data.fromJson(json['data']) : null; - message = json['message']; - } - - Map toJson() { - final Map data = new Map(); - data['messageStatus'] = this.messageStatus; - data['totalItemsCount'] = this.totalItemsCount; - if (this.data != null) { - data['data'] = this.data!.toJson(); - } - data['message'] = this.message; - return data; - } -} - -class Data { - String? userID; - - Data({this.userID}); - - Data.fromJson(Map json) { - userID = json['userID']; - } - - Map toJson() { - final Map data = new Map(); - data['userID'] = this.userID; - return data; - } -} \ No newline at end of file diff --git a/lib/models/user/confirm_mobile.dart b/lib/models/user/confirm_mobile.dart deleted file mode 100644 index 412e822..0000000 --- a/lib/models/user/confirm_mobile.dart +++ /dev/null @@ -1,53 +0,0 @@ - - - -import 'dart:convert'; - -ConfirmMobileRespModel confirmMobileFromJson(String str) => ConfirmMobileRespModel.fromJson(json.decode(str)); - -String confirmMobileToJson(ConfirmMobileRespModel data) => json.encode(data.toJson()); - - -class ConfirmMobileRespModel { - int? messageStatus; - Null? totalItemsCount; - Data? data; - String? message; - - ConfirmMobileRespModel( - {this.messageStatus, this.totalItemsCount, this.data, this.message}); - - ConfirmMobileRespModel.fromJson(Map json) { - messageStatus = json['messageStatus']; - totalItemsCount = json['totalItemsCount']; - data = json['data'] != null ? new Data.fromJson(json['data']) : null; - message = json['message']; - } - - Map toJson() { - final Map data = new Map(); - data['messageStatus'] = this.messageStatus; - data['totalItemsCount'] = this.totalItemsCount; - if (this.data != null) { - data['data'] = this.data!.toJson(); - } - data['message'] = this.message; - return data; - } -} - -class Data { - String? userID; - - Data({this.userID}); - - Data.fromJson(Map json) { - userID = json['userID']; - } - - Map toJson() { - final Map data = new Map(); - data['userID'] = this.userID; - return data; - } -} \ No newline at end of file diff --git a/lib/models/user/confirm_password.dart b/lib/models/user/confirm_password.dart deleted file mode 100644 index 53ab3ea..0000000 --- a/lib/models/user/confirm_password.dart +++ /dev/null @@ -1,30 +0,0 @@ - -import 'dart:convert'; - -ConfirmPasswordRespModel confirmPasswordFromJson(String str) => ConfirmPasswordRespModel.fromJson(json.decode(str)); - -String confirmPasswordToJson(ConfirmPasswordRespModel data) => json.encode(data.toJson()); - -class ConfirmPasswordRespModel { - dynamic totalItemsCount; - int? messageStatus; - String? message; - - ConfirmPasswordRespModel( - {this.totalItemsCount, this.messageStatus, this.message}); - - ConfirmPasswordRespModel.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - messageStatus = json['messageStatus']; - message = json['message']; - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = this.totalItemsCount; - data['messageStatus'] = this.messageStatus; - data['message'] = this.message; - return data; - } -} - diff --git a/lib/models/user/country.dart b/lib/models/user/country.dart deleted file mode 100644 index f4036cf..0000000 --- a/lib/models/user/country.dart +++ /dev/null @@ -1,81 +0,0 @@ -// To parse this JSON data, do -// -// final country = countryFromJson(jsonString); - -import 'dart:convert'; - -Country countryFromJson(String str) => Country.fromJson(json.decode(str)); - -String countryToJson(Country data) => json.encode(data.toJson()); - -class Country { - Country({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - int? totalItemsCount; - List? data; - int? messageStatus; - String? message; - - factory Country.fromJson(Map json) => Country( - totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"], - data: json["data"] == null ? null : List.from(json["data"].map((x) => CountryData.fromJson(x))), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount == null ? null : totalItemsCount, - "data": data == null ? null : List.from(data!.map((x) => x.toJson())), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} - -class CountryData { - CountryData({ - this.id, - this.countryName, - this.countryNameN, - this.nationality, - this.nationalityN, - this.countryCode, - this.alpha2Code, - this.alpha3Code, - }); - - int? id; - String? countryName; - String? countryNameN; - String? nationality; - String? nationalityN; - String? countryCode; - String? alpha2Code; - String? alpha3Code; - - factory CountryData.fromJson(Map json) => CountryData( - id: json["id"] == null ? null : json["id"], - countryName: json["countryName"] == null ? null : json["countryName"], - countryNameN: json["countryNameN"] == null ? null : json["countryNameN"], - nationality: json["nationality"] == null ? null : json["nationality"], - nationalityN: json["nationalityN"] == null ? null : json["nationalityN"], - countryCode: json["countryCode"] == null ? null : json["countryCode"], - alpha2Code: json["alpha2Code"] == null ? null : json["alpha2Code"], - alpha3Code: json["alpha3Code"] == null ? null : json["alpha3Code"], - ); - - Map toJson() => { - "id": id == null ? null : id, - "countryName": countryName == null ? null : countryName, - "countryNameN": countryNameN == null ? null : countryNameN, - "nationality": nationality == null ? null : nationality, - "nationalityN": nationalityN == null ? null : nationalityN, - "countryCode": countryCode == null ? null : countryCode, - "alpha2Code": alpha2Code == null ? null : alpha2Code, - "alpha3Code": alpha3Code == null ? null : alpha3Code, - }; -} diff --git a/lib/models/user/email_verify.dart b/lib/models/user/email_verify.dart deleted file mode 100644 index d39c963..0000000 --- a/lib/models/user/email_verify.dart +++ /dev/null @@ -1,52 +0,0 @@ - - -import 'dart:convert'; - -VerifyEmail verifyEmailFromJson(String str) => VerifyEmail.fromJson(json.decode(str)); - -String verifyEmailToJson(VerifyEmail data) => json.encode(data.toJson()); - - -class VerifyEmail { - Null? totalItemsCount; - Data? data; - int? messageStatus; - String? message; - - VerifyEmail( - {this.totalItemsCount, this.data, this.messageStatus, this.message}); - - VerifyEmail.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - data = json['data'] != null ? new Data.fromJson(json['data']) : null; - messageStatus = json['messageStatus']; - message = json['message']; - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = this.totalItemsCount; - if (this.data != null) { - data['data'] = this.data!.toJson(); - } - data['messageStatus'] = this.messageStatus; - data['message'] = this.message; - return data; - } -} - -class Data { - String? userToken; - - Data({this.userToken}); - - Data.fromJson(Map json) { - userToken = json['userToken']; - } - - Map toJson() { - final Map data = new Map(); - data['userToken'] = this.userToken; - return data; - } -} \ No newline at end of file diff --git a/lib/models/user/email_verify_otp.dart b/lib/models/user/email_verify_otp.dart deleted file mode 100644 index eea8503..0000000 --- a/lib/models/user/email_verify_otp.dart +++ /dev/null @@ -1,26 +0,0 @@ - - -import 'dart:convert'; - -VerifyEmailOTP verifyEmailOTPFromJson(String str) => VerifyEmailOTP.fromJson(json.decode(str)); - -String verifyEmailOTPToJson(VerifyEmailOTP data) => json.encode(data.toJson()); - -class VerifyEmailOTP { - bool? success; - Null? errors; - - VerifyEmailOTP({this.success, this.errors}); - - VerifyEmailOTP.fromJson(Map json) { - success = json['success']; - errors = json['errors']; - } - - Map toJson() { - final Map data = new Map(); - data['success'] = this.success; - data['errors'] = this.errors; - return data; - } -} \ No newline at end of file diff --git a/lib/models/user/forget_password_otp_compare.dart b/lib/models/user/forget_password_otp_compare.dart deleted file mode 100644 index d234a79..0000000 --- a/lib/models/user/forget_password_otp_compare.dart +++ /dev/null @@ -1,48 +0,0 @@ -import 'dart:convert'; - -PasswordOTPCompareResModel otpCompareFromJson(String str) => PasswordOTPCompareResModel.fromJson(json.decode(str)); - -String otpCompareToJson(PasswordOTPCompareResModel data) => json.encode(data.toJson()); - -class PasswordOTPCompareResModel { - dynamic totalItemsCount; - Data? data; - int? messageStatus; - String? message; - - PasswordOTPCompareResModel({this.totalItemsCount, this.data, this.messageStatus, this.message}); - - PasswordOTPCompareResModel.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - data = json['data'] != null ? new Data.fromJson(json['data']) : null; - messageStatus = json['messageStatus']; - message = json['message']; - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = this.totalItemsCount; - if (this.data != null) { - data['data'] = this.data!.toJson(); - } - data['messageStatus'] = this.messageStatus; - data['message'] = this.message; - return data; - } -} - -class Data { - String? userToken; - - Data({this.userToken}); - - Data.fromJson(Map json) { - userToken = json['userToken']; - } - - Map toJson() { - final Map data = new Map(); - data['userToken'] = this.userToken; - return data; - } -} diff --git a/lib/models/user/forget_password_otp_request.dart b/lib/models/user/forget_password_otp_request.dart deleted file mode 100644 index 2755978..0000000 --- a/lib/models/user/forget_password_otp_request.dart +++ /dev/null @@ -1,50 +0,0 @@ - -import 'dart:convert'; - -PasswordOTPRequestRespModel otpRequestFromJson(String str) => PasswordOTPRequestRespModel.fromJson(json.decode(str)); - -String otpRequestToJson(PasswordOTPRequestRespModel data) => json.encode(data.toJson()); - -class PasswordOTPRequestRespModel { - dynamic totalItemsCount; - Data? data; - int? messageStatus; - String? message; - - PasswordOTPRequestRespModel( - {this.totalItemsCount, this.data, this.messageStatus, this.message}); - - PasswordOTPRequestRespModel.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - data = json['data'] != null ? new Data.fromJson(json['data']) : null; - messageStatus = json['messageStatus']; - message = json['message']; - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = this.totalItemsCount; - if (this.data != null) { - data['data'] = this.data!.toJson(); - } - data['messageStatus'] = this.messageStatus; - data['message'] = this.message; - return data; - } -} - -class Data { - String? userToken; - - Data({this.userToken}); - - Data.fromJson(Map json) { - userToken = json['userToken']; - } - - Map toJson() { - final Map data = new Map(); - data['userToken'] = this.userToken; - return data; - } -} \ No newline at end of file diff --git a/lib/models/user/image_response.dart b/lib/models/user/image_response.dart deleted file mode 100644 index 6ca0b41..0000000 --- a/lib/models/user/image_response.dart +++ /dev/null @@ -1,37 +0,0 @@ -// To parse this JSON data, do -// -// final imageResponse = imageResponseFromJson(jsonString); - -import 'dart:convert'; - -ImageResponse imageResponseFromJson(String str) => ImageResponse.fromJson(json.decode(str)); - -String imageResponseToJson(ImageResponse data) => json.encode(data.toJson()); - -class ImageResponse { - ImageResponse({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - dynamic? totalItemsCount; - String? data; - int? messageStatus; - String? message; - - factory ImageResponse.fromJson(Map json) => ImageResponse( - totalItemsCount: json["totalItemsCount"], - data: json["data"] == null ? null : json["data"], - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount, - "data": data == null ? null : data, - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} diff --git a/lib/models/user/login_password.dart b/lib/models/user/login_password.dart deleted file mode 100644 index d888811..0000000 --- a/lib/models/user/login_password.dart +++ /dev/null @@ -1,53 +0,0 @@ -// To parse this JSON data, do -// -// final loginPassword = loginPasswordFromJson(jsonString); - -import 'dart:convert'; - -LoginPasswordRespModel loginPasswordFromJson(String str) => LoginPasswordRespModel.fromJson(json.decode(str)); - -String loginPasswordToJson(LoginPasswordRespModel data) => json.encode(data.toJson()); - -class LoginPasswordRespModel { - LoginPasswordRespModel({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - dynamic totalItemsCount; - Data? data; - int? messageStatus; - String? message; - - factory LoginPasswordRespModel.fromJson(Map json) => LoginPasswordRespModel( - totalItemsCount: json["totalItemsCount"], - data: json["data"] == null ? null : Data.fromJson(json["data"]), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount, - "data": data == null ? null : data!.toJson(), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} - -class Data { - Data({ - this.userToken, - }); - - String? userToken; - - factory Data.fromJson(Map json) => Data( - userToken: json["userToken"] == null ? null : json["userToken"], - ); - - Map toJson() => { - "userToken": userToken == null ? null : userToken, - }; -} diff --git a/lib/models/user/refresh_token.dart b/lib/models/user/refresh_token.dart deleted file mode 100644 index 7de1e59..0000000 --- a/lib/models/user/refresh_token.dart +++ /dev/null @@ -1,65 +0,0 @@ -// To parse this JSON data, do -// -// final refreshToken = refreshTokenFromJson(jsonString); - -import 'dart:convert'; - -RefreshToken refreshTokenFromJson(String str) => RefreshToken.fromJson(json.decode(str)); - -String refreshTokenToJson(RefreshToken data) => json.encode(data.toJson()); - -class RefreshToken { - RefreshToken({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - final dynamic? totalItemsCount; - final RefreshData? data; - final int? messageStatus; - final String? message; - - factory RefreshToken.fromJson(Map json) => RefreshToken( - totalItemsCount: json["totalItemsCount"], - data: json["data"] == null ? null : RefreshData.fromJson(json["data"]), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount, - "data": data == null ? null : data!.toJson(), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} - -class RefreshData { - RefreshData({ - this.accessToken, - this.refreshToken, - this.expiryDate, - this.userInfo, - }); - - final String? accessToken; - final String? refreshToken; - final DateTime? expiryDate; - final dynamic? userInfo; - - factory RefreshData.fromJson(Map json) => RefreshData( - accessToken: json["accessToken"] == null ? null : json["accessToken"], - refreshToken: json["refreshToken"] == null ? null : json["refreshToken"], - expiryDate: json["expiryDate"] == null ? null : DateTime.parse(json["expiryDate"]), - userInfo: json["userInfo"], - ); - - Map toJson() => { - "accessToken": accessToken == null ? null : accessToken, - "refreshToken": refreshToken == null ? null : refreshToken, - "expiryDate": expiryDate == null ? null : expiryDate!.toIso8601String(), - "userInfo": userInfo, - }; -} diff --git a/lib/models/user/register_user.dart b/lib/models/user/register_user.dart deleted file mode 100644 index 5f5f79d..0000000 --- a/lib/models/user/register_user.dart +++ /dev/null @@ -1,129 +0,0 @@ -// To parse this JSON data, do -// -// final registerUser = registerUserFromJson(jsonString); - -import 'dart:convert'; - -RegisterUserRespModel registerUserFromJson(String str) => RegisterUserRespModel.fromJson(json.decode(str)); - -String registerUserToJson(RegisterUserRespModel data) => json.encode(data.toJson()); - -class RegisterUserRespModel { - RegisterUserRespModel({ - this.messageStatus, - this.totalItemsCount, - this.data, - this.message, - }); - - final int? messageStatus; - final dynamic? totalItemsCount; - final Data? data; - final String? message; - - factory RegisterUserRespModel.fromJson(Map json) => RegisterUserRespModel( - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - totalItemsCount: json["totalItemsCount"], - data: json["data"] == null ? null : Data.fromJson(json["data"]), - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "messageStatus": messageStatus == null ? null : messageStatus, - "totalItemsCount": totalItemsCount, - "data": data == null ? null : data!.toJson(), - "message": message == null ? null : message, - }; -} - -class Data { - Data({ - this.id, - this.userId, - this.firstName, - this.lastName, - this.mobileNo, - this.email, - this.userImageUrl, - this.roleId, - this.roleName, - this.isEmailVerified, - this.serviceProviderBranch, - this.isVerified, - this.userRoles, - this.isCustomer, - this.isProviderDealership, - this.isProviderIndividual, - this.isDealershipUser, - this.providerId, - this.customerId, - this.dealershipId, - }); - - final int? id; - final String? userId; - final dynamic? firstName; - final dynamic? lastName; - final String? mobileNo; - final String? email; - final dynamic? userImageUrl; - final int? roleId; - final dynamic? roleName; - final bool? isEmailVerified; - final List? serviceProviderBranch; - final bool? isVerified; - final List? userRoles; - final bool? isCustomer; - final bool? isProviderDealership; - final bool? isProviderIndividual; - final bool? isDealershipUser; - final dynamic? providerId; - final dynamic? customerId; - final dynamic? dealershipId; - - factory Data.fromJson(Map json) => Data( - id: json["id"] == null ? null : json["id"], - userId: json["userID"] == null ? null : json["userID"], - firstName: json["firstName"], - lastName: json["lastName"], - mobileNo: json["mobileNo"] == null ? null : json["mobileNo"], - email: json["email"] == null ? null : json["email"], - userImageUrl: json["userImageUrl"], - roleId: json["roleID"] == null ? null : json["roleID"], - roleName: json["roleName"], - isEmailVerified: json["isEmailVerified"] == null ? null : json["isEmailVerified"], - serviceProviderBranch: json["serviceProviderBranch"] == null ? null : List.from(json["serviceProviderBranch"].map((x) => x)), - isVerified: json["isVerified"] == null ? null : json["isVerified"], - userRoles: json["userRoles"] == null ? null : List.from(json["userRoles"].map((x) => x)), - isCustomer: json["isCustomer"] == null ? null : json["isCustomer"], - isProviderDealership: json["isProviderDealership"] == null ? null : json["isProviderDealership"], - isProviderIndividual: json["isProviderIndividual"] == null ? null : json["isProviderIndividual"], - isDealershipUser: json["isDealershipUser"] == null ? null : json["isDealershipUser"], - providerId: json["providerID"], - customerId: json["customerID"], - dealershipId: json["dealershipID"], - ); - - Map toJson() => { - "id": id == null ? null : id, - "userID": userId == null ? null : userId, - "firstName": firstName, - "lastName": lastName, - "mobileNo": mobileNo == null ? null : mobileNo, - "email": email == null ? null : email, - "userImageUrl": userImageUrl, - "roleID": roleId == null ? null : roleId, - "roleName": roleName, - "isEmailVerified": isEmailVerified == null ? null : isEmailVerified, - "serviceProviderBranch": serviceProviderBranch == null ? null : List.from(serviceProviderBranch!.map((x) => x)), - "isVerified": isVerified == null ? null : isVerified, - "userRoles": userRoles == null ? null : List.from(userRoles!.map((x) => x)), - "isCustomer": isCustomer == null ? null : isCustomer, - "isProviderDealership": isProviderDealership == null ? null : isProviderDealership, - "isProviderIndividual": isProviderIndividual == null ? null : isProviderIndividual, - "isDealershipUser": isDealershipUser == null ? null : isDealershipUser, - "providerID": providerId, - "customerID": customerId, - "dealershipID": dealershipId, - }; -} diff --git a/lib/models/user/role.dart b/lib/models/user/role.dart deleted file mode 100644 index 2ea0054..0000000 --- a/lib/models/user/role.dart +++ /dev/null @@ -1,65 +0,0 @@ -// To parse this JSON data, do -// -// final role = roleFromJson(jsonString); - -import 'dart:convert'; - -Role roleFromJson(String str) => Role.fromJson(json.decode(str)); - -String roleToJson(Role data) => json.encode(data.toJson()); - -class Role { - Role({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - int? totalItemsCount; - List? data; - int? messageStatus; - String? message; - - factory Role.fromJson(Map json) => Role( - totalItemsCount: json["totalItemsCount"] == null ? null : json["totalItemsCount"], - data: json["data"] == null ? null : List.from(json["data"].map((x) => RoleData.fromJson(x))), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount == null ? null : totalItemsCount, - "data": data == null ? null : List.from(data!.map((x) => x.toJson())), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} - -class RoleData { - RoleData({ - this.id, - this.roleName, - this.roleNameN, - this.isActive, - }); - - int? id; - String? roleName; - String? roleNameN; - bool? isActive; - - factory RoleData.fromJson(Map json) => RoleData( - id: json["id"] == null ? null : json["id"], - roleName: json["roleName"] == null ? null : json["roleName"], - roleNameN: json["roleNameN"] == null ? null : json["roleNameN"], - isActive: json["isActive"] == null ? null : json["isActive"], - ); - - Map toJson() => { - "id": id == null ? null : id, - "roleName": roleName == null ? null : roleName, - "roleNameN": roleNameN == null ? null : roleNameN, - "isActive": isActive == null ? null : isActive, - }; -} diff --git a/lib/models/user/user.dart b/lib/models/user/user.dart deleted file mode 100644 index f1f0ee7..0000000 --- a/lib/models/user/user.dart +++ /dev/null @@ -1,153 +0,0 @@ -// To parse this JSON data, do -// -// final user = userFromJson(jsonString); - -import 'dart:convert'; - -User userFromJson(String str) => User.fromJson(json.decode(str)); - -String userToJson(User data) => json.encode(data.toJson()); - -class User { - User({ - this.totalItemsCount, - this.data, - this.messageStatus, - this.message, - }); - - dynamic totalItemsCount; - UserData? data; - int? messageStatus; - String? message; - - factory User.fromJson(Map json) => User( - totalItemsCount: json["totalItemsCount"], - data: json["data"] == null ? null : UserData.fromJson(json["data"]), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); - - Map toJson() => { - "totalItemsCount": totalItemsCount, - "data": data == null ? null : data!.toJson(), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; -} - -class UserData { - UserData({ - this.accessToken, - this.refreshToken, - this.expiryDate, - this.userInfo, - }); - - String? accessToken; - String? refreshToken; - DateTime? expiryDate; - UserInfo? userInfo; - - factory UserData.fromJson(Map json) => UserData( - accessToken: json["accessToken"] == null ? null : json["accessToken"], - refreshToken: json["refreshToken"] == null ? null : json["refreshToken"], - expiryDate: json["expiryDate"] == null ? null : DateTime.parse(json["expiryDate"]), - userInfo: json["userInfo"] == null ? null : UserInfo.fromJson(json["userInfo"]), - ); - - Map toJson() => { - "accessToken": accessToken == null ? null : accessToken, - "refreshToken": refreshToken == null ? null : refreshToken, - "expiryDate": expiryDate == null ? null : expiryDate!.toIso8601String(), - "userInfo": userInfo == null ? null : userInfo!.toJson(), - }; -} - -class UserInfo { - UserInfo({ - this.id, - this.userId, - this.firstName, - this.lastName, - this.mobileNo, - this.email, - this.userImageUrl, - this.roleId, - this.roleName, - this.isEmailVerified, - this.serviceProviderBranch, - this.isVerified, - this.userRoles, - this.isCustomer, - this.isProviderDealership, - this.isDealershipUser, - this.providerId, - this.customerId, - this.dealershipId, - }); - - int? id; - String? userId; - String? firstName; - String? lastName; - String? mobileNo; - String? email; - dynamic userImageUrl; - int? roleId; - String? roleName; - bool? isEmailVerified; - List? serviceProviderBranch; - bool? isVerified; - List? userRoles; - bool? isCustomer; - bool? isProviderDealership; - bool? isDealershipUser; - dynamic providerId; - int? customerId; - dynamic dealershipId; - - factory UserInfo.fromJson(Map json) => UserInfo( - id: json["id"] == null ? null : json["id"], - userId: json["userID"] == null ? null : json["userID"], - firstName: json["firstName"] == null ? null : json["firstName"], - lastName: json["lastName"] == null ? null : json["lastName"], - mobileNo: json["mobileNo"] == null ? null : json["mobileNo"], - email: json["email"] == null ? null : json["email"], - userImageUrl: json["userImageUrl"], - roleId: json["roleID"] == null ? null : json["roleID"], - roleName: json["roleName"] == null ? null : json["roleName"], - isEmailVerified: json["isEmailVerified"] == null ? null : json["isEmailVerified"], - serviceProviderBranch: json["serviceProviderBranch"] == null ? null : List.from(json["serviceProviderBranch"].map((x) => x)), - isVerified: json["isVerified"] == null ? null : json["isVerified"], - userRoles: json["userRoles"] == null ? null : List.from(json["userRoles"].map((x) => x)), - isCustomer: json["isCustomer"] == null ? null : json["isCustomer"], - isProviderDealership: json["isProviderDealership"] == null ? null : json["isProviderDealership"], - isDealershipUser: json["isDealershipUser"] == null ? null : json["isDealershipUser"], - providerId: json["providerID"], - customerId: json["customerID"] == null ? null : json["customerID"], - dealershipId: json["dealershipID"], - ); - - Map toJson() => { - "id": id == null ? null : id, - "userID": userId == null ? null : userId, - "firstName": firstName == null ? null : firstName, - "lastName": lastName == null ? null : lastName, - "mobileNo": mobileNo == null ? null : mobileNo, - "email": email == null ? null : email, - "userImageUrl": userImageUrl, - "roleID": roleId == null ? null : roleId, - "roleName": roleName == null ? null : roleName, - "isEmailVerified": isEmailVerified == null ? null : isEmailVerified, - "serviceProviderBranch": serviceProviderBranch == null ? null : List.from(serviceProviderBranch!.map((x) => x)), - "isVerified": isVerified == null ? null : isVerified, - "userRoles": userRoles == null ? null : List.from(userRoles!.map((x) => x)), - "isCustomer": isCustomer == null ? null : isCustomer, - "isProviderDealership": isProviderDealership == null ? null : isProviderDealership, - "isDealershipUser": isDealershipUser == null ? null : isDealershipUser, - "providerID": providerId, - "customerID": customerId == null ? null : customerId, - "dealershipID": dealershipId, - }; -} diff --git a/lib/models/user/verify_email.dart b/lib/models/user/verify_email.dart deleted file mode 100644 index a097073..0000000 --- a/lib/models/user/verify_email.dart +++ /dev/null @@ -1,53 +0,0 @@ - - - -import 'dart:convert'; - -VerifyEmailRespModel verifyEmailFromJson(String str) => VerifyEmailRespModel.fromJson(json.decode(str)); - -String verifyEmailToJson(VerifyEmailRespModel data) => json.encode(data.toJson()); - - -class VerifyEmailRespModel { - Null? totalItemsCount; - Data? data; - int? messageStatus; - String? message; - - VerifyEmailRespModel( - {this.totalItemsCount, this.data, this.messageStatus, this.message}); - - VerifyEmailRespModel.fromJson(Map json) { - totalItemsCount = json['totalItemsCount']; - data = json['data'] != null ? new Data.fromJson(json['data']) : null; - messageStatus = json['messageStatus']; - message = json['message']; - } - - Map toJson() { - final Map data = new Map(); - data['totalItemsCount'] = this.totalItemsCount; - if (this.data != null) { - data['data'] = this.data!.toJson(); - } - data['messageStatus'] = this.messageStatus; - data['message'] = this.message; - return data; - } -} - -class Data { - String? userToken; - - Data({this.userToken}); - - Data.fromJson(Map json) { - userToken = json['userToken']; - } - - Map toJson() { - final Map data = new Map(); - data['userToken'] = this.userToken; - return data; - } -} \ No newline at end of file diff --git a/lib/models/user/verify_email_otp.dart b/lib/models/user/verify_email_otp.dart deleted file mode 100644 index aa0827c..0000000 --- a/lib/models/user/verify_email_otp.dart +++ /dev/null @@ -1,27 +0,0 @@ - - - -import 'dart:convert'; - -VerifyEmailOTP verifyEmailOTPFromJson(String str) => VerifyEmailOTP.fromJson(json.decode(str)); - -String verifyEmailOTPToJson(VerifyEmailOTP data) => json.encode(data.toJson()); - -class VerifyEmailOTP { - bool? success; - Null? errors; - - VerifyEmailOTP({this.success, this.errors}); - - VerifyEmailOTP.fromJson(Map json) { - success = json['success']; - errors = json['errors']; - } - - Map toJson() { - final Map data = new Map(); - data['success'] = this.success; - data['errors'] = this.errors; - return data; - } -} \ No newline at end of file diff --git a/lib/repositories/branch_repo.dart b/lib/repositories/branch_repo.dart deleted file mode 100644 index b7b678d..0000000 --- a/lib/repositories/branch_repo.dart +++ /dev/null @@ -1,108 +0,0 @@ -import 'dart:async'; - -import 'package:car_customer_app/api/api_client.dart'; -import 'package:car_customer_app/classes/app_state.dart'; -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/config/dependencies.dart'; -import 'package:car_customer_app/models/m_response.dart'; -import 'package:car_customer_app/models/profile/branch.dart'; -import 'package:car_customer_app/models/profile/categroy.dart'; -import 'package:car_customer_app/models/profile/document.dart'; -import 'package:car_customer_app/models/profile/services.dart'; -import 'package:flutter/cupertino.dart'; - -abstract class BranchRepo { - Future createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude); - - Future fetchAllBranches(); - - Future fetchBranchCategory(); - - Future fetchServicesByCategoryId(String serviceCategoryId); - - Future createNewService(List> map); - - Future getServiceProviderDocument(dynamic userId); - - Future serviceProviderDocumentsUpdate(List? documents); -} - -class BranchRepoImp implements BranchRepo { - @override - Future createBranch(String branchName, String branchDescription, String cityId, String address, String latitude, String longitude) async { - var postParams = { - "serviceProviderID": AppState().getUser.data?.userInfo?.providerId ?? "", - "branchName": branchName, - "branchDescription": branchDescription, - "cityID": cityId, - "address": address, - "latitude": latitude, - "longitude": longitude, - "isActive": true - }; - String t = AppState().getUser.data!.accessToken ?? ""; - debugPrint("token " + t); - return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.createProviderBranch, postParams, token: t); - } - - @override - Future fetchAllBranches() async { - var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; - String t = AppState().getUser.data!.accessToken ?? ""; - debugPrint("token " + t); - return await injector.get().getJsonForObject((json) => Branch.fromJson(json), ApiConsts.ServiceProviderBranchGet, queryParameters: postParams, token: t); - } - - @override - Future fetchBranchCategory() async { - var postParams = {"ServiceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; - String t = AppState().getUser.data!.accessToken ?? ""; - debugPrint("token " + t); - return await injector.get().getJsonForObject((json) => Category.fromJson(json), ApiConsts.ServiceCategory_Get, queryParameters: postParams, token: t); - } - - @override - Future fetchServicesByCategoryId(String serviceCategoryId) async { - var postParams = {"ServiceCategoryID": serviceCategoryId}; - String t = AppState().getUser.data!.accessToken ?? ""; - debugPrint("token " + t); - return await injector.get().getJsonForObject((json) => Services.fromJson(json), ApiConsts.Services_Get, queryParameters: postParams, token: t); - } - - @override - Future createNewService(List> map) async { - String t = AppState().getUser.data!.accessToken ?? ""; - return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderService_Create, map, token: t); - } - - @override - Future getServiceProviderDocument(dynamic userId) async { - var queryParameters = { - "ServiceProviderID": userId.toString(), - }; - String? token = AppState().getUser.data?.accessToken; - debugPrint(token); - return await injector.get().getJsonForObject((json) => Document.fromJson(json), ApiConsts.GetProviderDocument, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? ""); - } - - @override - Future serviceProviderDocumentsUpdate(List? documents) async { - List> map = []; - for (int i = 0; i < documents!.length; i++) { - if (documents[i].document != null) { - var postParams = { - "id": documents[i].id, - "serviceProviderID": documents[i].serviceProviderId, - "documentID": documents[i].documentId, - "documentExt": documents[i].fileExt, - "documentImage": documents[i].document, - "isActive": true - }; - map.add(postParams); - } - } - String t = AppState().getUser.data!.accessToken ?? ""; - debugPrint("token " + t); - return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ServiceProviderDocument_Update, map, token: t); - } -} diff --git a/lib/repositories/common_repo.dart b/lib/repositories/common_repo.dart deleted file mode 100644 index 8b13789..0000000 --- a/lib/repositories/common_repo.dart +++ /dev/null @@ -1 +0,0 @@ - diff --git a/lib/repositories/dashboard_repo.dart b/lib/repositories/dashboard_repo.dart deleted file mode 100644 index e69de29..0000000 diff --git a/lib/repositories/provider_repo.dart b/lib/repositories/provider_repo.dart new file mode 100644 index 0000000..d92a66d --- /dev/null +++ b/lib/repositories/provider_repo.dart @@ -0,0 +1,51 @@ +import 'dart:async'; +import 'dart:convert'; +import 'dart:io'; +import 'package:mc_common_app/models/model/provider_model.dart'; +import 'package:mc_common_app/models/services/item_model.dart'; +import 'package:mc_common_app/models/services/near_branch_model.dart'; +import 'package:http/http.dart' as http; + +import 'package:mc_common_app/api/api_client.dart'; +import 'package:mc_common_app/classes/app_state.dart'; + +import 'package:mc_common_app/classes/consts.dart'; +import 'package:mc_common_app/config/dependencies.dart'; + +import 'package:flutter/cupertino.dart'; + +abstract class ProviderRepo { + Future getAllNearBranchAndServices(); + + Future getServiceItems(int serviceId); + + Future getBranchAndServices(int providerId); +} + +class ProviderRepoImp implements ProviderRepo { + @override + Future getAllNearBranchAndServices() async { + // var postParams = {"serviceProviderID": AppState().getUser.data?.userInfo?.providerId.toString() ?? ""}; + String t = AppState().getUser.data!.accessToken ?? ""; + return await injector.get().getJsonForObject((json) => NearBrancheModel.fromJson(json), ApiConsts.GetAllNearBranches, token: t); + } + + @override + Future getServiceItems(int serviceId) async { + var queryParameters = { + "ServiceProviderServiceID": serviceId.toString(), + }; + String? token = AppState().getUser.data?.accessToken; + debugPrint(token); + return await injector + .get() + .getJsonForObject((json) => ItemModel.fromJson(json), ApiConsts.getServiceItems, queryParameters: queryParameters, token: AppState().getUser.data!.accessToken ?? ""); + } + + @override + Future getBranchAndServices(int providerId) async { + var postParams = {"serviceProviderID": providerId.toString()}; + String t = AppState().getUser.data!.accessToken ?? ""; + return await injector.get().getJsonForObject((json) => ProviderModel.fromJson(json), ApiConsts.BranchesAndServices, queryParameters: postParams, token: t); + } +} diff --git a/lib/repositories/user_repo.dart b/lib/repositories/user_repo.dart deleted file mode 100644 index d095cf5..0000000 --- a/lib/repositories/user_repo.dart +++ /dev/null @@ -1,291 +0,0 @@ -import 'dart:async'; -import 'dart:convert'; - -import 'package:car_customer_app/api/api_client.dart'; -import 'package:car_customer_app/classes/app_state.dart'; -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/config/dependencies.dart'; -import 'package:car_customer_app/models/m_response.dart'; -import 'package:car_customer_app/models/user/basic_otp.dart'; -import 'package:car_customer_app/models/user/change_email.dart'; -import 'package:car_customer_app/models/user/change_mobile.dart'; -import 'package:car_customer_app/models/user/cities.dart'; -import 'package:car_customer_app/models/user/confirm_email.dart'; -import 'package:car_customer_app/models/user/confirm_mobile.dart'; -import 'package:car_customer_app/models/user/confirm_password.dart'; -import 'package:car_customer_app/models/user/country.dart'; -import 'package:car_customer_app/models/user/forget_password_otp_compare.dart'; -import 'package:car_customer_app/models/user/image_response.dart'; -import 'package:car_customer_app/models/user/login_password.dart'; -import 'package:car_customer_app/models/user/refresh_token.dart'; -import 'package:car_customer_app/models/user/register_user.dart'; -import 'package:car_customer_app/models/user/role.dart'; -import 'package:car_customer_app/models/user/user.dart'; -import 'package:car_customer_app/models/user/verify_email.dart'; -import 'package:car_customer_app/utils/shared_prefrence.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:http/http.dart'; - -abstract class UserRepo { - Future basicOtp(String phoneNo, {int otpType = 1, int roleId = 4, int countryId = 1}); - - Future basicVerify(String phoneNo, String otp, String userToken); - - Future basicComplete(String userId, String firstName, String lastName, String email, String password); - - Future loginV1(String phoneNo, String password); - - Future loginV2OTP(String userToken, String loginType); - - Future loginV2OTPVerify(String userToken, String otp); - - Future refreshTokenAPI(String token, String refreshToken); - - Future getAllCountries(); - - Future getAllCites(String countryId); - - Future getRoles(); - - Future forgetPasswordOTPRequest(String userName, int otpType); - - Future forgetPasswordOTPCompare(String userToken, String userOTP); - - Future forgetPassword(String userToken, String newPassword); - - Future changePassword(String currentPassword, String newPassword); - - Future changeMobileNoOTPRequest(countryID, String mobileNo, String password); - - Future changeMobileNo(String userToken, String userOTP); - - Future changeEmailOTPRequest(String email, String password); - - Future changeEmail(String userToken, String userOTP); - - Future emailVerify(String email, String userID); - - Future emailVerifyOTPVerify(String userToken, String userOTP); - - Future updateUserImage(String image); - - Future getUserImage(String image); - - Future updateUserToken(); -} - -class UserRepoImp implements UserRepo { - @override - Future basicOtp(String phoneNo, {int otpType = 1, int roleId = 4, int countryId = 1}) async { - var postParams = {"countryID": countryId, "userMobileNo": phoneNo, "otpType": otpType, "userRole": roleId}; - return await injector.get().postJsonForObject((json) => BasicOtpRespModel.fromJson(json), ApiConsts.BasicOTP, postParams); - } - - @override - Future basicVerify(String phoneNo, String otp, String userToken) async { - var postParams = { - "userMobileNo": phoneNo, - "userOTP": otp, - "userToken": userToken, - }; - return await injector.get().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicVerify, postParams); - } - - @override - Future basicComplete(String userId, String firstName, String lastName, String email, String password) async { - Map postParams; - if (email.isEmpty) { - postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "companyName": "string", "isEmailVerified": true, "password": password}; - } else { - postParams = {"userID": userId, "firstName": firstName, "lastName": lastName, "email": email, "companyName": "string", "isEmailVerified": true, "password": password}; - } - - return await injector.get().postJsonForObject((json) => RegisterUserRespModel.fromJson(json), ApiConsts.BasicComplete, postParams); - } - - @override - Future loginV1(String phoneNo, String password) async { - var postParams = { - "mobileorEmail": phoneNo, - "password": password, - }; - return await injector.get().postJsonForResponse(ApiConsts.Login_V1, postParams); - //return await injector.get().postJsonForObject((json) => BasicOtp.fromJson(json), ApiConsts.Login_V1, postParams); - } - - @override - Future loginV2OTP(String userToken, String loginType) async { - var postParams = { - "userToken": userToken, - "loginType": loginType, - }; - - Response response = await injector.get().postJsonForResponse(ApiConsts.Login_V2_OTP, postParams); - LoginPasswordRespModel user = LoginPasswordRespModel.fromJson(jsonDecode(response.body)); - return user; - } - - @override - Future loginV2OTPVerify(String userToken, String otp) async { - var postParams = {"userToken": userToken, "userOTP": otp}; - return await injector.get().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams); - } - - @override - Future refreshTokenAPI(String token, String refreshToken) async { - var postParams = {"token": token, "refreshToken": refreshToken}; - // String t = AppState().getUser.data!.accessToken ?? ""; - return await injector.get().postJsonForObject((json) => RefreshToken.fromJson(json), ApiConsts.RefreshToken, postParams); - } - - @override - Future getAllCountries() async { - return await injector.get().getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry); - } - - @override - Future getAllCites(String countryId) async { - var postParams = { - "CountryID": countryId, - }; - return await injector.get().getJsonForObject((json) => Cities.fromJson(json), ApiConsts.GetAllCities, queryParameters: postParams); - } - - @override - Future getRoles() async { - return await injector.get().getJsonForObject((json) => Role.fromJson(json), ApiConsts.GetProviderRoles); - } - - @override - Future forgetPasswordOTPRequest(String userName, int otpType) async { - var postParams = { - "userName": userName, - "otpType": 1, - }; - return await injector.get().postJsonForResponse(ApiConsts.ForgetPasswordOTPRequest, postParams); - //return await injector.get().postJsonForObject((json) => PasswordOTPRequest.fromJson(json), ApiConsts.ForgetPasswordOTPRequest, postParams); - } - - @override - Future forgetPasswordOTPCompare(String userToken, String userOTP) async { - var postParams = {"userToken": userToken, "userOTP": userOTP}; - Response response = await injector.get().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams); - - PasswordOTPCompareResModel otpCompare = PasswordOTPCompareResModel.fromJson(jsonDecode(response.body)); - return otpCompare; - } - - @override - Future forgetPassword(String userToken, String newPassword) async { - var postParams = { - "userToken": userToken, - "newPassword": newPassword, - }; - - Response response = await injector.get().postJsonForResponse(ApiConsts.ForgetPassword, postParams); - ConfirmPasswordRespModel data = ConfirmPasswordRespModel.fromJson(jsonDecode(response.body)); - - return data ; - //return await injector.get().postJsonForObject((json) => ConfirmPassword.fromJson(json), ApiConsts.ForgetPassword, postParams); - } - - @override - Future changePassword(String currentPassword, String newPassword) async { - var postParams = { - "currentPassword": currentPassword, - "newPassword": newPassword, - }; - // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); - - String t = AppState().getUser.data!.accessToken ?? ""; - debugPrint("token " + t); - return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.ChangePassword, postParams, token: t); - } - - @override - Future changeMobileNoOTPRequest(countryID, String mobileNo, String password) async { - var postParams = {"countryID": 1, "mobileNo": mobileNo, "password": password}; - String t = AppState().getUser.data!.accessToken ?? ""; - return await injector.get().postJsonForObject((json) => ChangeMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNoOTPRequest, postParams, token: t); - } - - @override - Future changeMobileNo(String userToken, String userOTP) async { - var postParams = { - "userToken": userToken, - "userOTP": userOTP, - }; - String t = AppState().getUser.data!.accessToken ?? ""; - return await injector.get().postJsonForObject((json) => ConfirmMobileRespModel.fromJson(json), ApiConsts.ChangeMobileNo, postParams, token: t); - } - - @override - Future changeEmailOTPRequest(String email, String password) async { - var postParams = {"email": email, "password": password}; - String t = AppState().getUser.data!.accessToken ?? ""; - return await injector.get().postJsonForObject((json) => ChanEmailRespModel.fromJson(json), ApiConsts.ChangeEmailOTPRequest, postParams, token: t); - } - - @override - Future changeEmail(String userToken, String userOTP) async { - var postParams = {"userToken": userToken, "userOTP": userOTP}; - String t = AppState().getUser.data!.accessToken ?? ""; - return await injector.get().postJsonForObject((json) => ConfirmEmailRespModel.fromJson(json), ApiConsts.ChangeEmail, postParams, token: t); - } - - @override - Future emailVerify(String email, String userID) async { - var postParams = { - // "email": email, - // "userID": userID, - "email": AppState().getUser.data!.userInfo!.email ?? "", - "userID": AppState().getUser.data!.userInfo!.userId ?? "", - }; - - String t = AppState().getUser.data!.accessToken ?? ""; - return await injector.get().postJsonForObject((json) => VerifyEmailRespModel.fromJson(json), ApiConsts.EmailVerify, postParams, token: t); - } - - @override - Future emailVerifyOTPVerify(String userToken, String userOTP) async { - var postParams = {"userToken": userToken, "userOTP": userOTP}; - - String t = AppState().getUser.data!.accessToken ?? ""; - return await injector.get().postJsonForObject((json) => MResponse.fromJson(json), ApiConsts.EmailVerifyOTPVerify, postParams, token: t); - } - - @override - Future updateUserImage(String image) async { - var postParams = {"userID": AppState().getUser.data!.userInfo!.userId, "userImage": image}; - // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); - - String t = AppState().getUser.data!.accessToken ?? ""; - debugPrint("token " + t); - return await injector.get().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t); - } - - @override - Future getUserImage(String image) async { - var postParams = {}; - // return await injector.get().postJsonForResponse(ApiConsts.ChangePassword, postParams); - - String t = AppState().getUser.data!.accessToken ?? ""; - debugPrint("token " + t); - return await injector.get().postJsonForObject((json) => ImageResponse.fromJson(json), ApiConsts.UpdateUserImage, postParams, token: t); - } - - @override - Future updateUserToken() async { - String token = await SharedPrefManager.getUserToken(); - String refreshToken = await SharedPrefManager.getRefreshToken(); - RefreshToken refresh = await refreshTokenAPI(token, refreshToken); - SharedPrefManager.setUserToken(refresh.data!.accessToken ?? ""); - SharedPrefManager.setRefreshToken(refresh.data!.refreshToken ?? ""); - String mdata = await SharedPrefManager.getData(); - UserInfo info = UserInfo.fromJson(jsonDecode(mdata)); - User user = User(); - user.data = UserData(accessToken: refresh.data!.accessToken ?? "", refreshToken: refresh.data!.refreshToken ?? "", userInfo: info); - AppState().setUser = user; - return refresh.data!.accessToken ?? ""; - } -} diff --git a/lib/services/services.dart b/lib/services/services.dart deleted file mode 100644 index 8dd371f..0000000 --- a/lib/services/services.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'dart:io'; - -import 'package:image_picker/image_picker.dart'; - -abstract class CommonServices { - Future pickImageFromPhone(int sourceFlag); -} - -class CommonServicesImp implements CommonServices { - @override - Future pickImageFromPhone(int sourceFlag) async { - final picker = ImagePicker(); - final pickedImage = await picker.pickImage( - source: sourceFlag == 0 ? ImageSource.camera : ImageSource.gallery, - ); - final pickedImageFile = File(pickedImage!.path); - return pickedImageFile; - } -} \ No newline at end of file diff --git a/lib/theme/app_theme.dart b/lib/theme/app_theme.dart deleted file mode 100644 index 8d0252d..0000000 --- a/lib/theme/app_theme.dart +++ /dev/null @@ -1,27 +0,0 @@ -import 'package:flutter/material.dart'; - -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. - primaryColor: primaryColor, - primaryTextTheme: const TextTheme( - titleLarge: TextStyle(color: Colors.white), - ), colorScheme: ColorScheme.fromSwatch(primarySwatch: Colors.orange).copyWith(background: Colors.white), - ); -} - -extension ExtendedRevoCheckTheme on TextTheme { - //add custom styles and colors here - //taken from https://medium.com/@crizantlai/flutter-how-to-extend-themedata-b5b987a95bb5 - TextStyle get price => const TextStyle(color: Colors.redAccent); -} diff --git a/lib/theme/colors.dart b/lib/theme/colors.dart deleted file mode 100644 index d65575d..0000000 --- a/lib/theme/colors.dart +++ /dev/null @@ -1,73 +0,0 @@ -import 'package:flutter/material.dart'; - -class MyColors { - static const Color darkPrimaryColor = Color(0xffF47F20); - static const Color primaryColor = Color(0xffF69521); - static const Color accentColor = Colors.blue; - static const Color lightTextColor = Color(0xff969696); - static const Color textColor = Color(0xff777777); - static const Color textFieldColor = Color(0xffF3F5F7); - static const Color darkIconColor = Color(0xff28323A); - static const Color darkTextColor = Color(0xff2B353E); - static const Color normalTextColor = Color(0xff5A5A5A); - static const Color gradiantStartColor = Color(0xff33c0a5); - static const Color gradiantEndColor = Color(0xff259db7); - static const Color textMixColor = Color(0xff2BB8A6); - static const Color backgroundColor = Color(0xffF8F8F8); - static const Color grey57Color = Color(0xff575757); - static const Color grey77Color = Color(0xff777777); - static const Color grey70Color = Color(0xff707070); - static const Color greyACColor = Color(0xffACACAC); - static const Color grey98Color = Color(0xff989898); - static const Color lightGreyEFColor = Color(0xffEFEFEF); - static const Color lightGreyEDColor = Color(0xffEDEDED); - static const Color lightGreyEAColor = Color(0xffEAEAEA); - static const Color darkWhiteColor = Color(0xffE0E0E0); - static const Color redColor = Color(0xffD02127); - static const Color yellowColor = Color(0xffF4E31C); - static const Color backgroundBlackColor = Color(0xff202529); - static const Color black = Color(0xff000000); - static const Color white = Color(0xffffffff); - static const Color green = Color(0xffffffff); - static const Color borderColor = Color(0xffE8E8E8); - - static Decoration gradient = BoxDecoration( - gradient: const LinearGradient(colors: [ - darkPrimaryColor, - primaryColor, - ]), - boxShadow: [ - BoxShadow( - color: primaryColor.withOpacity(0.5), - blurRadius: 20.0, - spreadRadius: 1.0, - ) - ], - ); - - static Decoration gradientButton = BoxDecoration( - gradient: const LinearGradient(colors: [ - darkPrimaryColor, - primaryColor, - ]), - borderRadius: BorderRadius.circular(6), - boxShadow: [ - BoxShadow( - color: primaryColor.withOpacity(0.2), - blurRadius: 4.0, - spreadRadius: 0.5, - ) - ], - ); -} - -const Color primaryColor = Colors.white; -const Color accentColor = Colors.blue; -const Color appBackgroundColor = Colors.white; -Color? accentColorDark = Colors.green[800]; -const Color borderColor = Colors.blueGrey; -Color? borderLightColor = Colors.blueGrey[50]; -const Color iconColor = Colors.blueGrey; -Color? headingColor = Colors.blueGrey[800]; -Color? txtColor = Colors.blueGrey[500]; - diff --git a/lib/utils/dialogs.dart b/lib/utils/dialogs.dart deleted file mode 100644 index c0fabd8..0000000 --- a/lib/utils/dialogs.dart +++ /dev/null @@ -1,35 +0,0 @@ -import 'package:flutter/material.dart'; - -import 'permission_handler.dart'; - -Future showConfirmDialogs( - context, msg, positiveText, negativeText) async { - return showDialog( - context: context, - barrierDismissible: false, - builder: (context) { - return AlertDialog( - backgroundColor: Colors.white, - title: Text(msg, style: TextStyle(fontSize: 16)), - actions: [ - TextButton( - child: Text( - negativeText, - ), - onPressed: () { - Navigator.of(context).pop(ConfirmAction.CANCEL); - }, - ), - TextButton( - child: Text( - positiveText, - ), - onPressed: () { - Navigator.of(context).pop(ConfirmAction.ACCEPT); - }, - ) - ], - ); - }, - ); -} diff --git a/lib/utils/enums.dart b/lib/utils/enums.dart deleted file mode 100644 index cf27602..0000000 --- a/lib/utils/enums.dart +++ /dev/null @@ -1,29 +0,0 @@ -// enum APPSTATUS { -// loading, -// unAuthenticated, -// authenticated, -// unverified, -// } - -enum AuthMethodTypes { - sms, - whatsApp, - fingerPrint, - faceID, - moreOptions, -} - -enum ViewState { - hide, - idle, - busy, - error, - busyLocal, - errorLocal, -} - -enum LoginType { - FROM_LOGIN, - SILENT_LOGIN, - SILENT_WITH_OTP, -} diff --git a/lib/utils/navigator.dart b/lib/utils/navigator.dart deleted file mode 100644 index ef3900c..0000000 --- a/lib/utils/navigator.dart +++ /dev/null @@ -1,14 +0,0 @@ -import 'package:flutter/material.dart'; - -navigateWithName(BuildContext context, String routeName, {Object? arguments}) { - Navigator.pushNamed(context, routeName, arguments: arguments); -} - - -navigateReplaceWithName(BuildContext context, String routeName, {Object? arguments}) { - Navigator.pushReplacementNamed(context, routeName, arguments: arguments); -} - -pop(BuildContext context) { - Navigator.of(context).pop(); -} diff --git a/lib/utils/permission_handler.dart b/lib/utils/permission_handler.dart deleted file mode 100644 index 3e3877e..0000000 --- a/lib/utils/permission_handler.dart +++ /dev/null @@ -1,36 +0,0 @@ -import 'package:permission_handler/permission_handler.dart'; - -import 'dialogs.dart'; - -enum ConfirmAction { CANCEL, ACCEPT } - -Future requestPermissionGranted( - context, Permission requestPermissions) async { - var result = await requestPermissions.request(); - - switch (result) { - case PermissionStatus.granted: - // Application has been given permission to use the feature. - return true; - case PermissionStatus.denied: - // Application has been denied permission to use the feature. - return false; - case PermissionStatus.permanentlyDenied: - ConfirmAction? res = await showConfirmDialogs( - context, - 'You was denied Permission. You have give manual permission from app setting. ', - 'Open App Setting', - 'Cancel'); - if (res == ConfirmAction.ACCEPT) { - return false; - } else if (res == ConfirmAction.CANCEL) { - return false; - } - return false; - case PermissionStatus.restricted: - // iOS has restricted access to a specific feature. - return false; - default: - return false; - } -} diff --git a/lib/utils/shared_prefrence.dart b/lib/utils/shared_prefrence.dart deleted file mode 100644 index f629755..0000000 --- a/lib/utils/shared_prefrence.dart +++ /dev/null @@ -1,74 +0,0 @@ -import 'dart:async'; - -import 'package:shared_preferences/shared_preferences.dart'; - -class SharedPrefManager { - static String USER_ID = "user.id"; - static String USER_TOKEN = "user.token"; - static String USER_NAME = "user.name"; - static String PASSWORD = "user.password"; - static String REFRESH_TOKEN = "user.refresh.token"; - static String DATA = "data"; - - static final Future _prefs = SharedPreferences.getInstance(); - - static setUserId(String cookie) async { - final prefs = await SharedPreferences.getInstance(); - prefs.setString(USER_ID, cookie) ; - } - - static Future getUserId() async { - SharedPreferences prefs = await _prefs; - return prefs.getString(USER_ID) ?? ""; - } - - static setUserToken(String cookie) async { - final prefs = await SharedPreferences.getInstance(); - prefs.setString(USER_TOKEN, cookie) ; - } - - static Future getUserToken() async { - SharedPreferences prefs = await _prefs; - return prefs.getString(USER_TOKEN) ?? ""; - } - - static setPhoneOrEmail(String cookie) async { - final prefs = await SharedPreferences.getInstance(); - prefs.setString(USER_NAME, cookie) ; - } - - static Future getPhoneOrEmail() async { - SharedPreferences prefs = await _prefs; - return prefs.getString(USER_NAME) ?? ""; - } - - static setUserPassword(String cookie) async { - final prefs = await SharedPreferences.getInstance(); - prefs.setString(PASSWORD, cookie) ; - } - - static Future getUserPassword() async { - SharedPreferences prefs = await _prefs; - return prefs.getString(PASSWORD) ?? ""; - } - - static setRefreshToken(String cookie) async { - final prefs = await SharedPreferences.getInstance(); - prefs.setString(REFRESH_TOKEN, cookie) ; - } - - static Future getRefreshToken() async { - SharedPreferences prefs = await _prefs; - return prefs.getString(REFRESH_TOKEN) ?? ""; - } - - static setData(String cookie) async { - final prefs = await SharedPreferences.getInstance(); - prefs.setString(DATA, cookie); - } - - static Future getData() async { - SharedPreferences prefs = await _prefs; - return prefs.getString(DATA) ?? ""; - } -} diff --git a/lib/utils/utils.dart b/lib/utils/utils.dart deleted file mode 100644 index ab93116..0000000 --- a/lib/utils/utils.dart +++ /dev/null @@ -1,306 +0,0 @@ -import 'dart:convert'; -import 'dart:io'; -import 'dart:typed_data'; - -import 'package:car_customer_app/theme/colors.dart'; -import 'package:flutter/material.dart'; - -import 'package:car_customer_app/exceptions/api_exception.dart'; -import 'package:car_customer_app/widgets/loading_dialog.dart'; -import 'package:fluttertoast/fluttertoast.dart'; - -class Utils { - static bool _isLoadingVisible = false; - - static bool get isLoading => _isLoadingVisible; - - static void showToast(String message) { - Fluttertoast.showToast( - msg: message, toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.BOTTOM, timeInSecForIosWeb: 2, backgroundColor: Colors.black54, textColor: Colors.white, fontSize: 16.0); - } - - static dynamic getNotNullValue(List list, int index) { - try { - return list[index]; - } catch (ex) { - return null; - } - } - - static int stringToHex(String colorCode) { - try { - return int.parse(colorCode.replaceAll("#", "0xff")); - } catch (ex) { - return (0xff000000); - } - } - - static void showLoading(BuildContext context) { - WidgetsBinding.instance.addPostFrameCallback((_) { - _isLoadingVisible = true; - showDialog( - context: context, - barrierColor: Colors.black.withOpacity(0.5), - builder: (BuildContext context) => LoadingDialog(), - ).then((value) { - _isLoadingVisible = false; - }); - }); - } - - static void hideLoading(BuildContext context) { - if (_isLoadingVisible) { - _isLoadingVisible = false; - Navigator.of(context).pop(); - } - _isLoadingVisible = false; - } - - static void handleException(dynamic exception, Function(String)? onErrorMessage) { - String errorMessage; - if (exception is APIException) { - if (exception.message == APIException.UNAUTHORIZED) { - return; - } else { - errorMessage = exception.error?.errorMessage ?? exception.message; - } - } else { - errorMessage = APIException.UNKNOWN; - } - if (onErrorMessage != null) { - onErrorMessage(errorMessage); - } else { - showToast(errorMessage); - } - } - - static Color getColorFromHex(String hexColor) { - hexColor = hexColor.toUpperCase().replaceAll('#', ''); - - if (hexColor.length == 6) { - hexColor = 'FF' + hexColor; - } - - return Color(int.parse(hexColor, radix: 16)); - } - - static Widget spacerVertical(double v) { - return SizedBox( - height: v, - width: double.infinity, - ); - } - - static String convertFileToBase64(File file) { - List imageBytes = file.readAsBytesSync(); - return base64Encode(imageBytes); - } - - static Future delay(int millis) async { - return await Future.delayed(Duration(milliseconds: millis)); - } - - static inkWellCorner({double? r}) { - return RoundedRectangleBorder( - borderRadius: BorderRadius.circular(r ?? 4), - ); - } - - static Widget spacerHorizontal(double v) { - return SizedBox( - height: v, - width: v, - ); - } - - static Widget mDivider(Color color, {double? h}) { - return Container( - width: double.infinity, - height: h ?? 1, - color: color, - ); - } - - static Widget mDivider3({double? h}) { - return Container( - width: double.infinity, - height: h ?? 1, - color: borderLightColor!.withOpacity(0.7), - ); - } - - static Widget mDivider2(Color color, double w) { - return Container( - width: w, - height: 1, - color: color, - ); - } - - static InputDecoration txtField(String label) { - return InputDecoration( - border: InputBorder.none, - focusedBorder: InputBorder.none, - enabledBorder: InputBorder.none, - errorBorder: InputBorder.none, - hintText: label, - hintStyle: const TextStyle(color: Colors.grey), - disabledBorder: InputBorder.none, - isDense: false, - contentPadding: const EdgeInsets.only(left: 15, right: 15), - ); - } - - static Widget mFlex(int f) { - return Flexible( - flex: f, - child: const SizedBox( - width: double.infinity, - height: double.infinity, - ), - ); - } - - static Widget mExp(int f) { - return Expanded( - flex: f, - child: Container( - width: double.infinity, - ), - ); - } - - static spacer() { - return const SizedBox( - height: 8, - ); - } - - static cardRadius(double radius) { - return RoundedRectangleBorder( - side: const BorderSide(color: Colors.transparent, width: 1), - borderRadius: BorderRadius.circular(radius), - ); - } - - static cardRadiusWithoutBorder(double radius) { - return RoundedRectangleBorder( - side: const BorderSide(color: Colors.transparent, width: 1), - borderRadius: BorderRadius.circular(radius), - ); - } - - static Image imageFromBase64String(String base64String) { - return Image.memory(base64Decode(base64String)); - } - - static Uint8List dataFromBase64String(String base64String) { - return base64Decode(base64String); - } - - static String base64String(Uint8List data) { - return base64Encode(data); - } - - static Widget overLayWidget({double? width, double? height, List? color}) { - return Container( - width: width ?? double.infinity, - height: height ?? 60, - decoration: BoxDecoration( - gradient: LinearGradient( - colors: color ?? - [ - Colors.black.withOpacity(0.2), - Colors.black.withOpacity(0.1), - Colors.black.withOpacity(0.004), - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - tileMode: TileMode.clamp, - ), - ), - ); - } - - static Decoration containerRadius(Color color, double r) { - return BoxDecoration( - color: color, - borderRadius: BorderRadius.all(Radius.circular(r)), - ); - } - - static Decoration containerRadiusTop({Color? color, double? r}) { - return BoxDecoration( - color: color ?? Colors.white, - borderRadius: BorderRadius.only(topRight: Radius.circular(r ?? 12), topLeft: Radius.circular(r ?? 12)), - ); - } - - static Decoration containerRadiusBorder(Color color, double r) { - return BoxDecoration( - color: Colors.transparent, - border: Border.all(color: color, width: 1), - borderRadius: BorderRadius.all(Radius.circular(r)), - ); - } - - static Decoration containerRadiusBottom(Color color, double r) { - return BoxDecoration( - color: color, - borderRadius: BorderRadius.only(bottomLeft: Radius.circular(r), bottomRight: Radius.circular(r)), - ); - } - - static ShapeBorder cardRadiusTop(double radius) { - return RoundedRectangleBorder( - side: const BorderSide(color: Colors.transparent, width: 0), - borderRadius: BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius)), - ); - } - - static Decoration containerColorRadiusBorderWidth(Color background, double radius, Color color, double w) { - return BoxDecoration( - color: background, - border: Border.all( - width: w, // - color: color // <--- border width here - ), - borderRadius: BorderRadius.circular(radius), - ); - } - - static ShapeBorder cardRadiusTop2(double radius) { - return RoundedRectangleBorder( - borderRadius: BorderRadius.only(topLeft: Radius.circular(radius), topRight: Radius.circular(radius)), - ); - } - - static ShapeBorder cardRadiusBottom(double radius) { - return RoundedRectangleBorder( - borderRadius: BorderRadius.only(bottomLeft: Radius.circular(radius), bottomRight: Radius.circular(radius)), - ); - } - - static Decoration containerColorRadiusBorder(Color background, double radius, Color color) { - return BoxDecoration( - color: background, - border: Border.all( - width: 1, // - color: color // <--- border width here - ), - borderRadius: BorderRadius.circular(radius), - ); - } - - static bool passwordValidateStructure(String value) { - String pattern = r'^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{6,}$'; - RegExp regExp = RegExp(pattern); - return regExp.hasMatch(value); - } - - static bool isEmailValid(String email) { - String p = r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$'; - RegExp regExp = RegExp(p); - return regExp.hasMatch(email); - } -} diff --git a/lib/view_models/appointments_view_model.dart b/lib/view_models/appointments_view_model.dart new file mode 100644 index 0000000..2fb9aa2 --- /dev/null +++ b/lib/view_models/appointments_view_model.dart @@ -0,0 +1,102 @@ +import 'package:flutter/cupertino.dart'; +import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart'; +import 'package:mc_common_app/models/provider_category_model.dart'; +import 'package:mc_common_app/models/provider_service_model.dart'; +import 'package:mc_common_app/models/widgets_models.dart'; +import 'package:mc_common_app/repositories/common_repo.dart'; +import 'package:mc_common_app/services/common_services.dart'; + +class AppointmentsVM extends ChangeNotifier { + final CommonRepo commonRepo; + final CommonAppServices commonServices; + + AppointmentsVM({required this.commonServices, required this.commonRepo}); + + bool isFetchingLists = false; + + List myAppointments = []; + List appointmentsFilterOptions = []; + + bool isFetchingServices = false; + + List providerCategories = []; + + bool isHomeTapped = false; + + void updateIsHomeTapped(bool value) { + isHomeTapped = value; + notifyListeners(); + } + + String pickedHomeLocation = ""; + + void updatePickedHomeLocation(String value) { + pickedHomeLocation = value; + notifyListeners(); + } + + SelectionModel providerCategoryId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); + + void updateProviderCategoryId(SelectionModel id) async { + providerCategoryId = id; + await getProviderServices(id.selectedId); + notifyListeners(); + } + + List providerServices = []; + + SelectionModel providerServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); + + void updateProviderServiceId(SelectionModel id) async { + providerServiceId = id; + notifyListeners(); + } + + void getProviderCategories() async { + notifyListeners(); + providerCategories = await commonRepo.getProviderServiceCategories(); + notifyListeners(); + } + + getProviderServices(int categoryId) async { + providerServiceId = SelectionModel(selectedOption: "", selectedId: -1, errorValue: ""); + isHomeTapped = false; + pickedHomeLocation = ""; + if (categoryId != -1) { + isFetchingServices = true; + notifyListeners(); + providerServices = await commonRepo.getProviderServices(categoryId: categoryId); + isFetchingServices = false; + + notifyListeners(); + } + } + + populateAppointmentsFilterList() { + appointmentsFilterOptions.clear(); + appointmentsFilterOptions = [ + FilterListModel(title: "All Appointments", isSelected: true, id: -1), + FilterListModel(title: "Booked", isSelected: false, id: 1), + FilterListModel(title: "Confirmed", isSelected: false, id: 2), + FilterListModel(title: "Arrived", isSelected: false, id: 3), + FilterListModel(title: "Cancelled", isSelected: false, id: 4), + ]; + notifyListeners(); + } + + applyFilterOnAppointmentsVM({required int index}) { + if (appointmentsFilterOptions.isEmpty) return; + for (var value in appointmentsFilterOptions) { + value.isSelected = false; + } + appointmentsFilterOptions[index].isSelected = true; + notifyListeners(); + } + + Future getMyAppointments() async { + isFetchingLists = true; + myAppointments = await commonRepo.getMyAppointments(); + isFetchingLists = false; + notifyListeners(); + } +} diff --git a/lib/view_models/base_view_model.dart b/lib/view_models/base_view_model.dart deleted file mode 100644 index 96270d5..0000000 --- a/lib/view_models/base_view_model.dart +++ /dev/null @@ -1,20 +0,0 @@ -import 'package:car_customer_app/utils/enums.dart'; -import 'package:flutter/cupertino.dart'; - -class BaseVM extends ChangeNotifier { - ViewState _state = ViewState.idle; - bool isInternetConnection = true; - - ViewState get state => _state; - - String error = ""; - - void setOnlyState(ViewState viewState) { - _state = viewState; - } - - void setState(ViewState viewState) { - _state = viewState; - notifyListeners(); - } -} diff --git a/lib/view_models/dashboard_view_model.dart b/lib/view_models/dashboard_view_model.dart index 2e24c9a..21dca0b 100644 --- a/lib/view_models/dashboard_view_model.dart +++ b/lib/view_models/dashboard_view_model.dart @@ -1,22 +1,29 @@ import 'dart:io'; -import 'package:car_customer_app/classes/app_state.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/models/user/image_response.dart'; -import 'package:car_customer_app/repositories/user_repo.dart'; -import 'package:car_customer_app/services/services.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:car_customer_app/view_models/base_view_model.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:mc_common_app/classes/app_state.dart'; +import 'package:mc_common_app/generated/locale_keys.g.dart'; +import 'package:mc_common_app/models/user/image_response.dart'; +import 'package:mc_common_app/repositories/user_repo.dart'; +import 'package:mc_common_app/services/common_services.dart'; +import 'package:mc_common_app/utils/utils.dart'; +import 'package:mc_common_app/view_models/base_view_model.dart'; import 'package:flutter/cupertino.dart'; +import 'package:easy_localization/easy_localization.dart'; class DashboardVM extends BaseVM { - final CommonServices commonServices; + final CommonAppServices commonServices; final UserRepo userRepo; DashboardVM({required this.commonServices, required this.userRepo}); String pickedImage = ""; + int selectedNavbarBarIndex = 2; + + void onNavbarTapped(int index) { + selectedNavbarBarIndex = index; + notifyListeners(); + } + void pickImageFromPhone(BuildContext context, int sourceFlag) async { final File? pickedImageFile = await commonServices.pickImageFromPhone(sourceFlag); if (pickedImageFile == null) { diff --git a/lib/view_models/providers_view_model.dart b/lib/view_models/providers_view_model.dart new file mode 100644 index 0000000..568f713 --- /dev/null +++ b/lib/view_models/providers_view_model.dart @@ -0,0 +1,67 @@ +import 'package:mc_common_app/models/model/provider_model.dart'; +import 'package:mc_common_app/models/services/item_model.dart'; +import 'package:mc_common_app/models/services/near_branch_model.dart'; +import 'package:car_customer_app/repositories/provider_repo.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:mc_common_app/models/widgets_models.dart'; +import 'package:mc_common_app/repositories/common_repo.dart'; +import 'package:mc_common_app/services/common_services.dart'; +import 'package:mc_common_app/utils/enums.dart'; +import 'package:mc_common_app/view_models/base_view_model.dart'; + +class ProvidersVM extends BaseVM { + final CommonRepo commonRepo; + final CommonAppServices commonServices; + final ProviderRepo providerRepo; + + ProvidersVM({required this.commonServices, required this.commonRepo, required this.providerRepo}); + + List providersFilterOptions = []; + NearBrancheModel? branches; + ItemModel? serviceItems; + ProviderModel? providerModel; + + populateProvidersFilterList() { + providersFilterOptions.clear(); + providersFilterOptions = [ + FilterListModel(title: "All Providers", isSelected: true, id: -1), + FilterListModel(title: "Maintenance", isSelected: false, id: 0), + FilterListModel(title: "Oil Service", isSelected: false, id: 1), + FilterListModel(title: "Accessories", isSelected: false, id: 2), + FilterListModel(title: "Tire Service", isSelected: false, id: 3), + FilterListModel(title: "Dent and Paint", isSelected: false, id: 4), + ]; + notifyListeners(); + } + + applyFilterOnProviders({required int index}) { + if (providersFilterOptions.isEmpty) return; + for (var value in providersFilterOptions) { + value.isSelected = false; + } + providersFilterOptions[index].isSelected = true; + notifyListeners(); + } + + //Create new branch + getAllNearBranches({bool isNeedToRebuild = false}) async { + //TODO: needs to lat,long into API + branches = null; + if (isNeedToRebuild) setState(ViewState.busy); + branches = await providerRepo.getAllNearBranchAndServices(); + setState(ViewState.idle); + } + + Future getServiceItems(int serviceId) async { + serviceItems = null; + serviceItems = await providerRepo.getServiceItems(serviceId); + setState(ViewState.idle); + return serviceItems; + } + + getBranchAndServices(int providerId) async { + providerModel = null; + providerModel = await providerRepo.getBranchAndServices(providerId); + setState(ViewState.idle); + } +} diff --git a/lib/view_models/user_view_model.dart b/lib/view_models/user_view_model.dart deleted file mode 100644 index bf37e59..0000000 --- a/lib/view_models/user_view_model.dart +++ /dev/null @@ -1,477 +0,0 @@ -import 'dart:convert'; - -import 'package:car_customer_app/classes/app_state.dart'; -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/config/routes.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/models/m_response.dart'; -import 'package:car_customer_app/models/user/basic_otp.dart'; -import 'package:car_customer_app/models/user/change_email.dart'; -import 'package:car_customer_app/models/user/change_mobile.dart'; -import 'package:car_customer_app/models/user/confirm_email.dart'; -import 'package:car_customer_app/models/user/confirm_mobile.dart'; -import 'package:car_customer_app/models/user/confirm_password.dart'; -import 'package:car_customer_app/models/user/country.dart'; -import 'package:car_customer_app/models/user/forget_password_otp_compare.dart'; -import 'package:car_customer_app/models/user/forget_password_otp_request.dart'; -import 'package:car_customer_app/models/user/login_password.dart'; -import 'package:car_customer_app/models/user/register_user.dart'; -import 'package:car_customer_app/models/user/user.dart'; -import 'package:car_customer_app/models/user/verify_email.dart'; -import 'package:car_customer_app/repositories/user_repo.dart'; -import 'package:car_customer_app/utils/navigator.dart'; -import 'package:car_customer_app/utils/shared_prefrence.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:car_customer_app/view_models/base_view_model.dart'; -import 'package:car_customer_app/widgets/dialog/dialogs.dart'; -import 'package:car_customer_app/widgets/dialog/message_dialog.dart'; -import 'package:car_customer_app/widgets/dialog/otp_dialog.dart'; -import 'package:car_customer_app/widgets/tab/login_email_tab.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/cupertino.dart'; - -import 'package:http/http.dart'; - -class UserVM extends BaseVM { - final UserRepo userRepo; - - UserVM({required this.userRepo}); - - bool completeProfilePageCheckbox = false; - - void updateCompleteProfilePageCheckbox(bool newValue) { - completeProfilePageCheckbox = newValue; - notifyListeners(); - } - - String displayStrengthText = ''; - - void updateStrengthText(String newValue) { - displayStrengthText = newValue; - notifyListeners(); - } - - double strengthThreshold = 0.0; - - void updateStrengthThreshold(double newValue) { - strengthThreshold = newValue; - notifyListeners(); - } - - Future changeUserEmail(BuildContext context, String email, String password) async { - Utils.showLoading(context); - ChanEmailRespModel otpRequest = await userRepo.changeEmailOTPRequest(email, password); - Utils.hideLoading(context); - if (otpRequest.messageStatus == 1) { - showMDialog(context, child: OtpDialog( - onClick: (String code) async { - pop(context); - Utils.showLoading(context); - ConfirmEmailRespModel otpCompare = await userRepo.changeEmail(otpRequest.data!.userToken ?? "", code); - Utils.hideLoading(context); - if (otpCompare.messageStatus == 1) { - showMDialog( - context, - child: MessageDialog( - title: LocaleKeys.emailChangedSuccessfully.tr(), - //"Email is Changed Successfully", - onClick: () { - Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.loginWithPassword, (Route route) => false); - }, - ), - ); - } else { - Utils.showToast(otpCompare.message ?? ""); - } - }, - )); - } else { - Utils.showToast(otpRequest.message ?? ""); - } - } - - Future changeUserMobile(BuildContext context, int countryId, String mobileNo, String password) async { - Utils.showLoading(context); - ChangeMobileRespModel otpRequest = await userRepo.changeMobileNoOTPRequest(countryId, mobileNo, password); - Utils.hideLoading(context); - if (otpRequest.messageStatus == 1) { - showMDialog(context, child: OtpDialog( - onClick: (String code) async { - pop(context); - Utils.showLoading(context); - ConfirmMobileRespModel otpCompare = await userRepo.changeMobileNo(otpRequest.data!.userToken ?? "", code); - Utils.hideLoading(context); - if (otpCompare.messageStatus == 1) { - showMDialog( - context, - child: MessageDialog( - title: LocaleKeys.phoneNumberVerified.tr(), - //"Phone Number Verified", - onClick: () { - Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.loginWithPassword, (Route route) => false); - }, - ), - ); - } else { - Utils.showToast(otpCompare.message ?? ""); - } - }, - )); - } else { - Utils.showToast(otpRequest.message ?? ""); - } - } - - Future changeUserPassword(BuildContext context, String newPassword, String currentPassword) async { - if (Utils.passwordValidateStructure(newPassword)) { - Utils.showLoading(context); - MResponse res = await userRepo.changePassword(currentPassword, newPassword); - Utils.hideLoading(context); - if (res.messageStatus == 1) { - Utils.showToast(LocaleKeys.passwordIsUpdated.tr()); - //("Password is Updated"); - // navigateWithName(context, AppRoutes.loginWithPassword); - Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.loginWithPassword, (Route route) => false); - } else { - Utils.showToast(res.message ?? ""); - } - } else { - Utils.showToast(LocaleKeys.passwordShouldContains.tr()); - //("Password Should contains Character, Number, Capital and small letters"); - } - } - - Future performCompleteProfile( - 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); - RegisterUserRespModel user = await userRepo.basicComplete(userId ?? "", firstName, lastName, email, password); - Utils.hideLoading(context); - if (user.messageStatus == 1) { - Utils.showToast(LocaleKeys.successfullyRegistered.tr()); - pop(context); - } else { - Utils.showToast(user.message ?? ""); - } - } else { - Utils.showToast(LocaleKeys.pleaseEnterSamePassword.tr()); - //("Please enter same password"); - } - } else { - Utils.showToast(LocaleKeys.passwordShouldContains.tr()); - //("Password Should contains Character, Number, Capital and small letters"); - } - } - - bool dataValidation({ - required String password, - required String? firstName, - required String? lastName, - required String? email, - }) { - bool isValid = true; - if (firstName!.isEmpty) { - Utils.showToast(LocaleKeys.firstNameMandatory.tr()); - //("First name is mandatory"); - isValid = false; - } else if (lastName!.isEmpty) { - Utils.showToast(LocaleKeys.surnameNameMandatory.tr()); - //("Surname is mandatory"); - isValid = false; - } else if (email!.isNotEmpty) { - if (!Utils.isEmailValid(email)) { - Utils.showToast(LocaleKeys.enterValidEmail.tr()); - isValid = false; - } - } else if (password.isEmpty) { - Utils.showToast(LocaleKeys.passwordNameMandatory.tr()); - //("Password is mandatory"); - isValid = false; - } else if (!completeProfilePageCheckbox) { - Utils.showToast(LocaleKeys.pleaseAcceptTerms.tr()); - //("Please accept terms"); - isValid = false; - } - return isValid; - } - - void checkPassword(String password) { - if (password.length <= 6) { - updateStrengthThreshold(1 / 4); - updateStrengthText('Your password is too short'); - } else if (password.length < 8) { - updateStrengthThreshold(2 / 4); - updateStrengthText('Your password is acceptable but not strong'); - } else { - if (!letterReg.hasMatch(password) || !numReg.hasMatch(password)) { - updateStrengthThreshold(3 / 4); - updateStrengthText('Your password is strong'); - } else { - updateStrengthThreshold(1); - updateStrengthText('Your password is very strong'); - } - } - notifyListeners(); - } - - Future confirmPasswordOTP(BuildContext context, {required String userToken, required String newPassword}) async { - if (Utils.passwordValidateStructure(newPassword)) { - Utils.showLoading(context); - ConfirmPasswordRespModel data = await userRepo.forgetPassword(userToken, newPassword); - Utils.hideLoading(context); - if (data.messageStatus == 1) { - Utils.showToast(LocaleKeys.passwordIsUpdated.tr()); - navigateWithName(context, AppRoutes.loginWithPassword); - } else { - Utils.showToast(data.message ?? ""); - } - } else { - Utils.showToast(LocaleKeys.passwordShouldContains.tr()); - } - } - - Future verifyEmail(BuildContext context, {required String email, required String userID}) async { - Utils.showLoading(context); - VerifyEmailRespModel otpRequest = await userRepo.emailVerify(email, userID); - Utils.hideLoading(context); - if (otpRequest.messageStatus == 1) { - showMDialog(context, child: OtpDialog( - onClick: (String code) async { - pop(context); - Utils.showLoading(context); - MResponse otpCompare = await userRepo.emailVerifyOTPVerify(otpRequest.data!.userToken ?? "", code); - Utils.hideLoading(context); - if (otpCompare.messageStatus == 1) { - AppState().getUser.data!.userInfo!.isEmailVerified = true; - Utils.showToast(LocaleKeys.emailVerified.tr()); - } else { - Utils.showToast(otpCompare.message ?? ""); - } - }, - )); - } else { - Utils.showToast(otpRequest.message ?? ""); - } - notifyListeners(); - } - - Future forgetPasswordOTPMethod(BuildContext context, {required String userToken}) async { - showMDialog(context, child: OtpDialog( - onClick: (String code) async { - pop(context); - Utils.showLoading(context); - PasswordOTPCompareResModel otpCompare = await userRepo.forgetPasswordOTPCompare(userToken, code); - Utils.hideLoading(context); - if (otpCompare.messageStatus == 1) { - var userToken = otpCompare.data!.userToken; - navigateWithName(context, AppRoutes.confirmNewPasswordPage, arguments: userToken); - } else { - Utils.showToast(otpCompare.message ?? ""); - } - }, - )); - } - - Future forgetPasswordPhoneOTP(BuildContext context, {required String countryCode, required String userName, required int otpType}) async { - Utils.showLoading(context); - Response response = await userRepo.forgetPasswordOTPRequest(countryCode + userName, otpType); - Utils.hideLoading(context); - PasswordOTPRequestRespModel otpRequest = PasswordOTPRequestRespModel.fromJson(jsonDecode(response.body)); - if (otpRequest.messageStatus == 1) { - var userToken = otpRequest.data!.userToken; - navigateReplaceWithName(context, AppRoutes.forgetPasswordMethodPage, arguments: userToken); - } else { - Utils.showToast(otpRequest.message ?? ""); - } - } - - Future forgetPasswordEmailOTP(BuildContext context, {required String countryCode, required String userName, required int otpType}) async { - Utils.showLoading(context); - Response response = await userRepo.forgetPasswordOTPRequest(userName, otpType); - Utils.hideLoading(context); - PasswordOTPRequestRespModel otpRequest = PasswordOTPRequestRespModel.fromJson(jsonDecode(response.body)); - if (otpRequest.messageStatus == 1) { - Utils.showToast(LocaleKeys.codeSentToEmail.tr()); - showMDialog(context, child: OtpDialog( - onClick: (String code) async { - pop(context); - Utils.showLoading(context); - PasswordOTPCompareResModel otpCompare = await userRepo.forgetPasswordOTPCompare(otpRequest.data!.userToken ?? "", code); - Utils.hideLoading(context); - if (otpCompare.messageStatus == 1) { - var userToken = otpCompare.data!.userToken; - navigateWithName(context, AppRoutes.confirmNewPasswordPage, arguments: userToken); - } else { - Utils.showToast(otpCompare.message ?? ""); - } - }, - )); - } else { - Utils.showToast(otpRequest.message ?? ""); - } - } - - Future performBasicOtpLoginSelectionPage(BuildContext context, {required String userToken}) async { - Utils.showLoading(context); - LoginPasswordRespModel user = await userRepo.loginV2OTP(userToken, "1"); - Utils.hideLoading(context); - if (user.messageStatus == 1) { - showMDialog(context, child: OtpDialog( - onClick: (String code) async { - pop(context); - Utils.showLoading(context); - Response response2 = await userRepo.loginV2OTPVerify(user.data!.userToken ?? "", code); - Utils.hideLoading(context); - RegisterUserRespModel verifiedUser = RegisterUserRespModel.fromJson(jsonDecode(response2.body)); - if (verifiedUser.messageStatus == 1) { - User user = User.fromJson(jsonDecode(response2.body)); - if (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(LocaleKeys.onlyCustomerApp.tr()); - //("Sorry, Only Customer's can log in this app"); - } - } else { - Utils.showToast(verifiedUser.message ?? ""); - } - }, - )); - } else { - Utils.showToast(user.message ?? ""); - } - } - - Future performApiCallLoginVerificationPage(BuildContext context) async { - String userToken = ""; - String userName = await SharedPrefManager.getPhoneOrEmail(); - String password = await SharedPrefManager.getUserPassword(); - if (userName.isNotEmpty && userName.isNotEmpty) { - Utils.showLoading(context); - Response response = await userRepo.loginV1(userName, password); - Utils.hideLoading(context); - LoginPasswordRespModel user = LoginPasswordRespModel.fromJson(jsonDecode(response.body)); - if (user.messageStatus == 1) { - userToken = user.data!.userToken ?? ""; - // navigateWithName(context, AppRoutes.loginMethodSelection, arguments: user.data!.userToken); - } else { - Utils.showToast(user.message ?? ""); - } - } - return userToken; - } - - Future performBasicOtpLoginVerificationPage(BuildContext context, {required String userToken}) async { - Utils.showLoading(context); - LoginPasswordRespModel user = await userRepo.loginV2OTP(userToken, "1"); - Utils.hideLoading(context); - if (user.messageStatus == 1) { - showMDialog(context, child: OtpDialog( - onClick: (String code) async { - pop(context); - Utils.showLoading(context); - Response response2 = await userRepo.loginV2OTPVerify(user.data!.userToken ?? "", code); - Utils.hideLoading(context); - RegisterUserRespModel verifiedUser = RegisterUserRespModel.fromJson(jsonDecode(response2.body)); - if (verifiedUser.messageStatus == 1) { - User user = User.fromJson(jsonDecode(response2.body)); - AppState().setUser = user; - navigateReplaceWithName(context, AppRoutes.dashboard); - } else { - Utils.showToast(verifiedUser.message ?? ""); - } - }, - )); - } else { - Utils.showToast(user.message ?? ""); - } - } - - Future performBasicOtpLoginVerifyAccountPage(BuildContext context, {required String phoneNum, required int otpType}) async { - Utils.showLoading(context); - BasicOtpRespModel basicOtp = await userRepo.basicOtp(phoneNum, otpType: otpType); - Utils.hideLoading(context); - if (basicOtp.messageStatus == 1) { - showMDialog(context, child: OtpDialog( - onClick: (String code) async { - pop(context); - Utils.showLoading(context); - RegisterUserRespModel user = await userRepo.basicVerify(phoneNum, code, basicOtp.data!.userToken ?? ""); - Utils.hideLoading(context); - if (user.messageStatus == 1) { - Utils.showToast(user.message ?? ""); - showMDialog( - context, - child: MessageDialog( - title: LocaleKeys.phoneNumberVerified.tr(), - //"Phone Number Verified", - onClick: () { - pop(context); - navigateWithName(context, AppRoutes.profile1, arguments: user); - }, - ), - ); - } else { - Utils.showToast(user.message ?? ""); - } - }, - )); - } else { - Utils.showToast(basicOtp.message ?? ""); - } - } - - Future performBasicOtpLoginWithPasswordPage(BuildContext context, {required ClassType type, required String countryCode, required String phoneNum, required String password}) async { - Utils.showLoading(context); - Response response = await userRepo.loginV1(type == ClassType.NUMBER ? countryCode + phoneNum : phoneNum, password); - Utils.hideLoading(context); - LoginPasswordRespModel user = LoginPasswordRespModel.fromJson(jsonDecode(response.body)); - if (user.messageStatus == 1) { - SharedPrefManager.setPhoneOrEmail(type == ClassType.NUMBER ? countryCode + phoneNum : phoneNum); - SharedPrefManager.setUserPassword(password); - navigateReplaceWithName(context, AppRoutes.loginMethodSelection, arguments: user.data!.userToken); - } else { - Utils.showToast(user.message ?? ""); - } - } - - Future getAllCountries() async { - return await userRepo.getAllCountries(); - } - - Future performBasicOtpRegisterPage(BuildContext context, {required String countryCode, required String phoneNum, required int role}) async { - Utils.showLoading(context); - BasicOtpRespModel basicOtp = await userRepo.basicOtp(countryCode + phoneNum, roleId: role); - Utils.hideLoading(context); - if (basicOtp.messageStatus == 1) { - showMDialog(context, child: OtpDialog( - onClick: (String code) async { - pop(context); - Utils.showLoading(context); - RegisterUserRespModel user = await userRepo.basicVerify(countryCode + phoneNum, code, basicOtp.data!.userToken ?? ""); - Utils.hideLoading(context); - if (user.messageStatus == 1) { - Utils.showToast(user.message ?? ""); - navigateReplaceWithName(context, AppRoutes.completeProfile, arguments: user); - } else { - Utils.showToast(user.message ?? ""); - } - }, - )); - } else { - Utils.showToast(basicOtp.message ?? ""); - } - } -} diff --git a/lib/views/appointments/appointment_detail_view.dart b/lib/views/appointments/appointment_detail_view.dart new file mode 100644 index 0000000..86e2dec --- /dev/null +++ b/lib/views/appointments/appointment_detail_view.dart @@ -0,0 +1,128 @@ +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/models/appointments_models/appointment_list_model.dart'; +import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/widgets/button/show_fill_button.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/card_button_with_icon.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; + +class AppointmentDetailView extends StatelessWidget { + AppointmentListModel appointmentListModel; + + AppointmentDetailView({Key? key, required this.appointmentListModel}) : super(key: key); + + final List servicesList = [ + "Mechanic", + "Electrician", + " Car Denting", + "Oil Change", + ]; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar( + title: "Appointment", + profileImageUrl: MyAssets.bnCar, + isRemoveBackButton: false, + isDrawerEnabled: false, + ), + body: Container( + padding: const EdgeInsets.only(bottom: 10, left: 21, right: 21), + child: Stack( + children: [ + Column( + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + appointmentListModel.providerName!.toText(fontSize: 18, isBold: true), + Row( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + MyAssets.miniClockDark.buildSvg( + height: 10, + width: 10, + fit: BoxFit.fill, + ), + 10.width, + "${appointmentListModel.duration ?? ""} ${appointmentListModel.appointmentDate!.toFormattedDateWithoutTime()}".toText(fontSize: 12, isBold: true, color: MyColors.lightTextColor), + ], + ), + 13.height, + Row( + children: [ + MyAssets.maintenanceIcon.buildSvg( + height: 10, + width: 10, + fit: BoxFit.fill, + ), + 10.width, + "Maintenance".toText(fontSize: 18, isBold: true), + ], + ), + Column( + children: servicesList + .map((e) => e + .toText( + textAlign: TextAlign.start, + fontSize: 13, + isBold: true, + color: MyColors.lightTextColor, + ) + .paddingOnly(bottom: 5)) + .toList(), + ).paddingOnly(left: 15), + 15.height, + Row( + children: [ + CardButtonWithIcon( + title: "Reschedule Appointment", + onCardTapped: () {}, + icon: MyAssets.scheduleAppointmentIcon.buildSvg(), + ), + 10.width, + CardButtonWithIcon( + title: "Pay for Appointment", + onCardTapped: () {}, + icon: MyAssets.creditCardIcon.buildSvg(), + ), + ], + ), + 15.height, + ], + ).toWhiteContainer(width: double.infinity, allPading: 12), + Align( + alignment: Alignment.bottomCenter, + child: Row( + children: [ + Expanded( + child: ShowFillButton( + maxHeight: 55, + title: "Cancel", + onPressed: () {}, + backgroundColor: MyColors.redColor, + ), + ), + if (appointmentListModel.appointmentStatusID == 1) ...[ + 12.width, + Expanded( + child: ShowFillButton( + maxHeight: 55, + title: "Confirm", + onPressed: () {}, + backgroundColor: MyColors.greenColor, + ), + ), + ], + ], + ), + ), + ], + ), + ), + ); + } +} diff --git a/lib/views/appointments/book_appointment_services_view.dart b/lib/views/appointments/book_appointment_services_view.dart new file mode 100644 index 0000000..71f4bb3 --- /dev/null +++ b/lib/views/appointments/book_appointment_services_view.dart @@ -0,0 +1,325 @@ +import 'package:car_customer_app/view_models/appointments_view_model.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/models/widgets_models.dart'; +import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/views/advertisement/custom_add_button.dart'; +import 'package:mc_common_app/widgets/button/show_fill_button.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; +import 'package:mc_common_app/widgets/txt_field.dart'; +import 'package:provider/provider.dart'; + +class BookAppointmentServicesView extends StatelessWidget { + const BookAppointmentServicesView({Key? key}) : super(key: key); + + void openTheAddServiceBottomSheet(BuildContext context) { + showModalBottomSheet( + context: context, + isScrollControlled: true, + enableDrag: true, + builder: (BuildContext context) { + AppointmentsVM appointmentsVM = context.watch(); + return SizedBox( + height: MediaQuery.of(context).size.height * 0.85, + child: Column( + children: [ + Container( + margin: const EdgeInsets.all(8), + height: 8, + width: 60, + decoration: const BoxDecoration(color: MyColors.lightTextColor, borderRadius: BorderRadius.all(Radius.circular(20))), + ), + 12.height, + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + "Select Category".toText(fontSize: 24, isBold: true), + ], + ), + 30.height, + Expanded( + child: ListView( + children: [ + Builder( + builder: (context) { + List serviceCategories = []; + for (var element in appointmentsVM.providerCategories) { + if (!element.isSelected!) { + serviceCategories.add(DropValue(element.id?.toInt() ?? 0, element.categoryName ?? "", "")); + } + } + return DropdownField( + (DropValue value) => appointmentsVM.updateProviderCategoryId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)), + list: serviceCategories, + hint: "Select Category", + dropdownValue: appointmentsVM.providerCategoryId.selectedId != -1 + ? DropValue(appointmentsVM.providerCategoryId.selectedId, appointmentsVM.providerCategoryId.selectedOption, "") + : null, + ); + }, + ), + if (appointmentsVM.isFetchingServices) ...[ + Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [const CircularProgressIndicator().paddingAll(10)], + ), + ] else if (appointmentsVM.providerServices.isNotEmpty) ...[ + 8.height, + Builder( + builder: (context) { + List serviceCategories = []; + for (var element in appointmentsVM.providerServices) { + if (!element.isSelected!) { + serviceCategories.add(DropValue(element.id?.toInt() ?? 0, element.id.toString(), "")); + } + } + return DropdownField( + (DropValue value) => appointmentsVM.updateProviderServiceId(SelectionModel(selectedId: value.id, selectedOption: value.value, itemPrice: value.subValue)), + list: serviceCategories, + hint: "Select Services", + dropdownValue: appointmentsVM.providerServiceId.selectedId != -1 + ? DropValue(appointmentsVM.providerServiceId.selectedId, appointmentsVM.providerServiceId.selectedOption, "") + : null, + ); + }, + ), + ], + if (appointmentsVM.providerServiceId.selectedId != -1 && !appointmentsVM.isFetchingServices) ...[ + 16.height, + Row( + children: [ + "Select Service Location".toText( + fontSize: 16, + isBold: true, + color: MyColors.black, + ), + ], + ), + 8.height, + Row( + children: [ + Expanded( + child: ShowFillButton( + isFilled: appointmentsVM.isHomeTapped, + maxHeight: 48, + title: "Home", + txtColor: appointmentsVM.isHomeTapped ? MyColors.white : MyColors.darkTextColor, + onPressed: () => appointmentsVM.updateIsHomeTapped(true), + ), + ), + 12.width, + Expanded( + child: ShowFillButton( + isFilled: !appointmentsVM.isHomeTapped, + txtColor: !appointmentsVM.isHomeTapped ? MyColors.white : MyColors.darkTextColor, + maxHeight: 48, + title: "Workshop", + onPressed: () => appointmentsVM.updateIsHomeTapped(false), + ), + ), + ], + ), + if (appointmentsVM.isHomeTapped) ...[ + 8.height, + TxtField( + hint: 'Pick Home Location', + value: appointmentsVM.pickedHomeLocation, + isNeedClickAll: true, + postfixData: Icons.location_on, + postFixDataColor: MyColors.darkTextColor, + onTap: () { + //TODO: open the place picked to pick the location and save it in provider. + appointmentsVM.updatePickedHomeLocation("PM58+F97, Al Olaya, Riyadh 12333"); + }, + ), + 14.height, + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Icon( + Icons.warning, + color: MyColors.adPendingStatusColor, + size: 19, + ).paddingOnly(bottom: 2), + 3.width, + "Some services are not available on home location.".toText( + color: MyColors.adPendingStatusColor, + fontSize: 12, + isItalic: true, + ), + ], + ), + ] + ], + ], + ), + ), + SizedBox( + width: double.infinity, + child: Column( + children: [ + if (appointmentsVM.isHomeTapped && !appointmentsVM.isFetchingServices) ...[ + const Divider(thickness: 1, height: 1), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + // TODO: This Price will be decided according to the service selected + 150.toString().toText(fontSize: 30, isBold: true), + "SAR".toText(fontSize: 15, isBold: true, color: MyColors.lightTextColor).paddingOnly(bottom: 5), + ], + ), + "These charges are additional to the actual service charges. For heavy items the charges may vary.".toText(fontSize: 12, color: MyColors.lightTextColor), + 22.height, + ], + SizedBox( + width: double.infinity, + child: ShowFillButton( + maxHeight: 55, + title: "Next", + onPressed: () {}, + ), + ), + ], + ), + ).paddingOnly(bottom: 20) + ], + )).horPaddingMain(); + }, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar( + title: "Book Appointment", + isRemoveBackButton: false, + isDrawerEnabled: false, + actions: [MyAssets.searchIcon.buildSvg().paddingOnly(right: 21)], + onBackButtonTapped: () => Navigator.pop(context), + ), + body: Consumer( + builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + 21.height, + CustomAddButton( + onTap: () => {openTheAddServiceBottomSheet(context)}, + text: "Add Services", + icon: Container( + height: 24, + width: 24, + decoration: const BoxDecoration(shape: BoxShape.circle, color: MyColors.darkTextColor), + child: const Icon(Icons.add, color: MyColors.white), + ), + ), + // 20.height, + // ListView.builder( + // physics: const NeverScrollableScrollPhysics(), + // shrinkWrap: true, + // itemCount: adVM.specialServiceCards.length, + // itemBuilder: (BuildContext context, int index) { + // SpecialServiceCard specialServicesCard = adVM.specialServiceCards[index]; + // return Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // Column( + // children: [ + // Row( + // mainAxisAlignment: MainAxisAlignment.spaceBetween, + // children: [ + // Expanded( + // child: specialServicesCard.serviceSelectedId!.selectedOption.toText(fontSize: 16, isBold: true), + // ), + // Align( + // alignment: Alignment.topRight, + // child: MyAssets.closeWithOrangeBg.buildSvg( + // fit: BoxFit.fill, + // height: 30, + // width: 30, + // ), + // ).onPress(() => adVM.removeSpecialServiceCard(index)) + // ], + // ), + // Builder(builder: (context) { + // return Column( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // if (specialServicesCard.serviceSelectedId!.selectedId != 1 && specialServicesCard.serviceSelectedId!.selectedId != 3) ...[ + // // Row( + // // crossAxisAlignment: CrossAxisAlignment.start, + // // children: [ + // // "Duration: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + // // (specialServicesCard.duration ?? "").toText(fontSize: 12, isBold: true).expand(), + // // ], + // // ), + // 8.height, + // Row( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // "Description: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + // (specialServicesCard.description ?? "").toText(fontSize: 12, isBold: true).expand(), + // ], + // ), + // ], + // if (specialServicesCard.serviceSelectedId!.selectedId == 1 || specialServicesCard.serviceSelectedId!.selectedId == 3) ...[ + // Row( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // const Icon( + // weight: 2, + // Icons.location_on_outlined, + // color: MyColors.primaryColor, + // size: 17, + // ), + // "${specialServicesCard.duration} km".toText(fontSize: 10, color: MyColors.primaryColor), + // ], + // ), + // 8.height, + // Row( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // "Branch Address: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + // (specialServicesCard.address ?? "").toText(fontSize: 12, isBold: true).expand(), + // ], + // ), + // Row( + // crossAxisAlignment: CrossAxisAlignment.start, + // children: [ + // "Appointment Time: ".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + // "${specialServicesCard.serviceDate} - ${specialServicesCard.serviceTime}".toText(fontSize: 12, isBold: true).expand(), + // ], + // ), + // ], + // 6.height, + // Row( + // crossAxisAlignment: CrossAxisAlignment.end, + // children: [ + // (specialServicesCard.serviceSelectedId!.itemPrice).toText(fontSize: 20, isBold: true), + // 2.width, + // "SAR".toText(color: MyColors.lightTextColor, fontSize: 14), + // ], + // ), + // ], + // ); + // }), + // 3.height, + // const Divider(thickness: 1.5) + // ], + // ), + // 10.height, + // ], + // ); + // }, + // ), + ], + ); + }, + ).horPaddingMain()); + } +} diff --git a/lib/views/appointments/pick_items_view.dart b/lib/views/appointments/pick_items_view.dart new file mode 100644 index 0000000..bd8c1e6 --- /dev/null +++ b/lib/views/appointments/pick_items_view.dart @@ -0,0 +1,168 @@ +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/button/show_fill_button.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/common_widgets/provider_details_card.dart'; +import 'package:mc_common_app/widgets/common_widgets/time_slots.dart'; +import 'package:mc_common_app/widgets/dropdown/dropdow_field.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; + +class BookProviderAppView extends StatefulWidget { + const BookProviderAppView({Key? key}) : super(key: key); + + @override + State createState() => _BookProviderAppViewState(); +} + +class _BookProviderAppViewState extends State { + bool isReview = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar( + title: "Appointment", + profileImageUrl: MyAssets.bnCar, + isRemoveBackButton: false, + isDrawerEnabled: false, + ), + body: Container( + color: MyColors.backgroundColor, + width: double.infinity, + height: double.infinity, + child: Column( + children: [ + Expanded( + child: ListView( + children: [ + ProviderDetailsCard( + onCardTapped: () {}, + providerImageUrl: MyAssets.bnCar, + providerLocation: "3km", + title: "Al Ahmed Maintenance", + providerRatings: "4.9", + ), + 12.height, + isReview ? ReviewAppointmentSection() : ServicesSelectionSection(), + 10.height, + ], + ), + ), + 10.height, + Padding( + padding: const EdgeInsets.only(bottom: 10, left: 21, right: 21), + child: ShowFillButton( + title: "Book Appointment", + maxWidth: double.infinity, + onPressed: () { + isReview = !isReview; + setState(() {}); + }, + ), + ), + ], + ), + ), + ); + } +} + +class ServicesSelectionSection extends StatelessWidget { + const ServicesSelectionSection({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + List dropList = [ + DropValue(0, "Maintenance", ""), + DropValue(1, "Car Wash", ""), + DropValue(2, "Monthly Checkup", ""), + DropValue(3, "Friendly Visit", ""), + DropValue(4, "Muftaa", ""), + ]; + return Container( + padding: const EdgeInsets.only(bottom: 10, left: 21, right: 21), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Select services you want".toText(fontSize: 18, isBold: true), + 8.height, + DropdownField( + (DropValue value) {}, + list: dropList, + hint: "Select service type", + ), + 8.height, + DropdownField( + (DropValue value) {}, + list: dropList, + hint: "Select service type", + ), + 8.height, + DropdownField( + (DropValue value) {}, + list: dropList, + hint: "Select service type", + ), + 22.height, + "Select date and time".toText(fontSize: 18, isBold: true), + 8.height, + DropdownField( + (DropValue value) {}, + list: dropList, + hint: "Select service type", + ), + 22.height, + "Available slots".toText(fontSize: 15, isBold: true), + 8.height, + BuildTimeSlots(onPressed: (index) {}, timeSlots: []), + 22.height, + "Total Amount".toText(fontSize: 18, isBold: true), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + "3000".toText(fontSize: 20, isBold: true), + "SAR".toText(fontSize: 10, isBold: true, color: MyColors.lightTextColor), + ], + ), + 10.height, + ], + ).toWhiteContainer(width: double.infinity, allPading: 12), + ); + } +} + +class ReviewAppointmentSection extends StatelessWidget { + const ReviewAppointmentSection({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + padding: const EdgeInsets.only(bottom: 10, left: 21, right: 21), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Review Appointment".toText(fontSize: 18, isBold: true), + 15.height, + "Services".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), + "Car Engine Check".toText(fontSize: 18, isBold: true), + 13.height, + "Date and Time".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), + "2 Feb, 2023 at 09:00am".toText(fontSize: 18, isBold: true), + 13.height, + "Total Amount".toText(fontSize: 14, isBold: true, color: MyColors.lightTextColor), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + "3000".toText(fontSize: 20, isBold: true), + "SAR".toText(fontSize: 10, isBold: true, color: MyColors.lightTextColor), + ], + ), + 100.height, + ], + ).toWhiteContainer(width: double.infinity, allPading: 12), + ); + } +} diff --git a/lib/views/appointments/widgets/customer_appointment_slider_widget.dart b/lib/views/appointments/widgets/customer_appointment_slider_widget.dart new file mode 100644 index 0000000..7cfb819 --- /dev/null +++ b/lib/views/appointments/widgets/customer_appointment_slider_widget.dart @@ -0,0 +1,199 @@ +import 'package:carousel_slider/carousel_slider.dart'; +import 'package:flutter/material.dart'; +import 'package:flutter_svg/svg.dart'; +import 'package:mc_common_app/classes/consts.dart'; +import 'package:mc_common_app/config/routes.dart'; +import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/models/appointments_models/appointment_list_model.dart'; +import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/utils/navigator.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; + +class CustomerAppointmentSliderWidget extends StatelessWidget { + final List myUpComingAppointments; + + const CustomerAppointmentSliderWidget({Key? key, required this.myUpComingAppointments}) : super(key: key); + + @override + Widget build(BuildContext context) { + if (myUpComingAppointments.isEmpty) { + return InkWell( + child: Container( + height: 86, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Container( + height: 24, + width: 24, + decoration: BoxDecoration(shape: BoxShape.circle, color: MyColors.darkTextColor), + child: Icon( + Icons.add, + color: MyColors.white, + ), + ), + SizedBox(width: 10), + "Add New Appointment".toText( + fontSize: 15, + isBold: true, + color: MyColors.lightTextColor, + ), + ], + ), + ), + ).toWhiteContainer(width: double.infinity, margin: EdgeInsets.symmetric(horizontal: 21, vertical: 10)); + } + return CarouselSlider.builder( + options: CarouselOptions( + height: 140, + viewportFraction: 1.0, + enlargeCenterPage: false, + enableInfiniteScroll: false, + ), + itemCount: myUpComingAppointments.length, + itemBuilder: (BuildContext context, int itemIndex, int pageViewIndex) => BuildAppointmentContainerForCustomer( + isForHome: true, + appointmentListModel: myUpComingAppointments[itemIndex], + onTapped: () => navigateWithName(context, AppRoutes.appointmentDetailView, arguments: myUpComingAppointments[itemIndex]), + ), + ); + } +} + +class BuildAppointmentContainerForCustomer extends StatelessWidget { + final bool? isForHome; + final AppointmentListModel? appointmentListModel; + final Function() onTapped; + + const BuildAppointmentContainerForCustomer({Key? key, this.isForHome = false, required this.onTapped, required this.appointmentListModel}) : super(key: key); + + Widget showServices(String title, String icon, {bool isMoreText = false}) { + return Row( + children: [ + if (icon != "") ...[ + SvgPicture.asset(icon), + 8.width, + ], + Flexible( + child: title.toText( + fontSize: 12, + isBold: true, + color: isMoreText ? MyColors.primaryColor : MyColors.black, + ), + ), + ], + ); + } + + List buildServicesFromAppointment({required AppointmentListModel appointmentListModel}) { + if (appointmentListModel.serviceAppointmentItems == null || appointmentListModel.serviceAppointmentItems!.isEmpty) { + return [SizedBox()]; + } + + if (appointmentListModel.serviceAppointmentItems!.length == 1) { + return [ + showServices( + appointmentListModel.serviceAppointmentItems![0].serviceItemName!, + MyAssets.modificationsIcon, + ) + ]; + } + + List servicesList = List.generate( + 2, + (index) => showServices( + appointmentListModel.serviceAppointmentItems![index].serviceItemName!, + MyAssets.modificationsIcon, + ), + ); + + if (appointmentListModel.serviceAppointmentItems!.length > 1) { + servicesList.add( + showServices( + "+ ${appointmentListModel.serviceAppointmentItems!.length - 1} More", + "", + isMoreText: true, + ), + ); + } + return servicesList; + } + + @override + Widget build(BuildContext context) { + return Container( + margin: const EdgeInsets.only(bottom: 10, left: 21, right: 21), + child: Column( + children: [ + Row( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + isForHome != null && isForHome! + ? Image.asset( + MyAssets.bnCar, + width: 56, + height: 56, + fit: BoxFit.fill, + ).toCircle(borderRadius: 100) + : Image.asset( + MyAssets.bnCar, + width: 80, + height: 85, + fit: BoxFit.cover, + ), + 8.width, + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + (appointmentListModel!.providerName ?? "").toText(color: MyColors.black, isBold: true, fontSize: 16), + Row( + children: [ + MyAssets.miniClock.buildSvg(height: 12), + 2.width, + "${appointmentListModel!.duration ?? ""} ${appointmentListModel!.appointmentDate!.toFormattedDateWithoutTime()}".toText( + color: MyColors.lightTextColor, + fontSize: 12, + ), + ], + ), + 9.height, + isForHome != null && isForHome! + ? 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), + ], + ) + : Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + Expanded( + child: Column( + children: buildServicesFromAppointment(appointmentListModel: appointmentListModel!), + ), + ), + const Icon( + Icons.arrow_forward, + ), + ], + ), + ], + ), + ), + ], + ), + ], + ).onPress(onTapped).toWhiteContainer(width: double.infinity, allPading: 12), + ); + } +} diff --git a/lib/views/dashboard/dashboard_page.dart b/lib/views/dashboard/dashboard_page.dart index 0b4fec2..1c9fa86 100644 --- a/lib/views/dashboard/dashboard_page.dart +++ b/lib/views/dashboard/dashboard_page.dart @@ -1,22 +1,24 @@ -import 'package:car_customer_app/classes/app_state.dart'; -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/config/routes.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/extensions/widget_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/models/user/image_response.dart'; -import 'package:car_customer_app/theme/colors.dart'; -import 'package:car_customer_app/utils/navigator.dart'; -import 'package:car_customer_app/utils/utils.dart'; +import 'dart:async'; + +import 'package:car_customer_app/view_models/appointments_view_model.dart'; import 'package:car_customer_app/view_models/dashboard_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:easy_localization/easy_localization.dart'; +import 'package:car_customer_app/view_models/providers_view_model.dart'; +import 'package:car_customer_app/views/dashboard/fragments/ads_fragment.dart'; +import 'package:car_customer_app/views/dashboard/fragments/appointments_fragment.dart'; +import 'package:car_customer_app/views/dashboard/fragments/home_fragment.dart'; +import 'package:car_customer_app/views/dashboard/fragments/providers_fragment.dart'; +import 'package:car_customer_app/views/dashboard/fragments/settings_fragment.dart'; +import 'package:car_customer_app/views/dashboard/widgets/bottom_nav_bar.dart'; +import 'package:car_customer_app/views/dashboard/widgets/drawer_widget.dart'; import 'package:flutter/material.dart'; -import 'package:image_picker/image_picker.dart'; +import 'package:mc_common_app/classes/consts.dart'; +import 'package:mc_common_app/view_models/ad_view_model.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; import 'package:provider/provider.dart'; +import 'fragments/branches_fragment.dart'; + class DashboardPage extends StatefulWidget { const DashboardPage({Key? key}) : super(key: key); @@ -25,195 +27,81 @@ class DashboardPage extends StatefulWidget { } class _DashboardPageState extends State { - late DashboardVM dashboardVM; + // late DashboardVM dashboardVM; @override void initState() { super.initState(); - dashboardVM = Provider.of(context, listen: false); + // dashboardVM = Provider.of(context, listen: false); fetchUsername(); + scheduleMicrotask(() { + context.read().populateAppointmentsFilterList(); + context.read().populateProvidersFilterList(); + context.read().populateAdsFilterList(); + context.read().getAllNearBranches(); + _onRefresh(); + }); + } + + Future _onRefresh() async { + AdVM adVm = Provider.of(context, listen: false); + AppointmentsVM appointmentsVM = Provider.of(context, listen: false); + if (appointmentsVM.myAppointments.isEmpty) { + await appointmentsVM.getMyAppointments(); + } + if (adVm.myAds.isEmpty) { + await adVm.getMyAds(); + } + if (adVm.exploreAds.isEmpty) { + await adVm.getExploreAds(); + } } fetchUsername() async {} - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: appBar(context, title: "Logo/Brand", isRemoveBackButton: true), - drawer: showDrawer(context), - body: Center( - child: LocaleKeys.dashboard.tr().toText( - height: 23 / 24, - fontSize: 24, - letterSpacing: -1.44, - ), - ), - ); - } + List fragments = [ + const BranchesFragment(), + const AppointmentsFragment(), + const HomeFragment(), + AdsFragment(), + const SettingsFragment(), + ]; - Widget showDrawer(BuildContext context) { - return Drawer( - child: Column( - children: [ - Stack( - children: [ - Container( - width: double.infinity, - height: 200, - color: MyColors.darkPrimaryColor.withOpacity(0.01), - child: Image.network( - ApiConsts.baseUrlServices + AppState().getUser.data!.userInfo!.userImageUrl.toString(), - ), - ), - Positioned( - top: 10, - right: 10, - child: Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Column( - children: [ - Container( - width: 40, - height: 40, - decoration: BoxDecoration( - color: Colors.grey[200], - borderRadius: BorderRadius.circular(30), - ), - child: const Icon( - Icons.edit, - color: MyColors.darkPrimaryColor, - ).onPress(() { - _openImagePicker(); - // _handleURLButtonPress(context, ImageSourceType.camera); - }), - ), - 12.height, - Container( - width: 40, - height: 40, - decoration: BoxDecoration( - color: Colors.grey[200], - borderRadius: BorderRadius.circular(30), - ), - child: const Icon( - Icons.delete, - color: Colors.red, - ).onPress(() async { - Utils.showLoading(context); - ImageResponse response = await dashboardVM.updateUserImage(""); - if (response.messageStatus == 1) { - Utils.showToast("Image is Deleted"); - setState(() { - AppState().getUser.data!.userInfo!.userImageUrl = response.data; - }); - } - Utils.hideLoading(context); - }), - ), - ], - ), - ], - ), - ) - ], - ), - Container( - width: double.infinity, - color: MyColors.darkPrimaryColor.withOpacity(0.1), - padding: const EdgeInsets.all(20), - child: Row( - children: [ - Expanded( - child: Column( - mainAxisAlignment: MainAxisAlignment.start, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - "userName".toText( - isBold: true, - fontSize: 20, - letterSpacing: -1.44, - ), - AppState().getUser.data!.userInfo!.roleName!.toText(fontSize: 10), - ], - ), - ), - ShowFillButton( - title: LocaleKeys.edit.tr(), - fontSize: 12, - maxHeight: 35, - maxWidth: 70, - onPressed: () { - navigateWithName(context, AppRoutes.editAccountPage); - }, - ), - ], - ), - ), - ListTile( - leading: const Icon( - Icons.notifications, - color: MyColors.darkPrimaryColor, - ), - title: LocaleKeys.notifications.tr().toText(fontSize: 12), - ), - ListTile( - leading: const Icon( - Icons.settings, - color: MyColors.darkPrimaryColor, - ), - title: LocaleKeys.general.tr().toText(fontSize: 12), - ), - ListTile( - leading: const Icon( - Icons.person, - color: MyColors.darkPrimaryColor, - ), - title: LocaleKeys.account.tr().toText(fontSize: 12), - ), - ListTile( - leading: Image.asset( - "assets/images/ic_world.png", - width: 20, - height: 20, - color: MyColors.darkPrimaryColor, - ), - title: LocaleKeys.english.tr().toText(fontSize: 12), - onTap: () { - if (EasyLocalization.of(context)?.currentLocale?.countryCode == "SA") { - context.setLocale(const Locale("en", "US")); - } else { - context.setLocale(const Locale('ar', 'SA')); - } - }, - ), - ListTile( - leading: const Icon( - Icons.logout, - color: MyColors.darkPrimaryColor, - ), - title: LocaleKeys.signOut.tr().toText(fontSize: 12), - onTap: () { - pop(context); - navigateReplaceWithName(context, AppRoutes.registerSelection); - }, - ), - ], - ), - ); + String getPageTitle(int index) { + if (index == 0) { + return "Branchs"; + } + if (index == 1) { + return "Appointments"; + } + if (index == 2) { + return ""; + } + if (index == 3) { + return "Ads"; + } + if (index == 4) { + return ""; + } + return ""; } - void _openImagePicker() { - showDialog( - context: context, - builder: (context) => AlertDialog( - content: const Text("Choose image source"), - actions: [ - TextButton(child: const Text("Camera"), onPressed: () => dashboardVM.pickImageFromPhone(context, 0)), - TextButton(child: const Text("Gallery"), onPressed: () => dashboardVM.pickImageFromPhone(context, 1)), - ], + @override + Widget build(BuildContext context) { + bool isHomePage = context.watch().selectedNavbarBarIndex == 2; + return Scaffold( + appBar: CustomAppBar( + backgroundColor: null, + leadingWidth: 100, + title: getPageTitle(context.watch().selectedNavbarBarIndex), + profileImageUrl: MyAssets.bnCar, + isRemoveBackButton: true, + isDrawerEnabled: isHomePage ? true : false, + actions: [(isHomePage ? MyAssets.notificationsBellIcon : MyAssets.searchIcon).buildSvg().paddingOnly(right: 21)], ), + drawer: CustomDrawer(dashboardVM: context.watch()), + bottomNavigationBar: CustomBottomNavbar(), + body: fragments[context.watch().selectedNavbarBarIndex], ); } } diff --git a/lib/views/dashboard/fragments/ads_fragment.dart b/lib/views/dashboard/fragments/ads_fragment.dart new file mode 100644 index 0000000..d13952c --- /dev/null +++ b/lib/views/dashboard/fragments/ads_fragment.dart @@ -0,0 +1,118 @@ +import 'package:flutter/material.dart'; +import 'package:mc_common_app/classes/app_state.dart'; +import 'package:mc_common_app/config/routes.dart'; +import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/utils/navigator.dart'; +import 'package:mc_common_app/view_models/ad_view_model.dart'; +import 'package:mc_common_app/views/advertisement/ads_list.dart'; +import 'package:mc_common_app/widgets/button/show_fill_button.dart'; +import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; +import 'package:provider/provider.dart'; + +class AdsFragment extends StatelessWidget { + AdsFragment({Key? key}) : super(key: key); + + Future onRefreshAds(BuildContext context) async { + AdVM adVM = context.read(); + await adVM.getExploreAds(); + await adVM.getMyAds(); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + body: Container( + color: MyColors.backgroundColor, + width: double.infinity, + height: double.infinity, + child: Column( + children: [ + 16.height, + Consumer( + builder: (BuildContext context, AdVM adVM, Widget? child) { + return Column( + children: [ + Row( + children: [ + Expanded( + child: ShowFillButton( + isFilled: adVM.isExploreAdsTapped, + maxHeight: 55, + title: "Explore Ads", + txtColor: adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, + onPressed: () { + print("ads: ${AppState().getUser.data!.accessToken}"); + adVM.updateIsExploreAds(true); + }, + ), + ), + 12.width, + Expanded( + child: ShowFillButton( + isFilled: !adVM.isExploreAdsTapped, + txtColor: !adVM.isExploreAdsTapped ? MyColors.white : MyColors.darkTextColor, + maxHeight: 55, + title: "My Ads", + onPressed: () { + adVM.updateIsExploreAds(false); + }, + ), + ), + ], + ).horPaddingMain(), + if (adVM.isExploreAdsTapped && adVM.exploreAds.isNotEmpty) ...[ + 16.height, + FiltersList(filterList: adVM.exploreAdsFilterOptions, onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnExploreAds(index: index), needLeftPadding: false) + .paddingOnly(left: 21), + ], + if (!adVM.isExploreAdsTapped && adVM.myAds.isNotEmpty) ...[ + 16.height, + FiltersList( + filterList: adVM.myAdsFilterOptions, + onFilterTapped: (index, selectedFilterId) => adVM.applyFilterOnMyAds(index: index, selectedFilterId: selectedFilterId), + needLeftPadding: false) + .paddingOnly(left: 21), + ], + ], + ); + }, + ), + 16.height, + Expanded( + child: RefreshIndicator( + onRefresh: () => onRefreshAds(context), + child: Consumer( + builder: (BuildContext context, AdVM adVM, Widget? child) { + return BuildAdsList( + isAdsFragment: true, + shouldShowAdStatus: !adVM.isExploreAdsTapped, + adsList: adVM.isExploreAdsTapped && adVM.exploreAdsFilteredList.isNotEmpty + ? adVM.exploreAdsFilteredList + : !adVM.isExploreAdsTapped && adVM.myAdsFilteredList.isNotEmpty + ? adVM.myAdsFilteredList + : [], + ); + }, + ), + ), + ) + ], + ), + ), + floatingActionButton: FloatingActionButton( + onPressed: () { + context.read().getVehicleTypes(); + + navigateWithName(context, AppRoutes.createAdView); + }, + backgroundColor: MyColors.darkPrimaryColor, + child: Icon( + Icons.add, + color: MyColors.white, + ), + ), + ); + } +} diff --git a/lib/views/dashboard/fragments/appointments_fragment.dart b/lib/views/dashboard/fragments/appointments_fragment.dart new file mode 100644 index 0000000..137ae1e --- /dev/null +++ b/lib/views/dashboard/fragments/appointments_fragment.dart @@ -0,0 +1,56 @@ +import 'package:car_customer_app/view_models/appointments_view_model.dart'; +import 'package:car_customer_app/views/appointments/widgets/customer_appointment_slider_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:mc_common_app/config/routes.dart'; +import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/utils/navigator.dart'; +import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; +import 'package:provider/provider.dart'; + +class AppointmentsFragment extends StatelessWidget { + const AppointmentsFragment({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + color: MyColors.backgroundColor, + width: double.infinity, + height: double.infinity, + child: Consumer( + builder: (BuildContext context, AppointmentsVM appointmentsVM, Widget? child) { + return Column( + children: [ + 16.height, + FiltersList( + filterList: appointmentsVM.appointmentsFilterOptions, + onFilterTapped: (index, selectedFilterId) => appointmentsVM.applyFilterOnAppointmentsVM(index: index), + ), + 16.height, + Expanded( + child: appointmentsVM.myAppointments.isEmpty + ? Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + "No Appointments to show.".toText(fontSize: 16, color: MyColors.lightTextColor), + ], + ) + : ListView.builder( + shrinkWrap: true, + itemCount: appointmentsVM.myAppointments.length, + itemBuilder: (BuildContext context, int index) { + return BuildAppointmentContainerForCustomer( + onTapped: () => navigateWithName(context, AppRoutes.appointmentDetailView, arguments: appointmentsVM.myAppointments[index]), + appointmentListModel: appointmentsVM.myAppointments[index], + ); + }, + ), + ), + ], + ); + }, + ), + ); + } +} diff --git a/lib/views/dashboard/fragments/branches_fragment.dart b/lib/views/dashboard/fragments/branches_fragment.dart new file mode 100644 index 0000000..d0ab34c --- /dev/null +++ b/lib/views/dashboard/fragments/branches_fragment.dart @@ -0,0 +1,86 @@ +import 'package:car_customer_app/view_models/providers_view_model.dart'; +import 'package:flutter/material.dart'; + +import 'package:mc_common_app/classes/consts.dart'; +import 'package:mc_common_app/config/routes.dart'; +import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/generated/locale_keys.g.dart'; +import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/utils/enums.dart'; +import 'package:mc_common_app/utils/navigator.dart'; +import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; +import 'package:mc_common_app/widgets/common_widgets/provider_details_card.dart'; +import 'package:provider/provider.dart'; +import 'package:easy_localization/easy_localization.dart'; + +class BranchesFragment extends StatelessWidget { + const BranchesFragment({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + color: MyColors.backgroundColor, + width: double.infinity, + height: double.infinity, + child: Consumer( + builder: (BuildContext context, ProvidersVM providersVM, Widget? child) { + return Column( + children: [ + 16.height, + FiltersList( + filterList: providersVM.providersFilterOptions, + onFilterTapped: (index, selectedFilterId) => providersVM.applyFilterOnProviders(index: index), + ), + 16.height, + Expanded( + child: RefreshIndicator( + onRefresh: () async { + context.read().getAllNearBranches(isNeedToRebuild: true); + }, + child: SingleChildScrollView( + child: Container( + width: double.infinity, + height: MediaQuery.of(context).size.height / 1.37, + child: Consumer( + builder: (context, model, _) { + if (model.state == ViewState.busy) { + return const Center(child: CircularProgressIndicator()); + } else { + return model.branches?.data == null + ? const Center(child: Text("No Branch Found")) + : model.branches!.data!.isEmpty + ? Center(child: Text(LocaleKeys.no_branch.tr())) + : ListView.separated( + itemBuilder: (context, index) { + return ProviderDetailsCard( + onCardTapped: () { + navigateWithName(context, AppRoutes.branchDetailPage, arguments: model.branches!.data![index]); + }, + providerImageUrl: MyAssets.bnCar, + title: model.branches!.data![index].branchName ?? "", + providerLocation: model.branches!.data![index].distanceKm.toString() + " KM", + providerName: model.branches!.data![index].serviceProviderName ?? "", + providerRatings: "4.9", + items: model.branches!.data![index].branchServices, + ); + }, + separatorBuilder: (context, index) { + return 12.height; + }, + itemCount: model.branches!.data!.length, + padding: const EdgeInsets.all(12), + ); + } + }, + ), + ), + ), + ), + ), + ], + ); + }, + ), + ); + } +} diff --git a/lib/views/dashboard/fragments/home_fragment.dart b/lib/views/dashboard/fragments/home_fragment.dart new file mode 100644 index 0000000..c7c4d6b --- /dev/null +++ b/lib/views/dashboard/fragments/home_fragment.dart @@ -0,0 +1,106 @@ +import 'package:car_customer_app/view_models/appointments_view_model.dart'; +import 'package:car_customer_app/view_models/dashboard_view_model.dart'; +import 'package:car_customer_app/view_models/providers_view_model.dart'; +import 'package:car_customer_app/views/appointments/widgets/customer_appointment_slider_widget.dart'; +import 'package:flutter/material.dart'; +import 'package:mc_common_app/classes/app_state.dart'; +import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/view_models/ad_view_model.dart'; +import 'package:mc_common_app/views/advertisement/ads_list.dart'; +import 'package:mc_common_app/widgets/common_widgets/my_service_provider.dart'; +import 'package:mc_common_app/widgets/common_widgets/view_all_widget.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; +import 'package:provider/provider.dart'; + +class HomeFragment extends StatelessWidget { + const HomeFragment({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return SizedBox( + width: double.infinity, + height: double.infinity, + child: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.only(top: 8), + child: Column( + mainAxisSize: MainAxisSize.max, + children: [ + 16.height, + ViewAllWidget( + title: "Upcoming Appointment".toUpperCase(), + subTitle: "View All", + onSubtitleTapped: () { + context.read().onNavbarTapped(1); + context.read().applyFilterOnAppointmentsVM(index: 0); + }, + ).horPaddingMain(), + CustomerAppointmentSliderWidget(myUpComingAppointments: context.watch().myAppointments), + 7.height, + ViewAllWidget( + title: "My Recent Service Providers".toUpperCase(), + subTitle: "View All", + onSubtitleTapped: () { + print("value: ${AppState().getUser.data!.accessToken}"); + context.read().onNavbarTapped(0); + context.read().applyFilterOnProviders(index: 0); + }).horPaddingMain(), + const ServiceProviderWidget().horPaddingMain(), + Consumer( + builder: (BuildContext context, AdVM adVM, Widget? child) { + return Column( + children: [ + if (adVM.myActiveAdsForHome.isNotEmpty) ...[ + Column( + children: [ + 15.height, + ViewAllWidget( + title: "My Active Ads".toUpperCase(), + subTitle: "View All", + onSubtitleTapped: () { + context.read().onNavbarTapped(3); + context.read().updateIsExploreAds(false); + }).horPaddingMain(), + BuildAdsList( + shouldShowAdStatus: true, + isAdsFragment: false, + adsList: adVM.myActiveAdsForHome, + scrollPhysics: NeverScrollableScrollPhysics(), + ), + ], + ) + ], + if (adVM.exploreAds.isNotEmpty) ...[ + Column( + children: [ + 15.height, + ViewAllWidget( + title: "My Recommended Ads".toUpperCase(), + subTitle: "View All", + onSubtitleTapped: () { + context.read().onNavbarTapped(3); + context.read().updateIsExploreAds(true); + context.read().applyFilterOnExploreAds(index: 0); + }, + ).horPaddingMain(), + BuildAdsList( + shouldShowAdStatus: false, + adsList: adVM.exploreAds.length >= 3 ? adVM.exploreAds.take(3).toList() : adVM.exploreAds, + isAdsFragment: false, + scrollPhysics: NeverScrollableScrollPhysics(), + ), + ], + ) + ] + ], + ); + }, + ), + 20.height, + ], + ), + ), + ), + ); + } +} diff --git a/lib/views/dashboard/fragments/providers_fragment.dart b/lib/views/dashboard/fragments/providers_fragment.dart new file mode 100644 index 0000000..09e6dab --- /dev/null +++ b/lib/views/dashboard/fragments/providers_fragment.dart @@ -0,0 +1,61 @@ +import 'package:car_customer_app/view_models/appointments_view_model.dart'; +import 'package:car_customer_app/view_models/providers_view_model.dart'; +import 'package:flutter/material.dart'; +import 'package:mc_common_app/classes/consts.dart'; +import 'package:mc_common_app/config/routes.dart'; +import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/utils/navigator.dart'; +import 'package:mc_common_app/widgets/common_widgets/categories_list.dart'; +import 'package:mc_common_app/widgets/common_widgets/provider_details_card.dart'; +import 'package:provider/provider.dart'; + +class ProvidersFragment extends StatelessWidget { + const ProvidersFragment({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container( + color: MyColors.backgroundColor, + width: double.infinity, + height: double.infinity, + child: Consumer( + builder: (BuildContext context, ProvidersVM providersVM, Widget? child) { + return Column( + children: [ + 16.height, + FiltersList( + filterList: providersVM.providersFilterOptions, + onFilterTapped: (index, selectedFilterId) => providersVM.applyFilterOnProviders(index: index), + ), + 16.height, + Expanded( + child: Container( + child: ListView.builder( + shrinkWrap: true, + itemCount: 30, + itemBuilder: (BuildContext context, int index) { + return ProviderDetailsCard( + onCardTapped: () { + if (context.read().providerCategories.isEmpty) { + context.read().getProviderCategories(); + } + navigateWithName(context, AppRoutes.bookAppointmenServicesView); + }, + providerImageUrl: MyAssets.bnCar, + title:"", + providerLocation: " 3km", + providerName: "Al Ahmed Maintenance", + providerRatings: "4.9", + ); + }, + ), + ), + ), + ], + ); + }, + ), + ); + } +} diff --git a/lib/views/dashboard/fragments/settings_fragment.dart b/lib/views/dashboard/fragments/settings_fragment.dart new file mode 100644 index 0000000..b5a47cf --- /dev/null +++ b/lib/views/dashboard/fragments/settings_fragment.dart @@ -0,0 +1,10 @@ +import 'package:flutter/material.dart'; + +class SettingsFragment extends StatelessWidget { + const SettingsFragment({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + return Container(); + } +} diff --git a/lib/views/dashboard/widgets/bottom_nav_bar.dart b/lib/views/dashboard/widgets/bottom_nav_bar.dart new file mode 100644 index 0000000..c7b9159 --- /dev/null +++ b/lib/views/dashboard/widgets/bottom_nav_bar.dart @@ -0,0 +1,61 @@ +import 'package:car_customer_app/view_models/dashboard_view_model.dart'; +import 'package:easy_localization/easy_localization.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/generated/locale_keys.g.dart'; +import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; +import 'package:provider/provider.dart'; + +class CustomBottomNavbar extends StatelessWidget { + const CustomBottomNavbar({Key? key}) : super(key: key); + + @override + Widget build(BuildContext context) { + DashboardVM dashboardVM = context.watch(); + return BottomNavigationBar( + items: [ + BottomNavigationBarItem( + icon: SvgPicture.asset(MyAssets.branchesIcon).paddingAll(5), + activeIcon: SvgPicture.asset(MyAssets.branchesIcon, color: MyColors.darkIconColor).paddingAll(5), + label: LocaleKeys.branches.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: dashboardVM.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) => dashboardVM.onNavbarTapped(index), + ); + } +} diff --git a/lib/views/dashboard/widgets/drawer_widget.dart b/lib/views/dashboard/widgets/drawer_widget.dart new file mode 100644 index 0000000..52a1f80 --- /dev/null +++ b/lib/views/dashboard/widgets/drawer_widget.dart @@ -0,0 +1,194 @@ +import 'package:car_customer_app/view_models/dashboard_view_model.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:image_picker/image_picker.dart'; +import 'package:mc_common_app/classes/app_state.dart'; +import 'package:mc_common_app/classes/consts.dart'; +import 'package:mc_common_app/config/routes.dart'; +import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/generated/locale_keys.g.dart'; +import 'package:mc_common_app/models/user/image_response.dart'; +import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/utils/navigator.dart'; +import 'package:mc_common_app/utils/utils.dart'; +import 'package:mc_common_app/widgets/button/show_fill_button.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; + +class CustomDrawer extends StatefulWidget { + final DashboardVM dashboardVM; + + const CustomDrawer({Key? key, required this.dashboardVM}) : super(key: key); + + @override + State createState() => _CustomDrawerState(); +} + +class _CustomDrawerState extends State { + void _openImagePicker() { + showDialog( + context: context, + builder: (context) => AlertDialog( + content: const Text("Choose image source"), + actions: [ + TextButton(child: const Text("Camera"), onPressed: () => widget.dashboardVM.pickImageFromPhone(context, 0)), + TextButton(child: const Text("Gallery"), onPressed: () => widget.dashboardVM.pickImageFromPhone(context, 1)), + ], + ), + ); + } + + @override + Widget build(BuildContext context) { + return Drawer( + child: Column( + children: [ + Stack( + children: [ + Container( + width: double.infinity, + height: 200, + color: MyColors.darkPrimaryColor.withOpacity(0.01), + child: Image.network( + ApiConsts.baseUrlServices + AppState().getUser.data!.userInfo!.userImageUrl.toString(), + ), + ), + Positioned( + top: 10, + right: 10, + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Column( + children: [ + Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(30), + ), + child: const Icon( + Icons.edit, + color: MyColors.darkPrimaryColor, + ).onPress(() { + _openImagePicker(); + // _handleURLButtonPress(context, ImageSourceType.camera); + }), + ), + 12.height, + Container( + width: 40, + height: 40, + decoration: BoxDecoration( + color: Colors.grey[200], + borderRadius: BorderRadius.circular(30), + ), + child: const Icon( + Icons.delete, + color: Colors.red, + ).onPress(() async { + Utils.showLoading(context); + ImageResponse response = await widget.dashboardVM.updateUserImage(""); + if (response.messageStatus == 1) { + Utils.showToast("Image is Deleted"); + setState(() { + AppState().getUser.data!.userInfo!.userImageUrl = response.data; + }); + } + Utils.hideLoading(context); + }), + ), + ], + ), + ], + ), + ) + ], + ), + Container( + width: double.infinity, + color: MyColors.darkPrimaryColor.withOpacity(0.1), + padding: const EdgeInsets.all(20), + child: Row( + children: [ + Expanded( + child: Column( + mainAxisAlignment: MainAxisAlignment.start, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "userName".toText( + isBold: true, + fontSize: 20, + letterSpacing: -1.44, + ), + AppState().getUser.data!.userInfo!.roleName!.toText(fontSize: 10), + ], + ), + ), + ShowFillButton( + title: LocaleKeys.edit.tr(), + fontSize: 12, + maxHeight: 35, + maxWidth: 70, + onPressed: () { + navigateWithName(context, AppRoutes.editAccountPage); + }, + ), + ], + ), + ), + ListTile( + leading: const Icon( + Icons.notifications, + color: MyColors.darkPrimaryColor, + ), + title: LocaleKeys.notifications.tr().toText(fontSize: 12), + ), + ListTile( + leading: const Icon( + Icons.settings, + color: MyColors.darkPrimaryColor, + ), + title: LocaleKeys.general.tr().toText(fontSize: 12), + ), + ListTile( + leading: const Icon( + Icons.person, + color: MyColors.darkPrimaryColor, + ), + title: LocaleKeys.account.tr().toText(fontSize: 12), + ), + ListTile( + leading: Image.asset( + MyAssets.icWorldPng, + width: 20, + height: 20, + color: MyColors.darkPrimaryColor, + ), + title: LocaleKeys.english.tr().toText(fontSize: 12), + onTap: () { + if (EasyLocalization.of(context)?.currentLocale?.countryCode == "SA") { + context.setLocale(const Locale("en", "US")); + } else { + context.setLocale(const Locale('ar', 'SA')); + } + }, + ), + ListTile( + leading: const Icon( + Icons.logout, + color: MyColors.darkPrimaryColor, + ), + title: LocaleKeys.signOut.tr().toText(fontSize: 12), + onTap: () { + pop(context); + navigateReplaceWithName(context, AppRoutes.registerSelection); + }, + ), + ], + ), + ); + } +} diff --git a/lib/views/provider/branch_detail_page.dart b/lib/views/provider/branch_detail_page.dart new file mode 100644 index 0000000..f9432ae --- /dev/null +++ b/lib/views/provider/branch_detail_page.dart @@ -0,0 +1,225 @@ +import 'package:car_customer_app/views/provider/sheet/items_list_sheet.dart'; +import 'package:flutter/material.dart'; +import 'package:mc_common_app/classes/consts.dart'; +import 'package:mc_common_app/config/routes.dart'; +import 'package:mc_common_app/extensions/int_extensions.dart'; +import 'package:mc_common_app/extensions/string_extensions.dart'; +import 'package:mc_common_app/generated/locale_keys.g.dart'; +import 'package:mc_common_app/models/services/branch_model.dart'; +import 'package:easy_localization/easy_localization.dart'; +import 'package:mc_common_app/models/services/service_model.dart'; +import 'package:mc_common_app/theme/colors.dart'; +import 'package:mc_common_app/utils/navigator.dart'; +import 'package:mc_common_app/widgets/bottom_sheet.dart'; +import 'package:mc_common_app/widgets/button/show_fill_button.dart'; +import 'package:mc_common_app/widgets/common_widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; + +class BranchDetailPage extends StatefulWidget { + BranchModel branchModel; + + BranchDetailPage({required this.branchModel}); + + @override + State createState() => _BranchDetailPageState(); +} + +class _BranchDetailPageState extends State { + @override + void initState() { + // TODO: implement initState + super.initState(); + if (widget.branchModel.branchServices!.length > 0) widget.branchModel.branchServices?.first.isExpanded = true; + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar( + title: "Branch Detail", + ), + body: Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Container( + width: double.infinity, + padding: EdgeInsets.all(21), + child: Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(MyAssets.bnCar), + 12.height, + "${widget.branchModel.branchName} | ${widget.branchModel.serviceProviderName}".toString().toText( + fontSize: 16, + isBold: true, + ), + Row( + children: [ + (LocaleKeys.location.tr() + ":").toText(color: MyColors.lightTextColor, fontSize: 12), + 4.width, + (widget.branchModel.distanceKm.toString() + " km").toText(fontSize: 12, isBold: true), + ], + ), + Row( + children: [ + ("Time" + ":").toText(color: MyColors.lightTextColor, fontSize: 12), + 4.width, + "${widget.branchModel.openTime} - ${widget.branchModel.closeTime}".toText(fontSize: 12, isBold: true), + ], + ), + 2.height, + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + //TODO: Needs to implement url launcher + "Open Map Location".toText( + fontSize: 12, + isBold: true, + color: MyColors.primaryColor, + isUnderLine: true, + ), + 4.width, + Image.asset( + MyAssets.icRightUpPng, + height: 6, + width: 6, + color: MyColors.primaryColor, + ), + ], + ) + .padding( + EdgeInsets.symmetric(vertical: 6, horizontal: 2), + ) + .onPress( + () {}, + ), + Row( + mainAxisAlignment: MainAxisAlignment.center, + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + "Provider Profile".toText( + fontSize: 12, + isBold: true, + color: MyColors.primaryColor, + isUnderLine: true, + ), + 2.width, + Icon( + Icons.arrow_forward, + size: 12, + color: MyColors.primaryColor, + ), + ], + ) + .padding( + EdgeInsets.symmetric(vertical: 6, horizontal: 2), + ) + .onPress( + () { + navigateWithName(context, AppRoutes.providerProfilePage, arguments: widget.branchModel.serviceProviderId); + }, + ), + ], + ), + 20.height, + "Services Offer".toText( + fontSize: 16, + color: MyColors.lightTextColor, + isBold: true, + ), + if (widget.branchModel.branchServices!.length == 0) "No Services Available".toText(fontSize: 12, isBold: true), + showServicesList(), + ], + ).toWhiteContainer( + width: double.infinity, + allPading: 12, + ), + ], + ), + ), + ), + ), + ShowFillButton( + title: "Book Appointment", + maxWidth: double.infinity, + margin: EdgeInsets.all(21), + onPressed: () {}, + ).toContainer( + paddingAll: 0, + backgroundColor: Colors.white, + ), + ], + ), + ); + } + + Widget showServicesList() { + return ListView.separated( + itemBuilder: (context, index) { + return ExpansionTile( + tilePadding: EdgeInsets.zero, + title: (widget.branchModel.branchServices![index].serviceDescription ?? "").toText( + fontSize: 16, + isBold: true, + ), + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + showItem("Allowing home service:", (widget.branchModel.branchServices![index].isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green), + showItem("Home service range", widget.branchModel.branchServices![index].customerLocationRange.toString() + "KM"), + showItem("Charges per KM", widget.branchModel.branchServices![index].customerLocationRange.toString() + "SAR"), + 8.height, + (widget.branchModel.branchServices![index].itemsCount.toString() + "+ items").toText( + fontSize: 12, + isBold: true, + color: MyColors.primaryColor, + isUnderLine: true, + ), + 20.height, + ], + ).onPress(() { + showMyBottomSheet(context, child: ItemsListSheet(widget.branchModel.branchServices![index].providerBranchServiceId ?? 0)); + }), + ], + onExpansionChanged: (value) { + setState(() { + widget.branchModel.branchServices![index].isExpanded = value; + }); + }, + backgroundColor: Colors.transparent, + collapsedBackgroundColor: Colors.transparent, + initiallyExpanded: widget.branchModel.branchServices![index].isExpanded, + trailing: widget.branchModel.branchServices![index].isExpanded ? Icon(Icons.keyboard_arrow_up) : Icon(Icons.keyboard_arrow_down), + ); + }, + separatorBuilder: (context, index) { + return Divider( + height: 1, + ); + }, + itemCount: widget.branchModel.branchServices!.length, + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + ); + } + + Widget showItem(String item, String value, {Color valueColor = Colors.black}) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + item.toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + 4.width, + value.toText(fontSize: 12, color: valueColor, isBold: true), + ], + ); + } +} diff --git a/lib/views/provider/provider_profile_page.dart b/lib/views/provider/provider_profile_page.dart new file mode 100644 index 0000000..84d041f --- /dev/null +++ b/lib/views/provider/provider_profile_page.dart @@ -0,0 +1,80 @@ +import 'package:car_customer_app/view_models/providers_view_model.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/common_widgets/app_bar.dart'; +import 'package:mc_common_app/widgets/empty_widget.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; +import 'package:provider/provider.dart'; + +class ProviderProfilePage extends StatefulWidget { + int providerId; + + ProviderProfilePage({required this.providerId}); + + @override + State createState() => _ProviderProfilePageState(); +} + +class _ProviderProfilePageState extends State { + @override + void initState() { + super.initState(); + context.read().getBranchAndServices(widget.providerId ?? 0); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: CustomAppBar( + title: "Provider Details", + ), + body: Container( + width: double.infinity, + height: double.infinity, + padding: EdgeInsets.all(21), + child: Consumer( + builder: (context, model, _) { + return model.providerModel == null + ? const Center(child: CircularProgressIndicator()) + : model.providerModel!.data == null + ? const EmptyWidget() + : Column( + children: [ + Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + //TODO: company logo/banner not added form provider app yet + Image.asset(MyAssets.bnCar), + 12.height, + model.providerModel!.data!.companyName.toString().toText( + fontSize: 16, + isBold: true, + ), + Row( + children: [ + ("Mowater Member Since:").toText(color: MyColors.lightTextColor, fontSize: 12), + 4.width, + //TODO: date is missing from API side + "2023".toText(fontSize: 12, isBold: true), + ], + ), + 4.height, + //TODO: company description not added form provider app yet + // model.providerModel!.data!.companyDescription!.toText(color: MyColors.lightTextColor, fontSize: 12), + "Some description about the provider and their years of experience and their reputation".toText(color: MyColors.lightTextColor, fontSize: 12), + ], + ).toWhiteContainer( + width: double.infinity, + allPading: 12, + ), + ], + ); + }, + ), + ), + ); + } +} diff --git a/lib/views/provider/sheet/items_list_sheet.dart b/lib/views/provider/sheet/items_list_sheet.dart new file mode 100644 index 0000000..63a8fbf --- /dev/null +++ b/lib/views/provider/sheet/items_list_sheet.dart @@ -0,0 +1,112 @@ +import 'package:flutter_svg/flutter_svg.dart'; +import 'package:flutter/cupertino.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/utils/enums.dart'; +import 'package:mc_common_app/widgets/empty_widget.dart'; +import 'package:mc_common_app/widgets/extensions/extensions_widget.dart'; +import 'package:provider/provider.dart'; + +import '../../../view_models/providers_view_model.dart'; + +class ItemsListSheet extends StatefulWidget { + int serviceId; + + ItemsListSheet(this.serviceId); + + @override + State createState() => _ItemsListSheetState(); +} + +class _ItemsListSheetState extends State { + @override + void initState() { + super.initState(); + context.read().getServiceItems(widget.serviceId ?? 0); + } + + @override + Widget build(BuildContext context) { + return SizedBox( + height: MediaQuery.of(context).size.height / 1.2, + child: Consumer( + builder: (context, model, _) { + return model.serviceItems == null + ? const Center(child: CircularProgressIndicator()) + : model.serviceItems!.data!.isEmpty + ? const EmptyWidget() + : ListView.separated( + itemBuilder: (BuildContext context, int index) { + return SizedBox( + width: double.infinity, + child: Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + model.serviceItems!.data![index].name.toString().toText(fontSize: 16, isBold: true), + 4.height, + showItem("Available for appointment:", (model.serviceItems!.data![index].isAllowAppointment ?? false) ? "Yes" : "No", valueColor: Colors.green), + showItem("Allowing Workshop service:", (model.serviceItems!.data![index].isAppointmentCompanyLoc ?? false) ? "Yes" : "No", valueColor: Colors.green), + showItem("Allowing home service:", (model.serviceItems!.data![index].isAppointmentCustomerLoc ?? false) ? "Yes" : "No", valueColor: Colors.green), + 12.height, + "Service Amount".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + Row( + crossAxisAlignment: CrossAxisAlignment.end, + children: [ + model.serviceItems!.data![index].price!.toText(fontSize: 22, isBold: true), + 2.width, + Padding( + padding: const EdgeInsets.only(bottom: 4), + child: "SAR".toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + ), + ], + ), + ], + ), + ), + // Padding( + // padding: const EdgeInsets.all(4.0), + // child: SvgPicture.asset( + // MyAssets.icEdit, + // width: 16, + // height: 16, + // ), + // ) + ], + ), + ).toWhiteContainer( + width: double.infinity, + allPading: 12, + ); + }, + separatorBuilder: (BuildContext context, int index) { + return 12.height; + }, + padding: const EdgeInsets.all(20), + itemCount: model.serviceItems!.data!.length, + ); + }, + ), + ); + } + + Widget showItem(String item, String value, {Color valueColor = Colors.black}) { + return Row( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.start, + children: [ + item.toText(fontSize: 12, color: MyColors.lightTextColor, isBold: true), + 4.width, + value.toText(fontSize: 12, color: valueColor, isBold: true), + ], + ); + } +} diff --git a/lib/views/splash/splash_page.dart b/lib/views/splash/splash_page.dart deleted file mode 100644 index f1b9610..0000000 --- a/lib/views/splash/splash_page.dart +++ /dev/null @@ -1,52 +0,0 @@ -import 'package:car_customer_app/config/routes.dart'; -import 'package:car_customer_app/utils/navigator.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:flutter/material.dart'; - -class SplashPage extends StatelessWidget { - const SplashPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - performTimer(context); - return Scaffold( - body: Container( - width: double.infinity, - height: double.infinity, - color: Colors.black, - child: Column( - children: [ - Utils. mExp(1), - Expanded( - child: Image.asset( - "assets/images/ic_logo_white.png", - ), - ), - Expanded( - flex: 10, - child: Image.asset( - "assets/images/bn_car.jpeg", - fit: BoxFit.cover, - width: double.infinity, - height: 00, - ), - ), - Expanded( - flex: 3, - child: Image.asset( - "assets/images/ic_engine.png", - ), - ), - Utils.mExp(1), - ], - ), - ), - ); - } - - performTimer(BuildContext context) { - Utils.delay(3).whenComplete(() { - navigateReplaceWithName(context, AppRoutes.registerSelection); - }); - } -} diff --git a/lib/views/user/change_email_page.dart b/lib/views/user/change_email_page.dart deleted file mode 100644 index b3531e1..0000000 --- a/lib/views/user/change_email_page.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:car_customer_app/widgets/txt_field.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class ChangeEmailPage extends StatefulWidget { - const ChangeEmailPage({Key? key}) : super(key: key); - - @override - State createState() => _ChangeEmailPageState(); -} - -class _ChangeEmailPageState extends State { - String password = ""; - String email = ''; - - late UserVM userVM; - - @override - void initState() { - userVM = Provider.of(context, listen: false); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: appBar(context, title: LocaleKeys.changeEmail.tr()), - body: SingleChildScrollView( - child: Container( - // width: double.infinity, - // height: double.infinity, - padding: const EdgeInsets.all(20), - child: Column( - children: [ - LocaleKeys.enterEmail.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,), - 12.height, - TxtField( - hint: LocaleKeys.enterNewEmail.tr(), - onChanged: (v) => email = v, - ), - 12.height, - TxtField( - hint: LocaleKeys.enterCurrentPassword.tr(), - onChanged: (v) => password = v, - ), - 40.height, - ShowFillButton( - title: LocaleKeys.confirm.tr(), - maxWidth: double.infinity, - onPressed: () async { - await userVM.changeUserEmail(context, email, password); - }, - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/views/user/change_mobile_page.dart b/lib/views/user/change_mobile_page.dart deleted file mode 100644 index ed62ec6..0000000 --- a/lib/views/user/change_mobile_page.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:car_customer_app/widgets/txt_field.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class ChangeMobilePage extends StatefulWidget { - @override - State createState() => _ChangeMobilePageState(); -} - -class _ChangeMobilePageState extends State { - int countryID = 1; - - String mobileNo = ''; - String password = ''; - - late UserVM userVM; - - @override - void initState() { - userVM = Provider.of(context, listen: false); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: appBar(context, title: LocaleKeys.changeMobile.tr()), - body: SingleChildScrollView( - child: Container( - // width: double.infinity, - // height: double.infinity, - padding: EdgeInsets.all(20), - child: Column( - children: [ - LocaleKeys.enterNewPhoneNumber.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,), - 12.height, - TxtField( - hint: LocaleKeys.enterNewPhoneNumber.tr(), - onChanged: (v) => mobileNo = v, - ), - 12.height, - TxtField( - hint: LocaleKeys.enterCurrentPassword.tr(), - onChanged: (v) => password = v, - ), - 20.height, - ShowFillButton( - title: LocaleKeys.confirm.tr(), - maxWidth: double.infinity, - onPressed: () async { - await userVM.changeUserMobile(context, countryID, mobileNo, password); - }, - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/views/user/change_password_page.dart b/lib/views/user/change_password_page.dart deleted file mode 100644 index b0070d1..0000000 --- a/lib/views/user/change_password_page.dart +++ /dev/null @@ -1,67 +0,0 @@ -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:car_customer_app/widgets/txt_field.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class ChangePasswordPage extends StatefulWidget { - const ChangePasswordPage({Key? key}) : super(key: key); - - @override - State createState() => _ChangePasswordPageState(); -} - -class _ChangePasswordPageState extends State { - String newPassword = ""; - String currentPassword = ''; - - late UserVM userVM; - - @override - void initState() { - userVM = Provider.of(context, listen: false); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: appBar(context, title: LocaleKeys.changePassword.tr()), - body: SingleChildScrollView( - child: Container( - // width: double.infinity, - // height: double.infinity, - padding: EdgeInsets.all(40), - child: Column( - children: [ - LocaleKeys.enterNewPassword.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,), - 12.height, - TxtField( - hint: LocaleKeys.enterOldPassword.tr(), - onChanged: (v) => currentPassword = v, - ), - 12.height, - TxtField( - hint: LocaleKeys.enterNewPassword.tr(), - onChanged: (v) => newPassword = v, - ), - 20.height, - ShowFillButton( - title: LocaleKeys.confirm.tr(), - maxWidth: double.infinity, - onPressed: () async { - await userVM.changeUserPassword(context, newPassword, currentPassword); - }, - ), - ], - ), - ), - ), - ); - } -} diff --git a/lib/views/user/complete_profile_page.dart b/lib/views/user/complete_profile_page.dart deleted file mode 100644 index 97ae2a8..0000000 --- a/lib/views/user/complete_profile_page.dart +++ /dev/null @@ -1,164 +0,0 @@ -import 'package:car_customer_app/theme/colors.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/models/user/register_user.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:car_customer_app/widgets/txt_field.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class CompleteProfilePage extends StatefulWidget { - final RegisterUserRespModel user; - - const CompleteProfilePage(this.user, {Key? key}) : super(key: key); - - @override - State createState() => _CompleteProfilePageState(); -} - -class _CompleteProfilePageState extends State { - String? firstName = "", lastName = "", email = "", confirmPassword = ""; - late String password = ""; - bool isChecked = false; - late UserVM userVM; - - @override - void initState() { - userVM = Provider.of(context, listen: false); - super.initState(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: appBar( - context, - title: LocaleKeys.signUp.tr(), - ), - body: SizedBox( - width: double.infinity, - height: double.infinity, - child: SingleChildScrollView( - child: Padding( - padding: const EdgeInsets.all(20), - child: Column( - children: [ - 6.height, - LocaleKeys.completeProfile.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,), - 12.height, - Padding( - padding: const EdgeInsets.symmetric(horizontal: 20), - child: LocaleKeys.profileMsg.tr().toText( - color: MyColors.lightTextColor, - textAlign: TextAlign.center, - fontSize: 14, - height: 23 / 24, - letterSpacing: -0.48, - ), - ), - 12.height, - TxtField( - hint: LocaleKeys.firstName.tr(), - value: firstName, - onChanged: (v) { - firstName = v; - }, - ), - 12.height, - TxtField( - hint: LocaleKeys.surname.tr(), - value: lastName, - onChanged: (v) { - lastName = v; - }, - ), - 12.height, - TxtField( - hint: LocaleKeys.email.tr(), - value: email, - // isButtonEnable: email!.length > 0 ? true : false, - buttonTitle: LocaleKeys.verify.tr(), - onChanged: (v) { - email = v; - }, - ), - 12.height, - TxtField( - hint: LocaleKeys.createPass.tr(), - isPasswordEnabled: true, - maxLines: 1, - value: password, - onChanged: (v) { - password = v; - }, - ), - 12.height, - TxtField( - hint: LocaleKeys.confirmPass.tr(), - isPasswordEnabled: true, - maxLines: 1, - value: confirmPassword, - onChanged: (v) { - confirmPassword = v; - }, - ), - 50.height, - Row( - children: [ - Consumer(builder: (BuildContext context, UserVM userVM, Widget? child) { - return Checkbox( - value: userVM.completeProfilePageCheckbox, - activeColor: Colors.blue, - onChanged: (value) { - userVM.updateCompleteProfilePageCheckbox(value!); - }, - ); - }), - Expanded( - child: Column( - children: [ - LocaleKeys.termsOfService.tr().toText(fontSize: 12), - LocaleKeys.terms.tr().toText(fontSize: 12, color: MyColors.darkPrimaryColor), - ], - ), - ), - Theme( - data: ThemeData(unselectedWidgetColor: Colors.transparent), - child: Checkbox( - value: false, - onChanged: (_) {}, - ), - ) - ], - ), - 16.height, - ShowFillButton( - title: LocaleKeys.save.tr(), - maxWidth: double.infinity, - onPressed: () { - bool validateStatus = userVM.dataValidation(password: password, firstName: firstName, lastName: lastName, email: email); - if (validateStatus) { - userVM.performCompleteProfile( - context, - password: password, - confirmPassword: confirmPassword!, - firstName: firstName!, - lastName: lastName!, - email: email!, - userId: widget.user.data!.userId ?? "", - ); - } - }), - 16.height, - ], - ), - ), - ), - ), - ); - } -} diff --git a/lib/views/user/confirm_new_password.dart b/lib/views/user/confirm_new_password.dart deleted file mode 100644 index 8576d0d..0000000 --- a/lib/views/user/confirm_new_password.dart +++ /dev/null @@ -1,58 +0,0 @@ - -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:car_customer_app/widgets/txt_field.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class ConfirmNewPasswordPage extends StatelessWidget { - final String userToken; - - ConfirmNewPasswordPage(this.userToken, {Key? key}) : super(key: key); - - String newPassword = ""; - - @override - Widget build(BuildContext context) { - UserVM userVM = context.read(); - return Scaffold( - appBar: appBar(context, title: LocaleKeys.forgetPassword.tr()), - body: Container( - width: double.infinity, - height: double.infinity, - padding: const EdgeInsets.all(40), - child: Column( - children: [ - LocaleKeys.newPassword.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,), - 12.height, - TxtField( - // hint: "Enter New Password", - hint: LocaleKeys.enterNewPassword.tr(), - value: newPassword, - onChanged: (v) { - newPassword = v; - }, - ), - 40.height, - ShowFillButton( - title: LocaleKeys.confirm.tr(), - maxWidth: double.infinity, - onPressed: () async { - await userVM.confirmPasswordOTP( - context, - newPassword: newPassword, - userToken: userToken, - ); - }, - ), - ], - ), - ), - ); - } -} diff --git a/lib/views/user/confirm_new_password_page.dart b/lib/views/user/confirm_new_password_page.dart deleted file mode 100644 index c398423..0000000 --- a/lib/views/user/confirm_new_password_page.dart +++ /dev/null @@ -1,91 +0,0 @@ -import 'package:car_customer_app/utils/utils.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class ConfirmNewPasswordPage extends StatefulWidget { - final String userToken; - - const ConfirmNewPasswordPage(this.userToken, {Key? key}) : super(key: key); - - @override - State createState() => _ConfirmNewPasswordPageState(); -} - -class _ConfirmNewPasswordPageState extends State { - String newPassword = ""; - String confirmPassword = ''; - - @override - Widget build(BuildContext context) { - UserVM userVM = context.read(); - return Scaffold( - appBar: appBar(context, title: LocaleKeys.forgetPassword.tr()), - body: SingleChildScrollView( - child: Container( - // width: double.infinity, - // height: double.infinity, - padding: const EdgeInsets.all(40), - child: Column( - children: [ - LocaleKeys.newPassword.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,), - 12.height, - TextFormField( - decoration: InputDecoration( - // hintText: "Enter New Password", - hintText: LocaleKeys.enterNewPassword.tr(), - hintStyle: const TextStyle(color: Colors.grey), - border: const OutlineInputBorder( - borderRadius: BorderRadius.all( - Radius.circular(5.0), - ), - ), - ), - obscureText: true, - onChanged: (v) => newPassword = v, - ), - 12.height, - TextFormField( - decoration: InputDecoration( - // hintText: "Confirm Password", - hintText: LocaleKeys.confirmPassword.tr(), - hintStyle: const TextStyle(color: Colors.grey), - border: const OutlineInputBorder( - borderRadius: BorderRadius.all( - Radius.circular(5.0), - ), - ), - ), - obscureText: true, - onChanged: (v) => confirmPassword = v, - ), - 40.height, - ShowFillButton( - title: LocaleKeys.confirm.tr(), - maxWidth: double.infinity, - onPressed: () { - if (validation()) userVM.confirmPasswordOTP(context, newPassword: newPassword, userToken: widget.userToken); - }, - ), - ], - ), - ), - ), - ); - } - - bool validation() { - bool isValid = true; - if (newPassword != confirmPassword) { - Utils.showToast(LocaleKeys.pleaseEnterSamePassword.tr()); - isValid = false; - } - return isValid; - } -} diff --git a/lib/views/user/edit_account_page.dart b/lib/views/user/edit_account_page.dart deleted file mode 100644 index 8469085..0000000 --- a/lib/views/user/edit_account_page.dart +++ /dev/null @@ -1,159 +0,0 @@ -import 'package:car_customer_app/classes/app_state.dart'; -import 'package:car_customer_app/config/routes.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/utils/navigator.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.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'; - -class EditAccountPage extends StatefulWidget { - const EditAccountPage({Key? key}) : super(key: key); - - @override - State createState() => _EditAccountPageState(); -} - -class _EditAccountPageState extends State { - String userID = ""; - String email = ''; - - @override - Widget build(BuildContext context) { - UserVM userVM = context.read(); - return Scaffold( - appBar: appBar(context, title: LocaleKeys.editAccount.tr()), - body: Container( - width: double.infinity, - height: double.infinity, - padding: const EdgeInsets.all(20), - child: Column( - children: [ - 20.height, - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SvgPicture.asset( - "assets/images/ic_lock.svg", - color: MyColors.darkPrimaryColor, - width: 16, - ), - 20.width, - Expanded(child: LocaleKeys.changePassword.tr().toText(isBold: true, fontSize: 12)), - ElevatedButton( - style: ElevatedButton.styleFrom( - textStyle: const TextStyle(color: Colors.white), - backgroundColor: MyColors.darkPrimaryColor, - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), - ), - onPressed: () { - navigateWithName(context, AppRoutes.changePassword); - }, - child: Text( - LocaleKeys.change.tr(), - style: const TextStyle( - fontSize: 14, letterSpacing: -0.48, - fontWeight: FontWeight.w600, - height: 23 / 24, - ), - ), - ), - ], - ), - 15.height, - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SvgPicture.asset( - "assets/images/ic_mobile.svg", - color: MyColors.darkPrimaryColor, - width: 16, - ), - 20.width, - Expanded(child: LocaleKeys.changeMobile.tr().toText(isBold: true, fontSize: 12)), - LocaleKeys.verify.tr().toText(color: Colors.green, fontSize: 12), - 20.width, - ElevatedButton( - style: ElevatedButton.styleFrom( - textStyle: const TextStyle(color: Colors.white), - backgroundColor: MyColors.darkPrimaryColor, - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), - ), - onPressed: () { - navigateWithName(context, AppRoutes.changeMobilePage); - }, - child: Text( - LocaleKeys.change.tr(), - style: const TextStyle(fontSize: 14, height: 23 / 24,fontWeight: FontWeight.w600), - ), - ) - ], - ), - 20.height, - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - SvgPicture.asset( - "assets/images/ic_email.svg", - color: MyColors.darkPrimaryColor, - width: 16, - ), - 20.width, - Expanded(child: LocaleKeys.changeEmail.tr().toText(isBold: true, fontSize: 12)), - InkWell( - child: ((AppState().getUser.data!.userInfo!.isEmailVerified ?? false) ? LocaleKeys.verified.tr() : LocaleKeys.verify.tr()).toText( - color: Colors.green, - fontSize: 12, - ), - onTap: (AppState().getUser.data!.userInfo!.isEmailVerified ?? false) - ? null - : () async { - await userVM.verifyEmail(context, email: email, userID: userID); - }, - ), - 20.width, - ElevatedButton( - style: ElevatedButton.styleFrom( - textStyle: const TextStyle(color: Colors.white), - backgroundColor: MyColors.darkPrimaryColor, - padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 8), - ), - onPressed: () { - navigateWithName(context, AppRoutes.changeEmailPage); - }, - child: Text( - LocaleKeys.change.tr(), - style: const TextStyle(fontSize: 14, height: 23 / 24, fontWeight: FontWeight.w600), - ), - ), - ], - ) - - // ListTile( - // leading: SvgPicture.asset("assets/images/ic_mobile.svg"), - // title: "Change Mobile".toText12(), - // onTap: () { - // navigateWithName(context, AppRoutes.changeMobilePage); - // }, - // ), - // ListTile( - // leading: Icon(Icons.email_outlined, color: Colors.blue,), - // title: "Change Email".toText12(), - // onTap: () { - // navigateWithName(context, AppRoutes.changeEmailPage); - // }, - // ), - ], - ), - ), - ); - } -} diff --git a/lib/views/user/forget_password_method_page.dart b/lib/views/user/forget_password_method_page.dart deleted file mode 100644 index 0a127fb..0000000 --- a/lib/views/user/forget_password_method_page.dart +++ /dev/null @@ -1,70 +0,0 @@ -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/button/show_image_button.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class ForgetPasswordMethodPage extends StatefulWidget { - final String userToken; - - const ForgetPasswordMethodPage(this.userToken, {Key? key}) : super(key: key); - - @override - State createState() => _ForgetPasswordMethodPageState(); -} - -class _ForgetPasswordMethodPageState extends State { - int otpType = 1; - String userOTP = ""; - - @override - Widget build(BuildContext context) { - UserVM userVM = context.read(); - return Scaffold( - appBar: appBar(context, title: LocaleKeys.forgetPassword.tr()), - body: Container( - width: double.infinity, - height: double.infinity, - padding: const EdgeInsets.all(40), - child: Column( - children: [ - LocaleKeys.selectMethod.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,), - 12.height, - Row( - children: [ - Expanded( - child: ShowImageButton( - onClick: () async { - otpType = 1; - await userVM.forgetPasswordOTPMethod(context, userToken: widget.userToken); - }, - title: LocaleKeys.SMS.tr(), - icon: icons + "ic_sms.svg", - ), - ), - 20.width, - Expanded( - child: ShowImageButton( - onClick: () async { - otpType = 1; - await userVM.forgetPasswordOTPMethod(context, userToken: widget.userToken); - }, - title: LocaleKeys.whatsapp.tr(), - icon: icons + "ic_whatsapp.svg", - ), - ), - ], - ), - Utils.mFlex(10), - ], - ), - ), - ); - } -} diff --git a/lib/views/user/forget_password_page.dart b/lib/views/user/forget_password_page.dart deleted file mode 100644 index dcf66a7..0000000 --- a/lib/views/user/forget_password_page.dart +++ /dev/null @@ -1,153 +0,0 @@ -import 'dart:async'; -import 'package:car_customer_app/models/user/country.dart'; -import 'package:car_customer_app/theme/colors.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/dropdown/dropdow_field.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:car_customer_app/widgets/tab/login_email_tab.dart'; -import 'package:car_customer_app/widgets/txt_field.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class ForgetPasswordPage extends StatefulWidget { - const ForgetPasswordPage({Key? key}) : super(key: key); - - @override - State createState() => _ForgetPasswordPageState(); -} - -class _ForgetPasswordPageState extends State { - int otpType = 1; - - String userName = ""; - ClassType type = ClassType.EMAIL; - Country? _country; - String countryCode = ""; - - late UserVM userVM; - - @override - void initState() { - super.initState(); - - scheduleMicrotask(() { - userVM = Provider.of(context, listen: false); - getCountryList(); - }); - } - - getCountryList() async { - _country = await userVM.getAllCountries(); - setState(() {}); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: appBar(context, title: LocaleKeys.changePassword.tr()), - body: Container( - width: double.infinity, - height: double.infinity, - padding: const EdgeInsets.all(20), - child: SingleChildScrollView( - child: SizedBox( - height: MediaQuery.of(context).size.height, - child: Column( - children: [ - 12.height, - LocaleKeys.forgetPassword.tr().toText( - fontSize: 20, - letterSpacing: -1.44, - ), - 20.height, - LocaleKeys.retrievePassword.tr().toText( - color: MyColors.lightTextColor, - textAlign: TextAlign.center, - fontSize: 14, - height: 23 / 24, - letterSpacing: -0.48, - ), - 30.height, - LoginEmailTab( - onSelection: (ClassType type) { - setState(() { - this.type = type; - }); - }, - ), - 12.height, - type == ClassType.NUMBER - ? Column( - children: [ - getCountry(), - 6.height, - TxtField( - hint: "5********", - value: userName, - onChanged: (v) { - userName = v; - }, - ) - ], - ) - : TxtField( - hint: LocaleKeys.emailAddress.tr(), - value: userName, - onChanged: (v) { - userName = v; - }, - ), - 20.height, - (type == ClassType.NUMBER ? LocaleKeys.retriveOnPhone.tr() : LocaleKeys.retriveOnEmail.tr()).toText( - color: MyColors.lightTextColor, - textAlign: TextAlign.center, - fontSize: 14, - height: 23 / 24, - letterSpacing: -0.48, - ), - 30.height, - ShowFillButton( - title: LocaleKeys.send.tr(), - maxWidth: double.infinity, - onPressed: () { - if (userName.isNum() && type == ClassType.NUMBER) { - userVM.forgetPasswordPhoneOTP(context, countryCode: countryCode, userName: userName, otpType: otpType); - } else if (!userName.isNum() && type == ClassType.EMAIL) { - userVM.forgetPasswordEmailOTP(context, countryCode: countryCode, userName: userName, otpType: otpType); - } - }, - ), - Utils.mFlex(10), - ], - ), - ), - ), - ), - ); - } - - Widget getCountry() { - if (_country != null) { - List dropList = []; - _country!.data?.forEach((element) { - dropList.add(DropValue(element.id ?? 0, (element.countryName ?? "") + " " + (element.countryCode ?? ""), element.countryCode ?? "")); - }); - return Padding( - padding: const EdgeInsets.all(2.0), - child: DropdownField((DropValue value) { - countryCode = value.subValue; - }, list: dropList, hint: LocaleKeys.selectCountryCode.tr()), - ); - } else { - return const Center( - child: CircularProgressIndicator(), - ); - } - } -} diff --git a/lib/views/user/login_method_selection_page.dart b/lib/views/user/login_method_selection_page.dart deleted file mode 100644 index 5d2f69d..0000000 --- a/lib/views/user/login_method_selection_page.dart +++ /dev/null @@ -1,89 +0,0 @@ - -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/button/show_image_button.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class LoginMethodSelectionPage extends StatelessWidget { - final String userToken; - - const LoginMethodSelectionPage(this.userToken, {Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - UserVM userVM = context.read(); - return Scaffold( - appBar: appBar(context, title: LocaleKeys.log_in.tr()), - body: Container( - width: double.infinity, - height: double.infinity, - padding: const EdgeInsets.all(20), - child: SingleChildScrollView( - child: Column( - children: [ - LocaleKeys.loginSelection.tr().toText(fontSize: 20, letterSpacing: -1.44,), - 30.height, - LocaleKeys.welcomeBack.tr().toText(fontSize: 20, letterSpacing: -1.44,), - 40.height, - Row( - children: [ - Expanded( - child: ShowImageButton( - onClick: () { - userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken); - }, - title: LocaleKeys.fingerPrint.tr(), - icon: icons + "ic_fingerprint.svg", - ), - ), - 20.width, - Expanded( - child: ShowImageButton( - onClick: () { - userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken); - }, - title: LocaleKeys.faceRecognition.tr(), - icon: icons + "ic_face.svg", - ), - ), - ], - ), - 40.height, - Row( - children: [ - Expanded( - child: ShowImageButton( - onClick: () { - userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken); - }, - title: LocaleKeys.SMS.tr(), - icon: icons + "ic_sms.svg", - ), - ), - 20.width, - Expanded( - child: ShowImageButton( - onClick: () { - // navigateWithName(context, AppRoutes.dashboard); - userVM.performBasicOtpLoginSelectionPage(context, userToken: userToken); - }, - title: LocaleKeys.whatsapp.tr(), - icon: icons + "ic_whatsapp.svg", - ), - ), - ], - ), - ], - ), - ), - ), - ); - } - -} diff --git a/lib/views/user/login_verification_page.dart b/lib/views/user/login_verification_page.dart deleted file mode 100644 index 32bd9f7..0000000 --- a/lib/views/user/login_verification_page.dart +++ /dev/null @@ -1,132 +0,0 @@ -import 'dart:async'; -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; - -import 'package:car_customer_app/utils/utils.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/button/show_image_button.dart'; - -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class LoginVerificationPage extends StatefulWidget { - const LoginVerificationPage({Key? key}) : super(key: key); - - @override - State createState() => _LoginVerificationPageState(); -} - -class _LoginVerificationPageState extends State { - String userToken = ""; - - late UserVM userVM; - - @override - void initState() { - // TODO: implement initState - super.initState(); - scheduleMicrotask(() async { - userVM = Provider.of(context, listen: false); - userToken = await userVM.performApiCallLoginVerificationPage(context); - }); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: appBar(context, title: LocaleKeys.login.tr()), - body: Container( - width: double.infinity, - height: double.infinity, - padding: const EdgeInsets.all(40), - child: Column( - children: [ - LocaleKeys.verifyAccount.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,), - Utils.mFlex(2), - Row( - children: [ - Expanded( - child: ShowImageButton( - onClick: () { - userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken); - }, - title: LocaleKeys.fingerPrint.tr(), - icon: icons + "ic_fingerprint.png", - ), - ), - 20.width, - Expanded( - child: ShowImageButton( - onClick: () { - userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken); - }, - title: LocaleKeys.faceRecognition.tr(), - icon: icons + "ic_face_id.png", - ), - ), - ], - ), - 40.height, - Row( - children: [ - Expanded( - child: ShowImageButton( - onClick: () { - userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken); - }, - title: LocaleKeys.SMS.tr(), - icon: icons + "ic_sms.png", - ), - ), - 20.width, - Expanded( - child: ShowImageButton( - onClick: () { - userVM.performBasicOtpLoginVerificationPage(context, userToken: userToken); - }, - title: LocaleKeys.whatsapp.tr(), - icon: icons + "ic_whatsapp.png", - ), - ), - ], - ), - Utils.mFlex(10), - ], - ), - ), - ); - } - -// Future performBasicOtp(BuildContext context) async { -// Utils.showLoading(context); -// String userToken=await SharedPrefManager.getUserToken(); -// Response response = await UserApiClent().login_V2_OTP(userToken, "1"); -// Utils.hideLoading(context); -// if (response.statusCode == 200) { -// String userToken = jsonDecode(response.body)["token"]; -// showMDialog(context, child: OtpDialog( -// onClick: (String code) async { -// pop(context); -// Utils.showLoading(context); -// Response response2 = await UserApiClent().login_V2_OTPVerify(userToken, code); -// Utils.hideLoading(context); -// if (response2.statusCode == 200) { -// User user = User.fromJson(jsonDecode(response2.body)); -// SharedPrefManager.setUserToken(user.data!.accessToken ?? ""); -// SharedPrefManager.setUserId(user.data!.userInfo!.userId ?? ""); -// navigateWithName(context, AppRoutes.dashboard); -// } else { -// Utils.showToast("Something went wrong"); -// } -// }, -// )); -// } else { -// String res = jsonDecode(response.body)["errors"][0] ?? ""; -// Utils.showToast(res); -// } -// } -} diff --git a/lib/views/user/login_verify_account_page.dart b/lib/views/user/login_verify_account_page.dart deleted file mode 100644 index 7e89a1d..0000000 --- a/lib/views/user/login_verify_account_page.dart +++ /dev/null @@ -1,109 +0,0 @@ -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/button/show_image_button.dart'; -import 'package:car_customer_app/widgets/txt_field.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class LoginVerifyAccountPage extends StatelessWidget { - int otpType = 1; - String phoneNum = ""; - - LoginVerifyAccountPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - UserVM userVM = context.read(); - return Scaffold( - appBar: appBar(context,title: LocaleKeys.login.tr()), - body: Container( - width: double.infinity, - height: double.infinity, - padding: const EdgeInsets.all(40), - child: Column( - children: [ - LocaleKeys.verifyAccount.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,), - Utils.mFlex(1), - TxtField( - hint: "966501234567", - value: phoneNum, - onChanged: (v) { - phoneNum = v; - }, - ), - Utils.mFlex(2), - Row( - children: [ - Expanded( - child: ShowImageButton( - onClick: () { - otpType = 1; - userVM.performBasicOtpLoginVerifyAccountPage(context, phoneNum: phoneNum, otpType: otpType); - // showMDialog(context, child: OtpDialog( - // onClick: (String code) { - // pop(context); - // delay(300).then( - // (value) => showMDialog( - // context, - // child: MessageDialog( - // title: "Phone Number Verified", - // onClick: () { - // otpType=1; - // performBasicOtp(context); - // // navigateWithName(context, AppRoutes.completeProfile); - // }, - // ), - // ), - // ); - // }, - // )); - }, - title: LocaleKeys.SMS.tr(), - icon: icons + "ic_sms.png", - ), - ), - 20.width, - Expanded( - child: ShowImageButton( - onClick: () { - otpType = 1; - userVM.performBasicOtpLoginVerifyAccountPage(context, phoneNum: phoneNum, otpType: otpType); - // showMDialog(context, child: OtpDialog( - // onClick: (String code) { - // pop(context); - // delay(300).then( - // (value) => showMDialog( - // context, - // child: MessageDialog( - // title: "Phone Number Verified", - // onClick: () { - // otpType=2; - // performBasicOtp(context); - // // navigateWithName(context, AppRoutes.completeProfile); - // }, - // ), - // ), - // ); - // }, - // )); - }, - title: LocaleKeys.whatsapp.tr(), - icon: icons + "ic_whatsapp.png", - ), - ), - ], - ), - Utils.mFlex(10), - ], - ), - ), - ); - } - -} diff --git a/lib/views/user/login_with_password_page.dart b/lib/views/user/login_with_password_page.dart deleted file mode 100644 index 5b365bb..0000000 --- a/lib/views/user/login_with_password_page.dart +++ /dev/null @@ -1,154 +0,0 @@ -import 'dart:async'; - -import 'package:car_customer_app/models/user/country.dart'; -import 'package:car_customer_app/theme/colors.dart'; -import 'package:car_customer_app/config/routes.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/utils/navigator.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/dropdown/dropdow_field.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:car_customer_app/widgets/tab/login_email_tab.dart'; -import 'package:car_customer_app/widgets/txt_field.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; -import 'package:provider/provider.dart'; - -class LoginWithPassword extends StatefulWidget { - const LoginWithPassword({Key? key}) : super(key: key); - - @override - State createState() => _LoginWithPasswordState(); -} - -class _LoginWithPasswordState extends State { - int otpType = 1; - - ClassType type = ClassType.EMAIL; - String phoneNum = "", password = ""; - String email = ""; - String countryCode = ""; - Country? _country; - - late UserVM userVM; - - @override - void initState() { - super.initState(); - - scheduleMicrotask(() { - userVM = Provider.of(context, listen: false); - getCountryList(); - }); - } - - getCountryList() async { - _country = await userVM.getAllCountries(); - setState(() {}); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: appBar(context, title: ""), - body: Container( - width: double.infinity, - height: double.infinity, - padding: const EdgeInsets.all(20), - child: SingleChildScrollView( - child: Column( - children: [ - 12.height, - LocaleKeys.login.tr().toText(fontSize: 20, letterSpacing: -1.44,), - // 20.height, - // (type == ClassType.NUMBER ? LocaleKeys.enterPhoneNumber.tr() : LocaleKeys.enterEmail.tr()).toText14( - // color: MyColors.lightTextColor, - // textAlign: TextAlign.center, - // ), - 30.height, - LoginEmailTab( - onSelection: (ClassType type) { - setState(() { - this.type = type; - }); - }, - ), - 10.height, - Column( - children: [ - if (type == ClassType.NUMBER) getCountry(context), - 10.height, - TxtField( - hint: type == ClassType.NUMBER ? LocaleKeys.enterPhoneNumber.tr() : LocaleKeys.enterEmail.tr(), - value: phoneNum, - isSidePaddingZero: true, - onChanged: (v) { - phoneNum = v; - }, - ), - 10.height, - TxtField( - hint: LocaleKeys.EnterPass.tr(), - value: password, - isPasswordEnabled: true, - isSidePaddingZero: true, - maxLines: 1, - onChanged: (v) { - password = v; - }, - ), - ], - ), - 20.height, - LocaleKeys.forgetPasswordQ.tr().toText( - color: MyColors.textColor, - fontSize: 14, - height: 23 / 24, - letterSpacing: -0.48, - ), - ShowFillButton( - title: LocaleKeys.recover.tr(), - isFlatButton: true, - isBold: false, - fontSize: 14, - maxHeight: 24, - txtColor: MyColors.darkPrimaryColor, - onPressed: () { - navigateWithName(context, AppRoutes.forgetPassword); - }, - ), - 30.height, - ShowFillButton( - title: LocaleKeys.continu.tr(), - maxWidth: double.infinity, - onPressed: () { - userVM.performBasicOtpLoginWithPasswordPage(context, type: type, countryCode: countryCode, phoneNum: phoneNum, password: password); - }, - ), - 20.height, - ], - ), - ), - ), - ); - } - - Widget getCountry(BuildContext context) { - if (_country != null) { - List dropList = []; - _country!.data?.forEach((element) { - dropList.add(DropValue(element.id ?? 0, (element.countryName ?? "") + " " + (element.countryCode ?? ""), element.countryCode ?? "")); - }); - return DropdownField((DropValue value) { - countryCode = value.subValue; - }, list: dropList, hint: LocaleKeys.selectCountryCode.tr()); - } else { - return const Center( - child: CircularProgressIndicator(), - ); - } - } -} diff --git a/lib/views/user/register_page.dart b/lib/views/user/register_page.dart deleted file mode 100644 index a195e86..0000000 --- a/lib/views/user/register_page.dart +++ /dev/null @@ -1,185 +0,0 @@ -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/models/user/country.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:car_customer_app/view_models/user_view_model.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/dropdown/dropdow_field.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:easy_localization/easy_localization.dart'; -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); - - @override - State createState() => _RegisterPageState(); -} - -class _RegisterPageState extends State { - String phoneNum = "", countryCode = ""; - - int role = 4, countryId = -1; - - TextEditingController emailController = TextEditingController(); - - @override - Widget build(BuildContext context) { - final UserVM userVM = context.read(); - return Scaffold( - appBar: appBar(context, title: ""), - body: Container( - width: double.infinity, - height: double.infinity, - padding: const EdgeInsets.all(20), - child: SingleChildScrollView( - child: SizedBox( - height: MediaQuery.of(context).size.height, - child: Column( - children: [ - 12.height, - LocaleKeys.signUp.tr().toText(fontSize: 20, letterSpacing: -1.44,), - 20.height, - LocaleKeys.enterPhoneNumber.tr().toText( - color: MyColors.lightTextColor, - textAlign: TextAlign.center, - fontSize: 14, - height: 23 / 24, - letterSpacing: -0.48, - ), - 30.height, - FutureBuilder( - future: userVM.getAllCountries(), - builder: (context, snapshot) { - if (snapshot.hasData) { - List dropList = []; - snapshot.data?.data?.forEach((element) { - dropList.add(DropValue( - element.id ?? 0, - EasyLocalization.of(context)?.currentLocale?.countryCode == "SA" - ? (element.countryNameN ?? "") + " " + (element.countryCode ?? "") - : (element.countryName ?? "") + " " + (element.countryCode ?? ""), - element.countryCode ?? "")); - }); - return Column( - children: [ - LocaleKeys.selectYourCountry.tr().toText( - color: MyColors.lightTextColor, - textAlign: TextAlign.center, - fontSize: 14, - height: 23 / 24, - letterSpacing: -0.48, - ), - 10.height, - DropdownField( - (DropValue value) { - setState(() { - countryCode = value.subValue; - countryId = value.id; - }); - }, - list: dropList, - hint: LocaleKeys.chooseCountry.tr(), - ), - ], - ); - } else { - return const CircularProgressIndicator(); - } - }, - ), - 18.height, - LocaleKeys.enterPhoneForVerfication.tr().toText( - color: MyColors.lightTextColor, - textAlign: TextAlign.center, - fontSize: 14, - height: 23 / 24, - letterSpacing: -0.48, - ), - 10.height, - Row( - mainAxisAlignment: MainAxisAlignment.center, - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Utils.mExp(1), - Expanded( - flex: 3, - child: Row( - children: [ - Text( - (countryCode.isEmpty ? "+00" : "+" + countryCode), - style: const TextStyle( - fontSize: 20, - color: MyColors.black, - fontWeight: FontWeight.bold, - ), - ), - const Text( - " | ", - style: TextStyle( - fontSize: 20, - color: MyColors.black, - fontWeight: FontWeight.bold, - ), - ), - Flexible( - child: TextField( - controller: emailController, - onChanged: (v) { - phoneNum = v; - }, - style: const TextStyle( - fontSize: 20, - color: MyColors.black, - ), - decoration: const InputDecoration( - hintStyle: TextStyle(color: MyColors.lightTextColor, fontSize: 20), - hintText: "546758594", - contentPadding: EdgeInsets.zero, - border: InputBorder.none, - ), - ), - ), - ], - ), - ), - Utils.mExp(1), - ], - ), - 40.height, - ShowFillButton( - title: LocaleKeys.continu.tr(), - maxWidth: double.infinity, - onPressed: () { - if (validation()) userVM.performBasicOtpRegisterPage(context, countryCode: countryCode, phoneNum: phoneNum, role: role); - }, - ), - ], - ), - ), - ), - ), - ); - } - - bool validation() { - bool isValid = true; - if (role == -1) { - Utils.showToast(LocaleKeys.selectProviderRole.tr()); - //("Please select Provider Role"); - isValid = false; - } else if (countryCode.isEmpty) { - Utils.showToast(LocaleKeys.selectCountryCode.tr()); - //("Please select Country Code"); - isValid = false; - } else if (phoneNum.isEmpty) { - Utils.showToast(LocaleKeys.addPhoneNo.tr()); - //("Please add Phone No"); - isValid = false; - } - return isValid; - } -} diff --git a/lib/views/user/register_selection_page.dart b/lib/views/user/register_selection_page.dart deleted file mode 100644 index 7e2d7c4..0000000 --- a/lib/views/user/register_selection_page.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:car_customer_app/config/routes.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/utils/navigator.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:car_customer_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 '../../theme/colors.dart'; - -class RegisterSelectionPage extends StatelessWidget { - const RegisterSelectionPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - // appBar: appBar(title: LocaleKeys.login.tr()), - body: Container( - width: double.infinity, - height: double.infinity, - decoration: const BoxDecoration( - image: DecorationImage( - image: AssetImage("assets/images/bn_Intro.png"), - fit: BoxFit.cover, - ), - ), - child: Column( - children: [ - Utils.mFlex(6), - SvgPicture.asset("assets/images/logo.svg"), - Utils.mFlex(4), - LocaleKeys.welcomeMessage.tr().toText( - fontSize: 20, - letterSpacing: -1.44, - ), - LocaleKeys.welcomeDes.tr().toText( - color: MyColors.lightTextColor, - fontSize: 14, - height: 23 / 24, - letterSpacing: -0.48, - ), - Utils.mFlex(1), - ShowFillButton( - title: LocaleKeys.login.tr(), - maxWidth: double.infinity, - horizontalMargin: 20, - onPressed: () { - navigateWithName(context, AppRoutes.loginWithPassword); - }, - ), - 20.height, - ShowFillButton( - title: LocaleKeys.signUp.tr(), - maxWidth: double.infinity, - isFlatButton: true, - txtColor: Colors.black, - onPressed: () { - navigateWithName(context, AppRoutes.register); - }, - ), - 10.height, - Utils.mFlex(3), - TextButton( - onPressed: () {}, - child: const Text( - "Continue as Guest", - style: TextStyle( - color: MyColors.darkPrimaryColor, - fontWeight: FontWeight.bold, - decoration: TextDecoration.underline, - ), - ), - ), - Utils.mFlex(3), - ], - ), - ), - ); - } -} diff --git a/lib/views/user/vertify_password_page.dart b/lib/views/user/vertify_password_page.dart deleted file mode 100644 index 234fe92..0000000 --- a/lib/views/user/vertify_password_page.dart +++ /dev/null @@ -1,155 +0,0 @@ -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/config/routes.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/utils/navigator.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:car_customer_app/widgets/app_bar.dart'; -import 'package:car_customer_app/widgets/button/show_image_button.dart'; -import 'package:car_customer_app/widgets/dialog/dialogs.dart'; -import 'package:car_customer_app/widgets/dialog/message_dialog.dart'; -import 'package:car_customer_app/widgets/dialog/otp_dialog.dart'; -import 'package:car_customer_app/widgets/txt_field.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; - -class VerifyPasswordPage extends StatelessWidget { - int otpType = 1; - String phoneNum = ""; - String userName = ""; - String userToken = ""; - String otp = ""; - - VerifyPasswordPage({Key? key}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Scaffold( - appBar: appBar(context, title: LocaleKeys.changePassword.tr()), - body: Container( - width: double.infinity, - height: double.infinity, - padding: const EdgeInsets.all(40), - child: Column( - children: [ - LocaleKeys.verifyNewPassword.tr().toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,), - Utils.mFlex(1), - TxtField( - hint: "966500000000", - value: phoneNum, - onChanged: (v) { - phoneNum = v; - }, - ), - Utils.mFlex(2), - Row( - children: [ - Expanded( - child: ShowImageButton( - onClick: () { - otpType = 1; - // sendPasswordOTP(context); - showMDialog(context, child: OtpDialog( - onClick: (String code) { - pop(context); - Utils.delay(300).then( - (value) => showMDialog( - context, - child: MessageDialog( - title: LocaleKeys.phoneNumberVerified.tr(), - onClick: () { - otpType = 1; - navigateWithName(context, AppRoutes.confirmNewPasswordPage); - // ForgetPasswordOTP(context); - }, - ), - ), - ); - }, - )); - }, - title: LocaleKeys.SMS.tr(), - icon: icons + "ic_sms.png", - ), - ), - 20.width, - Expanded( - child: ShowImageButton( - onClick: () { - otpType = 1; - // sendPasswordOTP(context); - showMDialog(context, child: OtpDialog( - onClick: (String code) { - pop(context); - Utils.delay(300).then( - (value) => showMDialog( - context, - child: MessageDialog( - title: LocaleKeys.phoneNumberVerified.tr(), - //"Phone Number Verified ", - onClick: () { - otpType = 2; - navigateWithName(context, AppRoutes.confirmNewPasswordPage); - // ForgetPasswordOTP(context); - }, - ), - ), - ); - }, - )); - }, - title: LocaleKeys.whatsapp.tr(), - icon: icons + "ic_whatsapp.png", - ), - ), - ], - ), - Utils.mFlex(10), - ], - ), - ), - ); - } - -// Future sendPasswordOTP(BuildContext context) async { -// Utils.showLoading(context); -// PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp); -// Utils.hideLoading(context); -// if (otpCompare.messageStatus == 1) { -// // navigateWithName(context, AppRoutes.confirmNewPasswordPage); -// showMDialog(context, child: OtpDialog( -// onClick: (String code) async { -// pop(context); -// Utils.showLoading(context); -// // PasswordOTPCompare otpCompare = await UserApiClent().ForgetPasswordOTPCompare(userToken, otp); -// Utils.hideLoading(context); -// }, -// )); -// } else { -// Utils.showToast(otpCompare.message ?? ""); -// } -// } - -// User otpRequest = User.fromJson(jsonDecode(res.body)); -// SharedPrefManager.setUserToken(otpRequest.data!.accessToken ?? ""); -// SharedPrefManager.setUserId(otpRequest.data!.userInfo!.userId ?? ""); -// showMDialog(context, child: OtpDialog( -// onClick: (String code) { -// pop(context); -// delay(300).then( -// (value) => showMDialog( -// context, -// child: MessageDialog( -// title: "Phone Number Verified", -// onClick: () { -// otpType=1; -// navigateWithName(context, AppRoutes.confirmNewPasswordPage); -// // ForgetPasswordOTP(context); -// }, -// ), -// ), -// ); -// }, -// )); -} diff --git a/lib/widgets/app_bar.dart b/lib/widgets/app_bar.dart deleted file mode 100644 index 31ba9df..0000000 --- a/lib/widgets/app_bar.dart +++ /dev/null @@ -1,32 +0,0 @@ -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/theme/colors.dart'; -import 'package:flutter/material.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/blurry_container.dart b/lib/widgets/blurry_container.dart deleted file mode 100644 index 8bebc4a..0000000 --- a/lib/widgets/blurry_container.dart +++ /dev/null @@ -1,62 +0,0 @@ -import 'dart:ui'; - -import 'package:flutter/material.dart'; - -const kDemoText = Center( - child: Text( - '', - style: TextStyle( - fontSize: 25, - color: Colors.white, - letterSpacing: 2, - ), - textAlign: TextAlign.center, - ), -); -const double kBlur = 1.0; -const EdgeInsetsGeometry kDefaultPadding = EdgeInsets.all(16); -const Color kDefaultColor = Colors.transparent; -const BorderRadius kBorderRadius = BorderRadius.all(Radius.circular(20)); -const double kColorOpacity = 0.0; - -class BlurryContainer extends StatelessWidget { - final Widget child; - final double blur; - final double? height, width; - final EdgeInsetsGeometry padding; - final Color bgColor; - - final BorderRadius borderRadius; - - //final double colorOpacity; - - BlurryContainer({ - this.child = kDemoText, - this.blur = 5, - required this.height, - required this.width, - this.padding = kDefaultPadding, - this.bgColor = kDefaultColor, - this.borderRadius = kBorderRadius, - //this.colorOpacity = kColorOpacity, - }); - - @override - Widget build(BuildContext context) { - return ClipRRect( - borderRadius: borderRadius, - child: BackdropFilter( - filter: ImageFilter.blur(sigmaX: blur, sigmaY: blur), - child: Container( - height: height!, - width: width!, - padding: padding, - color: bgColor == Colors.transparent - ? bgColor - : bgColor.withOpacity(0.5), - child: child, - ), - ), - ); - } -} diff --git a/lib/widgets/button/show_circular_button.dart b/lib/widgets/button/show_circular_button.dart deleted file mode 100644 index 9f77304..0000000 --- a/lib/widgets/button/show_circular_button.dart +++ /dev/null @@ -1,23 +0,0 @@ -import 'package:car_customer_app/utils/utils.dart'; -import 'package:flutter/material.dart'; - -class ShowCircularButton extends StatelessWidget { - VoidCallback onPressed; - IconData? iconData; - ShowCircularButton({Key? key, this.iconData,required this.onPressed}) : super(key: key); - @override - Widget build(BuildContext context) { - return Card( - shape: Utils.cardRadius(1000), - color: Colors.black.withOpacity(0.2), - margin: const EdgeInsets.all(12), - child: IconButton( - onPressed: onPressed, - icon: Icon( - iconData?? Icons.amp_stories_outlined, - color: Colors.white, - ), - ), - ); - } -} diff --git a/lib/widgets/button/show_image_button.dart b/lib/widgets/button/show_image_button.dart deleted file mode 100644 index dfe953e..0000000 --- a/lib/widgets/button/show_image_button.dart +++ /dev/null @@ -1,47 +0,0 @@ -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; - -import '../../theme/colors.dart'; - -class ShowImageButton extends StatelessWidget { - String icon, title; - VoidCallback onClick; - - ShowImageButton({required this.icon, required this.title, required this.onClick}); - - @override - Widget build(BuildContext context) { - return InkWell( - onTap: onClick, - child: Container( - width: double.infinity, - child: Column( - children: [ - Container( - width: double.infinity, - height: 120, - child: Card( - color: MyColors.darkPrimaryColor, - shape: RoundedRectangleBorder( - side: BorderSide(color: Colors.transparent, width: 1), - borderRadius: BorderRadius.circular(8), - ), - child: Padding( - padding: EdgeInsets.all(26), - child: SvgPicture.asset( - icon, - color: Colors.white, - ), - ), - ), - ), - 6.height, - title.toText(color: Colors.black, isBold: true, fontSize: 16), - ], - ), - ), - ); - } -} diff --git a/lib/widgets/count_down_timer.dart b/lib/widgets/count_down_timer.dart deleted file mode 100644 index 3817e3c..0000000 --- a/lib/widgets/count_down_timer.dart +++ /dev/null @@ -1,108 +0,0 @@ -import 'package:flutter/material.dart'; - -class CountDownTimer extends StatefulWidget { - const CountDownTimer({ - Key? key, - int? secondsRemaining, - this.countDownTimerStyle, - this.whenTimeExpires, - this.countDownFormatter, - }) - : secondsRemaining = secondsRemaining, - super(key: key); - - final int? secondsRemaining; - final Function? whenTimeExpires; - final Function? countDownFormatter; - final TextStyle ?countDownTimerStyle; - - State createState() => new _CountDownTimerState(); -} - -class _CountDownTimerState extends State - with TickerProviderStateMixin { - late AnimationController _controller; - late Duration duration; - - String get timerDisplayString { - Duration duration = _controller.duration! * _controller.value; - return widget.countDownFormatter != null - ? widget.countDownFormatter!(duration.inSeconds) - : formatHHMMSS(duration.inSeconds); - // In case user doesn't provide formatter use the default one - // for that create a method which will be called formatHHMMSS or whatever you like - } - - @override - void initState() { - super.initState(); - duration = new Duration(seconds: widget.secondsRemaining ?? 0); - _controller = new AnimationController( - vsync: this, - duration: duration, - ); - _controller.reverse(from: widget.secondsRemaining!.toDouble()); - _controller.addStatusListener((status) { - if (status == AnimationStatus.completed || status == AnimationStatus.dismissed) { - widget.whenTimeExpires!(); - } - }); - } - - @override - void didUpdateWidget(CountDownTimer oldWidget) { - if (widget.secondsRemaining != oldWidget.secondsRemaining) { - setState(() { - duration = new Duration(seconds: widget.secondsRemaining ?? 0); - _controller.dispose(); - _controller = new AnimationController( - vsync: this, - duration: duration, - ); - _controller.reverse(from: widget.secondsRemaining?.toDouble()); - _controller.addStatusListener((status) { - if (status == AnimationStatus.completed) { - widget.whenTimeExpires!(); - } else if (status == AnimationStatus.dismissed) { - print("Animation Complete"); - } - }); - }); - } - } - - @override - void dispose() { - _controller.dispose(); - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return new Center( - child: AnimatedBuilder( - animation: _controller, - builder: (_, Widget? child) { - return Text( - timerDisplayString ??"", - style: widget.countDownTimerStyle, - ); - }),); - } -} - -String formatHHMMSS(int seconds) { - int hours = (seconds / 3600).truncate(); - seconds = (seconds % 3600).truncate(); - int minutes = (seconds / 60).truncate(); - - String hoursStr = (hours).toString().padLeft(2, '0'); - String minutesStr = (minutes).toString().padLeft(2, '0'); - String secondsStr = (seconds % 60).toString().padLeft(2, '0'); - - if (hours == 0) { - return "$minutesStr:$secondsStr"; - } - - return "$hoursStr:$minutesStr:$secondsStr"; -} \ No newline at end of file diff --git a/lib/widgets/dialog/dialogs.dart b/lib/widgets/dialog/dialogs.dart deleted file mode 100644 index 9a5a822..0000000 --- a/lib/widgets/dialog/dialogs.dart +++ /dev/null @@ -1,16 +0,0 @@ -import 'package:flutter/material.dart'; - -void showMDialog( - context, { - Widget? child, -}) async { - return showDialog( - context: context, - barrierDismissible: true, - builder: (context) { - return Dialog( - child: child, - ); - }, - ); -} diff --git a/lib/widgets/dialog/message_dialog.dart b/lib/widgets/dialog/message_dialog.dart deleted file mode 100644 index ddf0582..0000000 --- a/lib/widgets/dialog/message_dialog.dart +++ /dev/null @@ -1,34 +0,0 @@ -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:flutter/material.dart'; - -class MessageDialog extends StatelessWidget { - String? title, buttonTitle; - VoidCallback? onClick; - - MessageDialog({this.title, this.buttonTitle, this.onClick}); - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.white, - padding: EdgeInsets.all(30), - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - (title ?? "message").toText(height: 23 / 24, fontSize: 24, letterSpacing: -1.44,), - 40.height, - ShowFillButton( - title: buttonTitle ?? "Continue", - maxWidth: double.infinity, - onPressed: () { - onClick!(); - }, - ) - ], - ), - ); - } -} diff --git a/lib/widgets/dialog/otp_dialog.dart b/lib/widgets/dialog/otp_dialog.dart deleted file mode 100644 index d2393be..0000000 --- a/lib/widgets/dialog/otp_dialog.dart +++ /dev/null @@ -1,133 +0,0 @@ -import 'package:car_customer_app/theme/colors.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:car_customer_app/widgets/count_down_timer.dart'; -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/material.dart'; - -import '../otp_widget.dart'; - -class OtpDialog extends StatefulWidget { - String? userName; - Function(String) onClick; - - OtpDialog({Key? key, required this.onClick, this.userName}) : super(key: key); - - @override - State createState() => _OtpDialogState(); -} - -class _OtpDialogState extends State { - String code = ""; - bool hasTimerStopped = false; - - final TextEditingController _pinPutController = TextEditingController(); - - @override - Widget build(BuildContext context) { - return Container( - color: Colors.white, - padding: const EdgeInsets.all(24), - width: double.infinity, - child: Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - LocaleKeys.insert_otp_code.tr().toText( - height: 23 / 24, - fontSize: 24, - letterSpacing: -1.44, - ), - 8.height, - LocaleKeys.type_code.tr().toText(color: MyColors.textColor, fontSize: 12), - if (widget.userName != null) - (widget.userName ?? "").toText( - color: MyColors.darkPrimaryColor, - fontSize: 12, - ), - 20.height, - Center( - child: OTPWidget( - autoFocus: true, - controller: _pinPutController, - defaultBorderColor: const Color(0xffD8D8D8), - maxLength: 4, - onTextChanged: (text) {}, - pinBoxColor: Colors.white, - onDone: (code) => _onOtpCallBack(code, null), - textBorderColor: MyColors.darkPrimaryColor, - pinBoxWidth: 48, - pinBoxHeight: 48, - pinTextStyle: const TextStyle(fontSize: 24.0, color: MyColors.darkTextColor), - pinTextAnimatedSwitcherTransition: ProvidedPinBoxTextAnimation.scalingTransition, - pinTextAnimatedSwitcherDuration: const Duration(milliseconds: 300), - pinBoxRadius: 0, - keyboardType: TextInputType.number, - ), - ), - 40.height, - ShowFillButton( - title: LocaleKeys.check_code.tr(), - maxWidth: double.infinity, - onPressed: () { - widget.onClick(code); - }, - ), - if (!hasTimerStopped) - Padding( - padding: const EdgeInsets.all(12.0), - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text(LocaleKeys.time_will_expire.tr() + " "), - CountDownTimer( - secondsRemaining: 60, - whenTimeExpires: () { - setState(() { - hasTimerStopped = true; - }); - }, - countDownTimerStyle: const TextStyle( - color: Colors.blue, - height: 1.2, - ), - ), - Text(" " + LocaleKeys.sec.tr()), - ], - ), - ), - if (hasTimerStopped) - InkWell( - onTap: () { - setState(() { - hasTimerStopped = false; - }); - }, - child: Padding( - padding: const EdgeInsets.all(12.0), - child: Text( - LocaleKeys.resend_code.tr(), - style: const TextStyle( - decoration: TextDecoration.underline, - fontWeight: FontWeight.bold, - color: Colors.blue, - ), - ), - ), - ), - ], - ), - ); - } - - _onOtpCallBack(String otpCode, bool? isAutofill) { - if (otpCode.length == 4) { - // onSuccess(otpCode); - code = otpCode; - } - } -} diff --git a/lib/widgets/dragable_sheet.dart b/lib/widgets/dragable_sheet.dart deleted file mode 100644 index 86d468a..0000000 --- a/lib/widgets/dragable_sheet.dart +++ /dev/null @@ -1,25 +0,0 @@ -import 'package:flutter/material.dart'; - -showDraggableDialog(BuildContext context, Widget child) { - showGeneralDialog( - barrierLabel: "Label", - barrierDismissible: false, - barrierColor: Colors.black.withOpacity(0.2), - transitionDuration: Duration(milliseconds: 200), - context: context, - pageBuilder: (context, anim1, anim2) { - return Dismissible( - direction: DismissDirection.vertical, - key: const Key('key'), - onDismissed: (_) => Navigator.of(context).pop(), - child: child, - ); - }, - transitionBuilder: (context, anim1, anim2, child) { - return SlideTransition( - position: Tween(begin: Offset(0, 1), end: Offset(0, 0)).animate(anim1), - child: child, - ); - }, - ); -} diff --git a/lib/widgets/dropdown/dropdow_field.dart b/lib/widgets/dropdown/dropdow_field.dart deleted file mode 100644 index d561b2b..0000000 --- a/lib/widgets/dropdown/dropdow_field.dart +++ /dev/null @@ -1,83 +0,0 @@ -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/theme/colors.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:flutter/material.dart'; - - -class DropValue { - int id; - String value; - String subValue; - - DropValue(this.id, this.value, this.subValue); - - bool operator ==(o) => o is DropValue && o.value == value && o.id == id; -} - -class DropdownField extends StatefulWidget { - String? hint; - List? list; - DropValue? dropdownValue; - Function(DropValue) onSelect; - - DropdownField(this.onSelect, {Key? key, this.hint, this.list,this.dropdownValue}) : super(key: key); - - @override - State createState() => _DropdownFieldState(); -} - -class _DropdownFieldState extends State { - DropValue? dropdownValue; - List defaultV = [ - DropValue(1, "One", ""), - DropValue(2, "Two", ""), - ]; - - @override - void initState() { - super.initState(); - dropdownValue = widget.dropdownValue; - } - - @override - Widget build(BuildContext context) { - return Container( - decoration: Utils.containerColorRadiusBorderWidth( - MyColors.white, - 0, - MyColors.darkPrimaryColor, - 2, - ), - margin: const EdgeInsets.all(0), - padding: const EdgeInsets.only(left: 8, right: 8), - child: DropdownButton( - value: dropdownValue, - icon: const Icon(Icons.keyboard_arrow_down_sharp), - elevation: 16, - iconSize: 16, - iconEnabledColor: borderColor, - iconDisabledColor: borderColor, - isExpanded: true, - style: const TextStyle(color: Colors.black, fontWeight: FontWeight.w600), - hint: (widget.hint ?? "").toText(color: borderColor, fontSize: 12), - underline: Container( - height: 0, - ), - onChanged: (DropValue? newValue) { - setState(() { - dropdownValue = newValue!; - widget.onSelect(newValue); - }); - }, - items: (widget.list ?? defaultV).map>( - (DropValue value) { - return DropdownMenuItem( - value: value, - child: value.value.toText(fontSize: 12), - ); - }, - ).toList(), - ), - ); - } -} diff --git a/lib/widgets/dropdown/dropdown_text.dart b/lib/widgets/dropdown/dropdown_text.dart deleted file mode 100644 index 0b65bf7..0000000 --- a/lib/widgets/dropdown/dropdown_text.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/config/constants.dart'; -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/theme/colors.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; - -class DropDownText extends StatelessWidget { - String title; - - DropDownText(this.title); - - @override - Widget build(BuildContext context) { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - title.toText(color: accentColor, fontSize: 16, letterSpacing: -0.64,), - 16.height, - SvgPicture.asset( - svgIcons + "ic_arrow_down.svg", - width: 10, - height: 10, - ), - ], - ); - } -} diff --git a/lib/widgets/extensions/extensions_widget.dart b/lib/widgets/extensions/extensions_widget.dart deleted file mode 100644 index c046072..0000000 --- a/lib/widgets/extensions/extensions_widget.dart +++ /dev/null @@ -1,233 +0,0 @@ -import 'package:flutter/material.dart'; - -extension ExtendedText on Widget { - showOverlay({double? width, double? height}){ - return Container( - width: width ?? double.infinity, - height: height ?? 60, - decoration: BoxDecoration( - gradient: LinearGradient(colors: [ - Colors.black.withOpacity(0.2), - Colors.black.withOpacity(0.1), - Colors.black.withOpacity(0.004), - ], begin: Alignment.topCenter, end: Alignment.bottomCenter, tileMode: TileMode.clamp), - ), - child: this, - ); - } -} - - - - - -extension ImageExt on Image { - Widget circular() { - return ClipRRect( - clipBehavior: Clip.hardEdge, - borderRadius: BorderRadius.circular(100), - child: this, - ); - } -} - -extension WidgetExt on Widget { - Widget toWidget() { - return this as Widget; - } - - Widget sized({double? width, double? height}) { - return SizedBox( - width: width, - height: height, - child: this, - ); - } - Widget inkWell({required VoidCallback onTap,double radius=0}){ - return InkWell( - child: Material(child: this,color: Colors.transparent,), - onTap: onTap, - ); - } - Widget sizeSq(double size) { - return SizedBox( - width: size, - height: size, - child: this, - ); - } - - Widget fillParent({double hFactor = 1, double? vFactor}) { - return FractionallySizedBox( - heightFactor: null, - widthFactor: hFactor, - child: this, - ); - } - - 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) { - return Padding( - padding: pad, - child: this, - ); - } - return this; - } - - Widget toClip({double r = 40}) { - return ClipRRect( - borderRadius: BorderRadius.all( - Radius.circular(r), - ), - clipBehavior: Clip.antiAlias, - child: this, - ); - } - - // Widget scrollable({Axis? direction, bool fadingEdge = true}) { - // var scrollview = SingleChildScrollView( - // child: this, - // controller: ScrollController(), - // scrollDirection: direction ?? Axis.vertical, - // ); - // return fadingEdge ? scrollview.fadingEdge() : scrollview; - // } - - Widget expand() { - return Expanded( - child: this, - ); - } - - Widget align(Alignment alignment) { - return Align( - alignment: alignment, - child: this, - ); - } - - Widget center() { - return Center( - child: this, - ); - } - - Widget padding(EdgeInsets padding) { - return Padding( - padding: padding, - child: this, - ); - } - - Widget paddingAll(double padding) { - return Padding( - padding: EdgeInsets.all(padding), - child: this, - ); - } - - // Widget onTap(VoidCallback onTap, {double corners = 0}) { - // return Clickable.widget(child: this, corners: corners, onTap: onTap); - // } - - Widget ignoreInteraction() { - return IgnorePointer( - child: this, - ); - } -} - -// extension xScrollView on ScrollView { -// Widget fadingEdge() => FadingEdgeScrollView.fromScrollView( -// child: this, -// gradientFractionOnEnd: 0.08, -// gradientFractionOnStart: 0.08, -// shouldDisposeScrollController: true, -// ); -// } -// -// extension x2ScrollView on SingleChildScrollView { -// Widget fadingEdge() => FadingEdgeScrollView.fromSingleChildScrollView( -// child: this, -// gradientFractionOnEnd: 0.08, -// gradientFractionOnStart: 0.08, -// shouldDisposeScrollController: true, -// ); -// } - -class Position { - final double x, y, w, h; - - Position(this.x, this.y, this.w, this.h); -} - -extension KeyExt on GlobalKey { - Position globalPosition() { - RenderBox box = currentContext!.findRenderObject() as RenderBox; - Offset xy = box.localToGlobal(Offset.zero); - Size wh = box.size; - return Position(xy.dx, xy.dy, wh.width, wh.height); - } -} - -extension StateExt on State { - reload({VoidCallback? b}) { - setState(b ?? () {}); - } -} - -// extension LocatiionExt on Location { -// LatLng toLatLng() { -// return LatLng(lat!, lng!); -// } -// } - -// extension xList on List { -// T randomItem() { -// final random = new Random(); -// var i = random.nextInt(this.length); -// return this[i]; -// } -// -// List append(List items) { -// this.addAll(items); -// return this; -// } -// -// bool isFirst(T item) => first == item; -// -// bool isLast(T item) => last == item; -// -// getOneByOne( -// {required int delayMillis, -// required Function(T) callback, VoidCallback? complete}) async { -// for (var i in this) { -// await delay(delayMillis); -// callback(i); -// } -// complete!(); -// } -// } - -extension xFuture on Future { - thenWithDelay(int millis, Function(T) thenBlock) { - then((value) { - Future.delayed(Duration(milliseconds: millis)) - .then((value) => thenBlock(value)); - }); - } -} - -extension xDouble on int { - Duration durationMillis() => Duration(milliseconds: this); - - Duration durationSec() => Duration(seconds: this); - - Duration durationHour() => Duration(hours: this); -} diff --git a/lib/widgets/gradient_app_bar.dart b/lib/widgets/gradient_app_bar.dart deleted file mode 100644 index c3ded30..0000000 --- a/lib/widgets/gradient_app_bar.dart +++ /dev/null @@ -1,63 +0,0 @@ -import 'package:flutter/material.dart'; - -class GradientAppBar extends StatelessWidget { - final String title; - final double barHeight = 50.0; - IconData? iconData; - - GradientAppBar(this.title, {this.iconData}); - - @override - Widget build(BuildContext context) { - final double statusbarHeight = MediaQuery.of(context).padding.top; - - return new Container( - padding: EdgeInsets.only(top: statusbarHeight), - height: statusbarHeight + barHeight, - child: Row( - children: [ - IconButton( - onPressed: () { - Navigator.pop(context); - }, - icon: Icon( - Icons.arrow_back_ios, - color: Colors.white, - ), - ), - Expanded( - child: Center( - child: Text( - title, - style: TextStyle( - fontSize: 20.0, - color: Colors.white, - fontWeight: FontWeight.bold), - ), - ), - ), - if (iconData != null) - IconButton( - onPressed: () {}, - icon: Icon( - iconData, - color: Colors.white, - ), - ), - ], - ), - decoration: BoxDecoration( - gradient: LinearGradient( - colors: [ - Colors.black.withOpacity(0.4), - Colors.black.withOpacity(0.2), - Colors.black.withOpacity(0.0001), - ], - begin: Alignment.topCenter, - end: Alignment.bottomCenter, - tileMode: TileMode.clamp, - ), - ), - ); - } -} diff --git a/lib/widgets/images/circular_image.dart b/lib/widgets/images/circular_image.dart deleted file mode 100644 index a2c127d..0000000 --- a/lib/widgets/images/circular_image.dart +++ /dev/null @@ -1,30 +0,0 @@ -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:flutter/material.dart'; - -class CircularImage extends StatelessWidget { - final double? w, h, padding; - final String? image; - - const CircularImage({Key? key, this.w, this.h, this.image, this.padding}) : super(key: key); - - @override - Widget build(BuildContext context) { - return SizedBox( - width: w ?? 120, - height: h ?? 120, - child: Card( - shape: Utils.cardRadius(2000), - clipBehavior: Clip.antiAlias, - elevation: 4, - child: Card( - shape: Utils.cardRadius(2000), - clipBehavior: Clip.antiAlias, - elevation: 0, - margin: EdgeInsets.all(padding ?? 0), - child: Image.asset(image ?? icons + "green.jpg"), - ), - ), - ); - } -} diff --git a/lib/widgets/loading_dialog.dart b/lib/widgets/loading_dialog.dart deleted file mode 100644 index bc2da89..0000000 --- a/lib/widgets/loading_dialog.dart +++ /dev/null @@ -1,40 +0,0 @@ -import 'package:flutter/material.dart'; - -class LoadingDialog extends StatefulWidget { - LoadingDialog({Key? key}) : super(key: key); - - @override - _LoadingDialogState createState() { - return _LoadingDialogState(); - } -} - -class _LoadingDialogState extends State { - @override - void initState() { - super.initState(); - } - - @override - void dispose() { - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Dialog( - insetPadding: const EdgeInsets.symmetric(horizontal: 60.0, vertical: 24.0), - shape: RoundedRectangleBorder( - borderRadius: BorderRadius.circular(16), - ), - elevation: 0, - backgroundColor: Colors.transparent, - child: Directionality( - textDirection: TextDirection.rtl, - child: Center( - child: CircularProgressIndicator(), - ), - ), - ); - } -} diff --git a/lib/widgets/otp_widget.dart b/lib/widgets/otp_widget.dart deleted file mode 100644 index c31c8cd..0000000 --- a/lib/widgets/otp_widget.dart +++ /dev/null @@ -1,371 +0,0 @@ -import 'dart:async'; - -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; -import 'package:flutter/services.dart'; - -typedef OnDone = void Function(String text); - -class ProvidedPinBoxTextAnimation { - static AnimatedSwitcherTransitionBuilder scalingTransition = (child, animation) { - return ScaleTransition( - child: child, - scale: animation, - ); - }; - - static AnimatedSwitcherTransitionBuilder defaultNoTransition = (Widget child, Animation animation) { - return child; - }; -} - -class OTPWidget extends StatefulWidget { - final int maxLength; - final TextEditingController? controller; - - final Color defaultBorderColor; - final Color pinBoxColor; - final double pinBoxBorderWidth; - final double pinBoxRadius; - final bool hideDefaultKeyboard; - - final TextStyle? pinTextStyle; - final double pinBoxHeight; - final double pinBoxWidth; - final OnDone? onDone; - final bool hasError; - final Color errorBorderColor; - final Color textBorderColor; - final Function(String)? onTextChanged; - final bool autoFocus; - final FocusNode? focusNode; - final AnimatedSwitcherTransitionBuilder? pinTextAnimatedSwitcherTransition; - final Duration pinTextAnimatedSwitcherDuration; - final TextDirection textDirection; - final TextInputType keyboardType; - final EdgeInsets pinBoxOuterPadding; - - const OTPWidget({ - Key? key, - this.maxLength: 4, - this.controller, - this.pinBoxWidth: 70.0, - this.pinBoxHeight: 70.0, - this.pinTextStyle, - this.onDone, - this.defaultBorderColor: Colors.black, - this.textBorderColor: Colors.black, - this.pinTextAnimatedSwitcherTransition, - this.pinTextAnimatedSwitcherDuration: const Duration(), - this.hasError: false, - this.errorBorderColor: Colors.red, - this.onTextChanged, - this.autoFocus: false, - this.focusNode, - this.textDirection: TextDirection.ltr, - this.keyboardType: TextInputType.number, - this.pinBoxOuterPadding = const EdgeInsets.symmetric(horizontal: 4.0), - this.pinBoxColor = Colors.white, - this.pinBoxBorderWidth = 2.0, - this.pinBoxRadius = 0, - this.hideDefaultKeyboard = false, - }) : super(key: key); - - @override - State createState() { - return OTPWidgetState(); - } -} - -class OTPWidgetState extends State with SingleTickerProviderStateMixin { - AnimationController? _highlightAnimationController; - FocusNode? focusNode; - String text = ""; - int currentIndex = 0; - List strList = []; - bool hasFocus = false; - - @override - void didUpdateWidget(OTPWidget oldWidget) { - super.didUpdateWidget(oldWidget); - focusNode = widget.focusNode ?? focusNode; - - if (oldWidget.maxLength < widget.maxLength) { - setState(() { - currentIndex = text.length; - }); - widget.controller?.text = text; - widget.controller?.selection = TextSelection.collapsed(offset: text.length); - } else if (oldWidget.maxLength > widget.maxLength && widget.maxLength > 0 && text.length > 0 && text.length > widget.maxLength) { - setState(() { - text = text.substring(0, widget.maxLength); - currentIndex = text.length; - }); - widget.controller?.text = text; - widget.controller?.selection = TextSelection.collapsed(offset: text.length); - } - } - - _calculateStrList() { - if (strList.length > widget.maxLength) { - strList.length = widget.maxLength; - } - while (strList.length < widget.maxLength) { - strList.add(""); - } - } - - @override - void initState() { - super.initState(); - focusNode = widget.focusNode ?? FocusNode(); - - _initTextController(); - _calculateStrList(); - widget.controller?.addListener(_controllerListener); - focusNode?.addListener(_focusListener); - } - - void _controllerListener() { - if (mounted == true) { - setState(() { - _initTextController(); - }); - var onTextChanged = widget.onTextChanged; - if (onTextChanged != null) { - onTextChanged(widget.controller?.text ?? ""); - } - } - } - - void _focusListener() { - if (mounted == true) { - setState(() { - hasFocus = focusNode?.hasFocus ?? false; - }); - } - } - - void _initTextController() { - if (widget.controller == null) { - return; - } - strList.clear(); - var text = widget.controller?.text ?? ""; - if (text.isNotEmpty) { - if (text.length > widget.maxLength) { - throw Exception("TextEditingController length exceeded maxLength!"); - } - } - for (var i = 0; i < text.length; i++) { - strList.add(text[i]); - } - } - - double get _width { - var width = 0.0; - for (var i = 0; i < widget.maxLength; i++) { - width += widget.pinBoxWidth; - if (i == 0) { - width += widget.pinBoxOuterPadding.left; - } else if (i + 1 == widget.maxLength) { - width += widget.pinBoxOuterPadding.right; - } else { - width += widget.pinBoxOuterPadding.left; - } - } - return width; - } - - @override - void dispose() { - if (widget.focusNode == null) { - focusNode?.dispose(); - } else { - focusNode?.removeListener(_focusListener); - } - _highlightAnimationController?.dispose(); - widget.controller?.removeListener(_controllerListener); - - super.dispose(); - } - - @override - Widget build(BuildContext context) { - return Stack( - children: [ - _otpTextInput(), - _touchPinBoxRow(), - ], - ); - } - - Widget _touchPinBoxRow() { - return widget.hideDefaultKeyboard - ? _pinBoxRow(context) - : GestureDetector( - behavior: HitTestBehavior.opaque, - onTap: () { - if (hasFocus) { - FocusScope.of(context).requestFocus(FocusNode()); - Future.delayed(Duration(milliseconds: 100), () { - FocusScope.of(context).requestFocus(focusNode); - }); - } else { - FocusScope.of(context).requestFocus(focusNode); - } - }, - child: _pinBoxRow(context), - ); - } - - Widget _otpTextInput() { - var transparentBorder = OutlineInputBorder( - borderSide: BorderSide( - color: Colors.transparent, - width: 0.0, - ), - ); - return Container( - width: _width, - height: widget.pinBoxHeight, - child: TextField( - autofocus: !kIsWeb ? widget.autoFocus : false, - enableInteractiveSelection: false, - focusNode: focusNode, - controller: widget.controller, - keyboardType: widget.keyboardType, - inputFormatters: widget.keyboardType == TextInputType.number ? [FilteringTextInputFormatter.digitsOnly] : null, - style: TextStyle( - height: 0.1, - color: Colors.transparent, - ), - decoration: InputDecoration( - contentPadding: EdgeInsets.all(0), - focusedErrorBorder: transparentBorder, - errorBorder: transparentBorder, - disabledBorder: transparentBorder, - enabledBorder: transparentBorder, - focusedBorder: transparentBorder, - counterText: null, - counterStyle: null, - helperStyle: TextStyle( - height: 0.0, - color: Colors.transparent, - ), - labelStyle: TextStyle(height: 0.1), - fillColor: Colors.transparent, - border: InputBorder.none, - ), - cursorColor: Colors.transparent, - showCursor: false, - maxLength: widget.maxLength, - onChanged: _onTextChanged, - ), - ); - } - - void _onTextChanged(text) { - var onTextChanged = widget.onTextChanged; - if (onTextChanged != null) { - onTextChanged(text); - } - setState(() { - this.text = text; - if (text.length >= currentIndex) { - for (int i = currentIndex; i < text.length; i++) { - strList[i] = text[i]; - } - } - currentIndex = text.length; - }); - if (text.length == widget.maxLength) { - FocusScope.of(context).requestFocus(FocusNode()); - var onDone = widget.onDone; - if (onDone != null) { - onDone(text); - } - } - } - - Widget _pinBoxRow(BuildContext context) { - _calculateStrList(); - List pinCodes = List.generate(widget.maxLength, (int i) { - return _buildPinCode(i, context); - }); - return Row(children: pinCodes, mainAxisSize: MainAxisSize.min); - } - - Widget _buildPinCode(int i, BuildContext context) { - Color borderColor; - Color pinBoxColor = widget.pinBoxColor; - - if (widget.hasError) { - borderColor = widget.errorBorderColor; - } else if (i < text.length) { - borderColor = widget.textBorderColor; - } else { - borderColor = widget.defaultBorderColor; - pinBoxColor = widget.pinBoxColor; - } - - EdgeInsets insets; - if (i == 0) { - insets = EdgeInsets.only( - left: 0, - top: widget.pinBoxOuterPadding.top, - right: widget.pinBoxOuterPadding.right, - bottom: widget.pinBoxOuterPadding.bottom, - ); - } else if (i == strList.length - 1) { - insets = EdgeInsets.only( - left: widget.pinBoxOuterPadding.left, - top: widget.pinBoxOuterPadding.top, - right: 0, - bottom: widget.pinBoxOuterPadding.bottom, - ); - } else { - insets = widget.pinBoxOuterPadding; - } - return Container( - key: ValueKey("container$i"), - alignment: Alignment.center, - padding: EdgeInsets.symmetric(vertical: 4.0, horizontal: 1.0), - margin: insets, - child: _animatedTextBox(strList[i], i), - decoration: BoxDecoration( - border: Border.all( - color: borderColor, - width: widget.pinBoxBorderWidth, - ), - color: pinBoxColor, - borderRadius: BorderRadius.circular(widget.pinBoxRadius), - ), - width: widget.pinBoxWidth, - height: widget.pinBoxHeight, - ); - } - - Widget _animatedTextBox(String text, int i) { - if (widget.pinTextAnimatedSwitcherTransition != null) { - return AnimatedSwitcher( - duration: widget.pinTextAnimatedSwitcherDuration, - transitionBuilder: widget.pinTextAnimatedSwitcherTransition ?? - (Widget child, Animation animation) { - return child; - }, - child: Text( - text, - key: ValueKey("$text$i"), - style: widget.pinTextStyle, - ), - ); - } else { - return Text( - text, - key: ValueKey("${strList[i]}$i"), - style: widget.pinTextStyle, - ); - } - } -} diff --git a/lib/widgets/show_card_buttton.dart b/lib/widgets/show_card_buttton.dart deleted file mode 100644 index 68a73ee..0000000 --- a/lib/widgets/show_card_buttton.dart +++ /dev/null @@ -1,31 +0,0 @@ -import 'package:car_customer_app/widgets/show_fill_button.dart'; -import 'package:flutter/material.dart'; - -class ShowCardButton extends StatelessWidget { - String title; - VoidCallback onPressed; - Color txtColor; - - ShowCardButton({ - required this.title, - required this.onPressed, - this.txtColor = Colors.white, - }); - - @override - Widget build(BuildContext context) { - return Card( - margin: EdgeInsets.zero, - elevation: 20, - child: Container( - width: double.infinity, - padding: EdgeInsets.all(12), - child: ShowFillButton( - title: title, - onPressed: onPressed, - txtColor: txtColor, - ), - ), - ); - } -} diff --git a/lib/widgets/show_fill_button.dart b/lib/widgets/show_fill_button.dart deleted file mode 100644 index 72cf356..0000000 --- a/lib/widgets/show_fill_button.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:flutter/material.dart'; - -import '../theme/colors.dart'; - -class ShowFillButton extends StatelessWidget { - String title; - VoidCallback onPressed; - Color txtColor; - double elevation, radius, maxWidth, maxHeight, fontSize, horizontalPadding, horizontalMargin, verticalMargin; - bool isFlatButton, isBold; - - ShowFillButton({ - required this.title, - required this.onPressed, - this.txtColor = Colors.white, - this.elevation = 0, - this.radius = 0, - this.maxWidth = 88, - this.maxHeight = 45, - this.fontSize = 16, - this.horizontalPadding = 16, - this.isFlatButton = false, - this.isBold = true, - this.horizontalMargin = 0, - this.verticalMargin = 0, - }); - - @override - Widget build(BuildContext context) { - return isFlatButton - ? Container( - child: showButton(), - height: maxHeight, - padding: const EdgeInsets.only( - left: 20, - right: 20, - ), - ) - : ConstrainedBox( - constraints: BoxConstraints( - minHeight: maxHeight, - minWidth: maxWidth, - maxHeight: maxHeight, - maxWidth: maxWidth, - ), - child: showButton(), - ); - } - - Widget showButton() { - return Container( - // decoration: isFlatButton ? null : MyColors.gradientButton, - color:isFlatButton ? null : MyColors.darkPrimaryColor, - margin: EdgeInsets.symmetric(horizontal: horizontalMargin, vertical: verticalMargin), - child: MaterialButton( - onPressed: onPressed, - shape: new RoundedRectangleBorder( - borderRadius: new BorderRadius.circular(radius), - ), - child: title.toText( - fontSize: fontSize, - isBold: isBold, - color: txtColor, - ), - ), - ); - } -} diff --git a/lib/widgets/tab/login_email_tab.dart b/lib/widgets/tab/login_email_tab.dart deleted file mode 100644 index fa223a3..0000000 --- a/lib/widgets/tab/login_email_tab.dart +++ /dev/null @@ -1,84 +0,0 @@ -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/generated/locale_keys.g.dart'; -import 'package:easy_localization/src/public_ext.dart'; -import 'package:flutter/material.dart'; - -import '../../theme/colors.dart'; - -enum ClassType { EMAIL, NUMBER } - -class LoginEmailTab extends StatefulWidget { - Function(ClassType) onSelection; - - LoginEmailTab({required this.onSelection}); - - @override - State createState() => _LoginEmailTabState(); -} - -class _LoginEmailTabState extends State { - ClassType type = ClassType.EMAIL; - - @override - Widget build(BuildContext context) { - return Container( - width: double.infinity, - child: Row( - children: [ - Expanded( - child: InkWell( - onTap: () { - type = ClassType.EMAIL; - widget.onSelection(ClassType.EMAIL); - }, - child: Container( - width: double.infinity, - height: 45, - decoration: BoxDecoration( - color: type == ClassType.EMAIL ? MyColors.darkPrimaryColor : Colors.grey[200], - // border: Border.all(color: type == ClassType.NUMBER ? MyColors.darkPrimaryColor : Colors.transparent, width: 2), - borderRadius: BorderRadius.all(Radius.circular(0)), - ), - child: Center( - child: Text( - LocaleKeys.email.tr(), - style: TextStyle( - color: type == ClassType.EMAIL ? MyColors.white : Colors.black, - ), - ), - ), - ), - ), - ), - 12.width, - Expanded( - child: InkWell( - onTap: () { - type = ClassType.NUMBER; - widget.onSelection(ClassType.NUMBER); - }, - child: Container( - width: double.infinity, - height: 45, - decoration: BoxDecoration( - color: type == ClassType.NUMBER ? MyColors.darkPrimaryColor : Colors.grey[200], - // border: Border.all(color: type == ClassType.NUMBER ? MyColors.darkPrimaryColor : Colors.transparent, width: 2), - borderRadius: BorderRadius.all(Radius.circular(0)), - ), - child: Center( - child: Text( - LocaleKeys.phoneNumber.tr(), - style: TextStyle( - color: type == ClassType.NUMBER ? MyColors.white : Colors.black, - ), - ), - ), - ), - ), - ), - - ], - ), - ); - } -} diff --git a/lib/widgets/txt_field.dart b/lib/widgets/txt_field.dart deleted file mode 100644 index c4f16a5..0000000 --- a/lib/widgets/txt_field.dart +++ /dev/null @@ -1,164 +0,0 @@ -import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/string_extensions.dart'; -import 'package:car_customer_app/theme/colors.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:flutter/material.dart'; -import 'package:sizer/sizer.dart'; - -class TxtField extends StatelessWidget { - TextEditingController controller = TextEditingController(); - String? value; - String? hint; - String? lable; - IconData? prefixData; - IconData? postfixData; - bool isNeedFilterButton; - bool isNeedClickAll; - bool isButtonEnable; - double? elevation; - VoidCallback? onTap; - String? buttonTitle; - int? maxLines; - bool isSidePaddingZero; - bool isNeedBorder; - bool? isPasswordEnabled; - Function(String)? onChanged; - TextInputType? keyboardType; - bool isBackgroundEnabled = false; - - TxtField({ - Key? key, - this.value, - this.lable, - this.hint, - this.prefixData, - this.postfixData, - this.isNeedClickAll = false, - this.isNeedFilterButton = false, - this.elevation, - this.onTap, - this.isButtonEnable = false, - this.buttonTitle, - this.maxLines, - this.isSidePaddingZero = false, - this.isNeedBorder = true, - this.onChanged, - this.isPasswordEnabled, - this.keyboardType, - this.isBackgroundEnabled = false, - }) : super(key: key); - - @override - Widget build(BuildContext context) { - controller.text = value ?? ""; - controller.selection = TextSelection.fromPosition(TextPosition(offset: controller.text.length)); - return InkWell( - onTap: isNeedClickAll == false - ? null - : () { - onTap!(); - }, - customBorder: Utils.inkWellCorner(), - child: Row( - children: [ - Expanded( - child: Container( - decoration: BoxDecoration( - color: isBackgroundEnabled ? MyColors.textFieldColor : Colors.white, - borderRadius: const BorderRadius.all(Radius.circular(0)), - ), - child: TextField( - keyboardType: keyboardType, - autofocus: false, - controller: controller, - enabled: isNeedClickAll == true ? false : true, - maxLines: maxLines, - onTap: () {}, - obscureText: isPasswordEnabled ?? false, - onChanged: onChanged, - decoration: InputDecoration( - labelText: lable, - alignLabelWithHint: true, - fillColor: Colors.white, - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: MyColors.darkPrimaryColor, width: isNeedBorder ? 2.0 : 0), - borderRadius: BorderRadius.circular(0.0), - ), - enabledBorder: OutlineInputBorder( - // borderSide: BorderSide(color: MyColors.textFieldColor, width: isNeedBorder ? 1.0 : 0), - borderSide: BorderSide(color: MyColors.darkPrimaryColor, width: isNeedBorder ? 2.0 : 0), - borderRadius: BorderRadius.circular(0.0), - ), - disabledBorder: OutlineInputBorder( - // borderSide: BorderSide(color: MyColors.textFieldColor, width: isNeedBorder ? 1.0 : 0), - borderSide: BorderSide(color: MyColors.darkPrimaryColor, width: isNeedBorder ? 2.0 : 0), - borderRadius: BorderRadius.circular(0.0), - ), - prefixIcon: prefixData != null ? const Icon(Icons.search, color: borderColor) : null, - labelStyle: TextStyle(color: borderColor, fontSize: 13.sp), - hintStyle: TextStyle(color: borderColor, fontSize: 9.sp), - hintText: hint ?? "", - contentPadding: prefixData == null - ? EdgeInsets.only( - left: 12, - right: 12, - top: maxLines != null ? 12 : 0, - bottom: maxLines != null ? 12 : 0, - ) - : EdgeInsets.zero, - ), - ), - ), - ), - if (isNeedFilterButton) 8.width, - if (isNeedFilterButton) - InkWell( - onTap: isNeedClickAll - ? null - : () { - controller.clear(); - }, - child: SizedBox( - width: 55, - height: 55, - child: Card( - color: accentColor, - // margin: EdgeInsets.all(4), - // shape: cardRadius(0), - child: Icon( - postfixData ?? Icons.filter_alt, - color: Colors.white, - ), - ), - ), - ), - if (isButtonEnable) - Material( - child: InkWell( - onTap: onTap, - customBorder: Utils.inkWellCorner(), - child: SizedBox( - height: 55, - child: Card( - color: accentColor, - // margin: EdgeInsets.all(4), - // shape: cardRadius(0), - child: Center( - child: Padding( - padding: const EdgeInsets.only(left: 12, right: 12), - child: (buttonTitle ?? "Search").toText( - color: Colors.white, - fontSize: 16, - letterSpacing: -0.64, - ), - ), - ), - ), - ), - ), - ), - ], - ), - ); - } -} diff --git a/lib/widgets/user_image.dart b/lib/widgets/user_image.dart deleted file mode 100644 index 5f178bb..0000000 --- a/lib/widgets/user_image.dart +++ /dev/null @@ -1,26 +0,0 @@ -import 'package:car_customer_app/classes/consts.dart'; -import 'package:car_customer_app/utils/utils.dart'; -import 'package:flutter/material.dart'; - -class UserImage extends StatelessWidget { - final double? size; - final String? url; - - const UserImage({Key? key, this.size, this.url}) : super(key: key); - - @override - Widget build(BuildContext context) { - return Container( - height: size ?? 60, - width: size ?? 60, - decoration: Utils.containerRadius(Colors.transparent, 1000), - clipBehavior: Clip.antiAlias, - child: Image.asset( - url ?? icons + "Blue Masked.jpg", - width: double.infinity, - height: double.infinity, - fit: BoxFit.cover, - ), - ); - } -} diff --git a/pubspec.yaml b/pubspec.yaml index 867f61e..46981f4 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -34,9 +34,9 @@ dependencies: # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2 - image_picker: ^0.8.4+4 - easy_localization: ^3.0.0 - flutter_password_strength: ^0.1.6 + + mc_common_app: + path: C:/Users/mirza.shafique/AndroidStudioProjects/mc_common_app dev_dependencies: flutter_test: @@ -47,16 +47,7 @@ dev_dependencies: # activated in the `analysis_options.yaml` file located at the root of your # package. See that file for information about deactivating specific lint # rules and activating additional ones. - flutter_lints: ^1.0.0 - path_provider: ^2.0.4 - injector: ^2.0.0 - provider: ^6.0.0 - http: ^0.13.3 - permission_handler: ^10.2.0 - flutter_svg: ^1.0.3 - sizer: ^2.0.15 - fluttertoast: ^8.0.9 - shared_preferences: ^2.0.6 + # For information on the generic Dart part of this file, see the @@ -70,12 +61,6 @@ flutter: # the material Icons class. uses-material-design: true - assets: - - assets/ - - assets/langs/ - - assets/icons/ - - assets/images/ - # To add assets to your application, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg @@ -92,9 +77,9 @@ flutter: # "family" key with the font family name, and a "fonts" key with a # list giving the asset and other descriptors for the font. For # example: - fonts: - - family: Poppins - fonts: - - asset: assets/fonts/Poppins-Medium.ttf +# fonts: +# - family: Poppins +# fonts: +# - asset: assets/fonts/Poppins-Medium.ttf # For details regarding fonts from package dependencies, # see https://flutter.dev/custom-fonts/#from-packages