diff --git a/lib/api/client/user_api_client.dart b/lib/api/client/user_api_client.dart index 087fbcb..5501ee3 100644 --- a/lib/api/client/user_api_client.dart +++ b/lib/api/client/user_api_client.dart @@ -80,6 +80,15 @@ class UserApiClent { return await ApiClient().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams); } + Future RefreshToken(String token, String refreshToken) async { + var postParams = { + "token": token, + "refreshToken": refreshToken + }; + String t = AppState().getUser.data!.accessToken ?? ""; + return await ApiClient().postJsonForResponse(ApiConsts.RefreshToken, postParams, token: t); + } + Future getAllCountries() async { var postParams = {}; return await ApiClient().getJsonForObject((json) => Country.fromJson(json), ApiConsts.GetAllCountry); diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index bda0cac..540315e 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -5,6 +5,7 @@ class ApiConsts { 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 diff --git a/lib/generated/codegen_loader.g.dart b/lib/generated/codegen_loader.g.dart index 3e71d4c..c629cb6 100644 --- a/lib/generated/codegen_loader.g.dart +++ b/lib/generated/codegen_loader.g.dart @@ -16,7 +16,7 @@ class CodegenLoader extends AssetLoader{ static const Map ar_SA = { "firstTimeLogIn": "تسجيل الدخول لأول مره", - "signUp": "تسجيل دخول", + "signUp": "التسجيل", "changeMobile": "تغيير رقم الجوال", "notifications": "الاشعارات", "general": "عام", @@ -26,6 +26,7 @@ class CodegenLoader extends AssetLoader{ "retrievePassword": "استرجاع كلمة المرور", "changeEmail": "تغيير الايميل", "verify": "تحقق", + "verified": "تم التحقق", "signOut": "تسجيل خروج", "enterEmail": "ادخل الايميل", "enterNewEmail": "ادخل ايميل جديد", @@ -81,6 +82,17 @@ class CodegenLoader extends AssetLoader{ "imageDeleted": "تم حذف الصوره", "dashboard": "الصفحه الرئيسيه", "termsOfService": "من خلال إنشاء حساب فإنك توافق على شروط الخدمة و\n سياسة الخصوصية", + "userInformation": "معلومات المتسخدم", + "faceRecognition": "تحقق مع بصمة الوجه", + "fingerPrint": "تحقق مع بصمة الاصبع", + "whatsapp": "تحقق مع Whatsapp", + "SMS": "رسائل قصيره", + "selectRole": "حدد الدور", + "userRoleOrTitle": "عنوان المستخدم", + "codeSentToEmail": "تم ارسال الرمز للايميل", + "number": "موبايل", + "arabic": "عربي", + "english": "English", "title": "Hello", "msg": "Hello {} in the {} world ", "msg_named": "{} are written in the {lang} language", @@ -130,6 +142,7 @@ static const Map en_US = { "retrievePassword": "Retrieve Password", "changeEmail": "Change Email", "verify": "Verify", + "verified": "Verified", "signOut": "Sign Out", "enterEmail": "Enter Email", "enterNewEmail": "Enter New Email", @@ -185,6 +198,16 @@ static const Map en_US = { "imageDeleted": "Image is Deleted", "dashboard": "Dashboard/Main Page", "termsOfService": "By creating an account you agree to our Terms of Service and\n Privacy Policy", + "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": "English", "title": "Hello", "msg": "Hello {} in the {} world ", "msg_named": "{} are written in the {lang} language", diff --git a/lib/main.dart b/lib/main.dart index 5885a84..75cf83c 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -21,7 +21,8 @@ Future main() async { Locale('en', 'US') ], - fallbackLocale: Locale('ar', 'SA'), + fallbackLocale: Locale('en', 'US'), + startLocale: Locale('ar', 'SA'), path: 'resources/langs', child: MyApp(), ), diff --git a/lib/models/user/register_user.dart b/lib/models/user/register_user.dart index fef636f..9edee72 100644 --- a/lib/models/user/register_user.dart +++ b/lib/models/user/register_user.dart @@ -1,12 +1,12 @@ // To parse this JSON data, do // -// final user = userFromMap(jsonString); +// final registerUser = registerUserFromJson(jsonString); import 'dart:convert'; -RegisterUser userFromMap(String str) => RegisterUser.fromJson(json.decode(str)); +RegisterUser registerUserFromJson(String str) => RegisterUser.fromJson(json.decode(str)); -String userToMap(RegisterUser data) => json.encode(data.toMap()); +String registerUserToJson(RegisterUser data) => json.encode(data.toJson()); class RegisterUser { RegisterUser({ @@ -16,28 +16,56 @@ class RegisterUser { this.message, }); - dynamic totalItemsCount; + dynamic? totalItemsCount; Data? data; int? messageStatus; String? message; factory RegisterUser.fromJson(Map json) => RegisterUser( - totalItemsCount: json["totalItemsCount"], - data: json["data"] == null ? null : Data.fromMap(json["data"]), - messageStatus: json["messageStatus"] == null ? null : json["messageStatus"], - message: json["message"] == null ? null : json["message"], - ); + totalItemsCount: json["totalItemsCount"], + data: Data.fromJson(json["data"]), + messageStatus: json["messageStatus"], + message: json["message"], + ); - Map toMap() => { - "totalItemsCount": totalItemsCount, - "data": data == null ? null : data!.toMap(), - "messageStatus": messageStatus == null ? null : messageStatus, - "message": message == null ? null : message, - }; + Map toJson() => { + "totalItemsCount": totalItemsCount, + "data": data!.toJson(), + "messageStatus": messageStatus, + "message": message, + }; } class Data { Data({ + this.accessToken, + this.refreshToken, + this.expiryDate, + this.userInfo, + }); + + String? accessToken; + String? refreshToken; + DateTime? expiryDate; + UserInfo? userInfo; + + factory Data.fromJson(Map json) => Data( + accessToken: json["accessToken"], + refreshToken: json["refreshToken"], + expiryDate: DateTime.parse(json["expiryDate"]), + userInfo: UserInfo.fromJson(json["userInfo"]), + ); + + Map toJson() => { + "accessToken": accessToken, + "refreshToken": refreshToken, + "expiryDate": expiryDate!.toIso8601String(), + "userInfo": userInfo!.toJson(), + }; +} + +class UserInfo { + UserInfo({ this.id, this.userId, this.firstName, @@ -52,66 +80,74 @@ class Data { this.isVerified, this.userRoles, this.isCustomer, - this.isProvider, + this.isProviderDealership, + this.isDealershipUser, this.providerId, this.customerId, + this.dealershipId, }); int? id; String? userId; - dynamic? firstName; - dynamic? lastName; + String? firstName; + String? lastName; String? mobileNo; String? email; - dynamic? userImageUrl; + String? userImageUrl; int? roleId; - dynamic? roleName; + String? roleName; bool? isEmailVerified; List? serviceProviderBranch; bool? isVerified; List? userRoles; bool? isCustomer; - bool? isProvider; + bool? isProviderDealership; + bool? isDealershipUser; dynamic? providerId; - dynamic? customerId; + int? customerId; + dynamic? dealershipId; - factory Data.fromMap(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"], - isProvider: json["isProvider"] == null ? null : json["isProvider"], - providerId: json["providerID"], - customerId: json["customerID"], - ); + factory UserInfo.fromJson(Map json) => UserInfo( + id: json["id"], + userId: json["userID"], + firstName: json["firstName"], + lastName: json["lastName"], + mobileNo: json["mobileNo"], + email: json["email"], + userImageUrl: json["userImageUrl"], + roleId: json["roleID"], + roleName: json["roleName"], + isEmailVerified: json["isEmailVerified"], + serviceProviderBranch: List.from(json["serviceProviderBranch"].map((x) => x)), + isVerified: json["isVerified"], + userRoles: List.from(json["userRoles"].map((x) => x)), + isCustomer: json["isCustomer"], + isProviderDealership: json["isProviderDealership"], + isDealershipUser: json["isDealershipUser"], + providerId: json["providerID"], + customerId: json["customerID"], + dealershipId: json["dealershipID"], + ); - Map toMap() => { - "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, - "isProvider": isProvider == null ? null : isProvider, - "providerID": providerId, - "customerID": customerId, - }; + Map toJson() => { + "id": id, + "userID": userId, + "firstName": firstName, + "lastName": lastName, + "mobileNo": mobileNo, + "email": email, + "userImageUrl": userImageUrl, + "roleID": roleId, + "roleName": roleName, + "isEmailVerified": isEmailVerified, + "serviceProviderBranch": List.from(serviceProviderBranch!.map((x) => x)), + "isVerified": isVerified, + "userRoles": List.from(userRoles!.map((x) => x)), + "isCustomer": isCustomer, + "isProviderDealership": isProviderDealership, + "isDealershipUser": isDealershipUser, + "providerID": providerId, + "customerID": customerId, + "dealershipID": dealershipId, + }; } diff --git a/lib/pages/dashboard/dashboard_page.dart b/lib/pages/dashboard/dashboard_page.dart index 239dc23..88079cf 100644 --- a/lib/pages/dashboard/dashboard_page.dart +++ b/lib/pages/dashboard/dashboard_page.dart @@ -143,7 +143,7 @@ class _DashboardPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ userName.toText24(), - "User role or title".toText12(), + LocaleKeys.userRoleOrTitle.tr().toText12(), ], ), ), diff --git a/lib/pages/user/complete_profile_page.dart b/lib/pages/user/complete_profile_page.dart index a968cbd..177e591 100644 --- a/lib/pages/user/complete_profile_page.dart +++ b/lib/pages/user/complete_profile_page.dart @@ -18,6 +18,7 @@ import 'package:car_customer_app/extensions/string_extensions.dart'; import 'package:car_customer_app/widgets/txt_field.dart'; import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_password_strength/flutter_password_strength.dart'; class CompleteProfilePage extends StatefulWidget { RegisterUser user; @@ -29,9 +30,15 @@ class CompleteProfilePage extends StatefulWidget { } class _CompleteProfilePageState extends State { - String? firstName = "", lastName = "", email = "", password = "", confirmPassword = ""; + String? firstName = "", + lastName = "", + email = "", + confirmPassword = ""; + late String password = ""; bool isChecked = false; + double _strength = 0; + @override void initState() { // TODO: implement initState @@ -62,7 +69,7 @@ class _CompleteProfilePageState extends State { ), 12.height, TxtField( - hint:LocaleKeys.surname.tr(), + hint: LocaleKeys.surname.tr(), value: lastName, onChanged: (v) { lastName = v; @@ -72,7 +79,7 @@ class _CompleteProfilePageState extends State { TxtField( hint: LocaleKeys.email.tr(), value: email, - // isButtonEnable: email!.length > 0 ? true : false, + // isButtonEnable: email!.length > 0 ? true : false, buttonTitle: LocaleKeys.verify.tr(), onChanged: (v) { email = v; @@ -84,9 +91,29 @@ class _CompleteProfilePageState extends State { isPasswordEnabled: true, maxLines: 1, value: password, - onChanged: (v) { - password = v; - }, + onChanged: (value) => _checkPassword(value), + // onChanged: (v) { + // password = v; + // }, + ), + password!.isNotEmpty ? 12.height : 0.height, + // The strength indicator bar + password!.isNotEmpty ? LinearProgressIndicator( + value: _strength, + backgroundColor: Colors.grey[300], + color: _strength <= 1 / 4 + ? Colors.yellow + : _strength == 2 / 4 + ? Colors.orange + : _strength == 3 / 4 + ? Colors.deepOrange + : Colors.red, + minHeight: 4, + ): Container(), + // The message about the strength of the entered password + Text( + _displayText, + style: const TextStyle(fontSize: 12), ), 12.height, TxtField( @@ -125,7 +152,8 @@ class _CompleteProfilePageState extends State { ); } - Widget buildCheckbox() => Checkbox( + Widget buildCheckbox() => + Checkbox( value: isChecked, activeColor: Colors.blue, onChanged: (value) { @@ -162,13 +190,13 @@ class _CompleteProfilePageState extends State { Future performCompleteProfile() async { if (validateStructure(password ?? "")) { if (password == confirmPassword) { - print(widget.user.data!.userId ?? "userId"); + print(widget.user.data!.userInfo!.userId ?? "userId"); Utils.showLoading(context); - RegisterUser user = await UserApiClent().basicComplete(widget.user.data?.userId ?? "", firstName!, lastName!, email!, password!); + RegisterUser user = await UserApiClent().basicComplete(widget.user.data?.userInfo!.userId ?? "", firstName!, lastName!, email!, password!); Utils.hideLoading(context); if (user.messageStatus == 1) { Utils.showToast(LocaleKeys.successfullyRegistered.tr()); - //("Successfully Registered, Please login once"); + //("Successfully Registered, Please login once"); pop(context); // navigateReplaceWithName(context, AppRoutes.dashboard,arguments: user); } else { @@ -176,11 +204,11 @@ class _CompleteProfilePageState extends State { } } else { Utils.showToast(LocaleKeys.pleaseEnterSamePassword.tr()); - //("Please enter same password"); + //("Please enter same password"); } } else { Utils.showToast(LocaleKeys.passwordShouldContains.tr()); - //("Password Should contains Character, Number, Capital and small letters"); + //("Password Should contains Character, Number, Capital and small letters"); } } @@ -190,6 +218,7 @@ class _CompleteProfilePageState extends State { return regExp.hasMatch(value); } + bool isEmail(String em) { 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 = new RegExp(p); @@ -200,27 +229,59 @@ class _CompleteProfilePageState extends State { bool isValid = true; if (firstName!.isEmpty) { Utils.showToast(LocaleKeys.firstNameMandatory.tr()); - //("First name is mandatory"); + //("First name is mandatory"); isValid = false; } else if (lastName!.isEmpty) { Utils.showToast(LocaleKeys.surnameNameMandatory.tr()); - //("Surname is mandatory"); + //("Surname is mandatory"); isValid = false; } else if (email!.isNotEmpty) { - if(!isEmail(email!)){ + if (!isEmail(email!)) { Utils.showToast(LocaleKeys.enterValidEmail.tr()); - //("Enter Valid Email"); + //("Enter Valid Email"); isValid = false; } - }else if (password!.isEmpty) { + } else if (password!.isEmpty) { Utils.showToast(LocaleKeys.passwordNameMandatory.tr()); - //("Password is mandatory"); + //("Password is mandatory"); isValid = false; } else if (!isChecked) { Utils.showToast(LocaleKeys.pleaseAcceptTerms.tr()); - //("Please accept terms"); + //("Please accept terms"); isValid = false; } return isValid; } + + RegExp numReg = RegExp(r".*[0-9].*"); + RegExp letterReg = RegExp(r".*[A-Za-z].*"); + + String _displayText = ''; + + void _checkPassword(String value) { + password = value.trim(); + if (password!.length <= 6) { + setState(() { + _strength = 1 / 4; + _displayText = 'Your password is too short'; + }); + } else if (password!.length < 8) { + setState(() { + _strength = 2 / 4; + _displayText = 'Your password is acceptable but not strong'; + }); + } else { + if (!letterReg.hasMatch(password!) || !numReg.hasMatch(password!)) { + setState(() { + _strength = 3 / 4; + _displayText = 'Your password is strong'; + }); + } else { + setState(() { + _strength = 1; + _displayText = 'Your password is very strong'; + }); + } + } + } } diff --git a/lib/pages/user/confirm_new_password_page.dart b/lib/pages/user/confirm_new_password_page.dart index 114c3a0..4628871 100644 --- a/lib/pages/user/confirm_new_password_page.dart +++ b/lib/pages/user/confirm_new_password_page.dart @@ -111,7 +111,7 @@ class _ConfirmNewPasswordPageState extends State { bool validation() { bool isValid = true; if (newPassword != confirmPassword) { - Utils.showToast("Confirmation password does not match the entered password"); + Utils.showToast(LocaleKeys.pleaseEnterSamePassword.tr()); isValid = false; } return isValid; diff --git a/lib/pages/user/edit_account_page.dart b/lib/pages/user/edit_account_page.dart index 09b7688..87fc693 100644 --- a/lib/pages/user/edit_account_page.dart +++ b/lib/pages/user/edit_account_page.dart @@ -79,7 +79,7 @@ class _EditAccountPageState extends State { ), LocaleKeys.changeEmail.tr().toText12(), InkWell( - child: ((AppState().getUser.data!.userInfo!.isEmailVerified ?? false) ? "Verified" : "Verify").toText12(), + child: ((AppState().getUser.data!.userInfo!.isEmailVerified ?? false) ? LocaleKeys.verified.tr() : LocaleKeys.verify.tr()).toText12(), onTap: (AppState().getUser.data!.userInfo!.isEmailVerified ?? false) ? null : () { diff --git a/lib/pages/user/forget_password_method_page.dart b/lib/pages/user/forget_password_method_page.dart index 44c1060..10bc39b 100644 --- a/lib/pages/user/forget_password_method_page.dart +++ b/lib/pages/user/forget_password_method_page.dart @@ -53,7 +53,7 @@ class _ForgetPasswordMethodPageState extends State { otpType = 1; forgetPasswordOTPMethod(context); }, - title: 'With SMS', + title: LocaleKeys.SMS.tr(), icon: icons + "ic_sms.png", ), ), @@ -64,7 +64,7 @@ class _ForgetPasswordMethodPageState extends State { otpType = 1; forgetPasswordOTPMethod(context); }, - title: 'With Whatsapp', + title: LocaleKeys.whatsapp.tr(), icon: icons + "ic_whatsapp.png", ), ), diff --git a/lib/pages/user/forget_password_page.dart b/lib/pages/user/forget_password_page.dart index b9aae8d..1f80845 100644 --- a/lib/pages/user/forget_password_page.dart +++ b/lib/pages/user/forget_password_page.dart @@ -124,7 +124,7 @@ class _ForgetPasswordPageState extends State { padding: const EdgeInsets.all(2.0), child: DropdownField((DropValue value) { countryCode = value.subValue; - }, list: dropList, hint: "Chose Country"), + }, list: dropList, hint: LocaleKeys.selectCountryCode.tr()), ); } else { return Center( @@ -152,7 +152,7 @@ class _ForgetPasswordPageState extends State { Utils.hideLoading(context); PasswordOTPRequest otpRequest = PasswordOTPRequest.fromJson(jsonDecode(response.body)); if (otpRequest.messageStatus == 1) { - Utils.showToast("Code is sent to email"); + Utils.showToast(LocaleKeys.codeSentToEmail.tr()); showMDialog(context, child: OtpDialog( onClick: (String code) async { pop(context); diff --git a/lib/pages/user/login_method_selection_page.dart b/lib/pages/user/login_method_selection_page.dart index 15c98f6..71f02fc 100644 --- a/lib/pages/user/login_method_selection_page.dart +++ b/lib/pages/user/login_method_selection_page.dart @@ -49,7 +49,7 @@ class LoginMethodSelectionPage extends StatelessWidget { onClick: () { performBasicOtp(context); }, - title: 'Finger Print', + title: LocaleKeys.fingerPrint.tr(), icon: icons + "ic_fingerprint.png", ), ), @@ -59,7 +59,7 @@ class LoginMethodSelectionPage extends StatelessWidget { onClick: () { performBasicOtp(context); }, - title: 'Face Recognition ', + title: LocaleKeys.faceRecognition.tr(), icon: icons + "ic_face_id.png", ), ), @@ -73,7 +73,7 @@ class LoginMethodSelectionPage extends StatelessWidget { onClick: () { performBasicOtp(context); }, - title: 'With SMS', + title: LocaleKeys.SMS.tr(), icon: icons + "ic_sms.png", ), ), @@ -84,7 +84,7 @@ class LoginMethodSelectionPage extends StatelessWidget { // navigateWithName(context, AppRoutes.dashboard); performBasicOtp(context); }, - title: 'With Whatsapp', + title: LocaleKeys.whatsapp.tr(), icon: icons + "ic_whatsapp.png", ), ), @@ -110,8 +110,10 @@ class LoginMethodSelectionPage extends StatelessWidget { Response response2 = await UserApiClent().login_V2_OTPVerify(user.data!.userToken??"", code); Utils.hideLoading(context); RegisterUser verifiedUser = RegisterUser.fromJson(jsonDecode(response2.body)); - if (verifiedUser.messageStatus == 1) { + Utils.showLoading(context); + Response res = await UserApiClent().RefreshToken(verifiedUser.data.toString()??"", verifiedUser.data.toString()??""); + Utils.hideLoading(context); User user = User.fromJson(jsonDecode(response2.body)); if(user.data!.userInfo!.roleId==4){ diff --git a/lib/pages/user/login_verification_page.dart b/lib/pages/user/login_verification_page.dart index c60d3c1..5232b77 100644 --- a/lib/pages/user/login_verification_page.dart +++ b/lib/pages/user/login_verification_page.dart @@ -104,7 +104,7 @@ class _LoginVerificationPageState extends State { onClick: () { performBasicOtp(context, userToken); }, - title: 'Finger Print', + title: LocaleKeys.fingerPrint.tr(), icon: icons + "ic_fingerprint.png", ), ), @@ -114,7 +114,7 @@ class _LoginVerificationPageState extends State { onClick: () { performBasicOtp(context, userToken); }, - title: 'Face Recognition', + title: LocaleKeys.faceRecognition.tr(), icon: icons + "ic_face_id.png", ), ), @@ -128,7 +128,7 @@ class _LoginVerificationPageState extends State { onClick: () { performBasicOtp(context, userToken); }, - title: 'With SMS', + title: LocaleKeys.SMS.tr(), icon: icons + "ic_sms.png", ), ), @@ -138,7 +138,7 @@ class _LoginVerificationPageState extends State { onClick: () { performBasicOtp(context, userToken); }, - title: 'With Whatsapp', + title: LocaleKeys.whatsapp.tr(), icon: icons + "ic_whatsapp.png", ), ), diff --git a/lib/pages/user/login_verify_account_page.dart b/lib/pages/user/login_verify_account_page.dart index b750cf7..ec0275a 100644 --- a/lib/pages/user/login_verify_account_page.dart +++ b/lib/pages/user/login_verify_account_page.dart @@ -69,7 +69,7 @@ class LoginVerifyAccountPage extends StatelessWidget { // }, // )); }, - title: 'With SMS', + title: LocaleKeys.SMS.tr(), icon: icons + "ic_sms.png", ), ), @@ -98,7 +98,7 @@ class LoginVerifyAccountPage extends StatelessWidget { // }, // )); }, - title: 'With Whatsapp', + title: LocaleKeys.whatsapp.tr(), icon: icons + "ic_whatsapp.png", ), ), diff --git a/lib/pages/user/login_with_password_page.dart b/lib/pages/user/login_with_password_page.dart index b782639..6bfebcc 100644 --- a/lib/pages/user/login_with_password_page.dart +++ b/lib/pages/user/login_with_password_page.dart @@ -72,7 +72,7 @@ class _LoginWithPasswordState extends State { }, ), 50.height, - (type == ClassType.NUMBER ? "Enter Phone" : "Enter Email").toText24(), + (type == ClassType.NUMBER ? LocaleKeys.enterPhoneNumber.tr() : LocaleKeys.enterEmail.tr()).toText24(), mFlex(1), Column( children: [ @@ -80,7 +80,7 @@ class _LoginWithPasswordState extends State { getCountry(), 6.height, TxtField( - hint: type == ClassType.NUMBER ? "5********" : "Enter Email", + hint: type == ClassType.NUMBER ? "5********" : LocaleKeys.enterEmail.tr(), value: phoneNum, onChanged: (v) { phoneNum = v; @@ -132,7 +132,7 @@ class _LoginWithPasswordState extends State { padding: const EdgeInsets.all(2.0), child: DropdownField((DropValue value) { countryCode = value.subValue; - }, list: dropList, hint: "Chose Country"), + }, list: dropList, hint: LocaleKeys.selectCountryCode.tr()), ); } else { return Center( diff --git a/lib/pages/user/register_page.dart b/lib/pages/user/register_page.dart index f8f7b60..9062519 100644 --- a/lib/pages/user/register_page.dart +++ b/lib/pages/user/register_page.dart @@ -66,7 +66,7 @@ class RegisterPage extends StatelessWidget { return DropdownField((DropValue value) { countryCode = value.subValue; countryId = value.id; - }, list: dropList, hint: "Select Country"); + }, list: dropList, hint: LocaleKeys.selectCountryCode.tr()); } else { return CircularProgressIndicator(); } diff --git a/lib/pages/user/splash_page.dart b/lib/pages/user/splash_page.dart index d80b8a6..f688a92 100644 --- a/lib/pages/user/splash_page.dart +++ b/lib/pages/user/splash_page.dart @@ -1,11 +1,13 @@ import 'dart:async'; 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/extensions/widget_extensions.dart'; +import 'package:car_customer_app/widgets/show_fill_button.dart'; import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; @@ -28,6 +30,14 @@ class SplashPage extends StatelessWidget { LocaleKeys.alreadySigned.tr().toText(fontSize: 18, isBold: true).onPress(() { navigateWithName(context, AppRoutes.loginVerification); }), + 35.height, + TextButton( + style: TextButton.styleFrom( + backgroundColor: Colors.white, + ), + onPressed: () { }, + child: Text( LocaleKeys.english.tr(), ), + ), mFlex(5), ], ), diff --git a/lib/pages/user/vertify_password_page.dart b/lib/pages/user/vertify_password_page.dart index b5c33f4..e043115 100644 --- a/lib/pages/user/vertify_password_page.dart +++ b/lib/pages/user/vertify_password_page.dart @@ -76,7 +76,7 @@ class VerifyPasswordPage extends StatelessWidget { }, )); }, - title: 'With SMS', + title: LocaleKeys.SMS.tr(), icon: icons + "ic_sms.png", ), ), @@ -106,7 +106,7 @@ class VerifyPasswordPage extends StatelessWidget { }, )); }, - title: 'With Whatsapp', + title: LocaleKeys.whatsapp.tr(), icon: icons + "ic_whatsapp.png", ), ), diff --git a/lib/widgets/tab/login_email_tab.dart b/lib/widgets/tab/login_email_tab.dart index 7c29b63..2aec688 100644 --- a/lib/widgets/tab/login_email_tab.dart +++ b/lib/widgets/tab/login_email_tab.dart @@ -1,3 +1,5 @@ +import 'package:car_customer_app/generated/locale_keys.g.dart'; +import 'package:easy_localization/src/public_ext.dart'; import 'package:flutter/material.dart'; enum ClassType { EMAIL, NUMBER } @@ -32,7 +34,7 @@ class _LoginEmailTabState extends State { color: type == ClassType.NUMBER ? Colors.blue : Colors.transparent, child: Center( child: Text( - "Number", + LocaleKeys.number.tr(), style: TextStyle( color: type == ClassType.NUMBER ? Colors.white : Colors.black, fontWeight: FontWeight.bold, @@ -54,7 +56,7 @@ class _LoginEmailTabState extends State { color: type == ClassType.EMAIL ? Colors.blue : Colors.transparent, child: Center( child: Text( - "Email", + LocaleKeys.email.tr(), style: TextStyle( color: type == ClassType.EMAIL ? Colors.white : Colors.black, fontWeight: FontWeight.bold, diff --git a/pubspec.lock b/pubspec.lock index 4d82bf8..2b2de22 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -123,6 +123,13 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_password_strength: + dependency: "direct main" + description: + name: flutter_password_strength + url: "https://pub.dartlang.org" + source: hosted + version: "0.1.6" flutter_plugin_android_lifecycle: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index e7691d2..500fee2 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -36,6 +36,7 @@ dependencies: cupertino_icons: ^1.0.2 image_picker: ^0.8.4+4 easy_localization: ^3.0.0 + flutter_password_strength: ^0.1.6 dev_dependencies: flutter_test: diff --git a/resources/langs/ar-SA.json b/resources/langs/ar-SA.json index e7f646b..212d561 100644 --- a/resources/langs/ar-SA.json +++ b/resources/langs/ar-SA.json @@ -1,6 +1,6 @@ { "firstTimeLogIn": "تسجيل الدخول لأول مره", - "signUp": "تسجيل دخول", + "signUp": "التسجيل", "changeMobile": "تغيير رقم الجوال", "notifications": "الاشعارات", "general": "عام", @@ -10,6 +10,7 @@ "retrievePassword" : "استرجاع كلمة المرور", "changeEmail": "تغيير الايميل", "verify": "تحقق", + "verified": "تم التحقق", "signOut": "تسجيل خروج", "enterEmail": "ادخل الايميل", "enterNewEmail": "ادخل ايميل جديد", @@ -65,6 +66,16 @@ "imageDeleted" : "تم حذف الصوره", "dashboard" : "الصفحه الرئيسيه", "termsOfService":"من خلال إنشاء حساب فإنك توافق على شروط الخدمة و\n سياسة الخصوصية", + "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", diff --git a/resources/langs/en-US.json b/resources/langs/en-US.json index c2ec9ec..6fadabf 100644 --- a/resources/langs/en-US.json +++ b/resources/langs/en-US.json @@ -10,6 +10,7 @@ "retrievePassword" : "Retrieve Password", "changeEmail": "Change Email", "verify": "Verify", + "verified": "Verified", "signOut": "Sign Out", "enterEmail": "Enter Email", "enterNewEmail": "Enter New Email", @@ -65,6 +66,16 @@ "imageDeleted" : "Image is Deleted", "dashboard" : "Dashboard/Main Page", "termsOfService":"By creating an account you agree to our Terms of Service and\n Privacy Policy", + "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",