From 3467d005b11bbcdc7c7c91079cab894c92e65674 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Sun, 27 Mar 2022 11:55:38 +0300 Subject: [PATCH] fixed issues --- lib/api/client/user_api_client.dart | 45 +++- lib/classes/consts.dart | 4 + lib/config/routes.dart | 9 + lib/models/user/change_email.dart | 51 +++++ lib/models/user/change_mobile.dart | 51 +++++ lib/models/user/confirm_email.dart | 51 +++++ lib/models/user/confirm_mobile.dart | 53 +++++ lib/pages/dashboard/dashboard_page.dart | 10 + lib/pages/user/change_email_page.dart | 116 +++++++++++ lib/pages/user/change_mobile_page.dart | 119 +++++++++++ lib/pages/user/change_password_page.dart | 4 +- .../user/forget_password_method_page.dart | 95 +++++++++ lib/pages/user/forget_password_page.dart | 197 +++++++++--------- lib/pages/user/login_with_password_page.dart | 77 +++++-- 14 files changed, 763 insertions(+), 119 deletions(-) create mode 100644 lib/models/user/change_email.dart create mode 100644 lib/models/user/change_mobile.dart create mode 100644 lib/models/user/confirm_email.dart create mode 100644 lib/models/user/confirm_mobile.dart create mode 100644 lib/pages/user/change_email_page.dart create mode 100644 lib/pages/user/change_mobile_page.dart create mode 100644 lib/pages/user/forget_password_method_page.dart diff --git a/lib/api/client/user_api_client.dart b/lib/api/client/user_api_client.dart index 2b1cd4e..6cceb1e 100644 --- a/lib/api/client/user_api_client.dart +++ b/lib/api/client/user_api_client.dart @@ -1,5 +1,9 @@ import 'dart:async'; +import 'package:car_provider_app/models/user/change_email.dart'; +import 'package:car_provider_app/models/user/change_mobile.dart'; import 'package:car_provider_app/models/user/cities.dart'; +import 'package:car_provider_app/models/user/confirm_email.dart'; +import 'package:car_provider_app/models/user/confirm_mobile.dart'; import 'package:car_provider_app/models/user/country.dart'; import 'package:car_provider_app/models/user/role.dart'; import 'package:car_provider_app/models/user/confirm_password.dart'; @@ -92,10 +96,10 @@ class UserApiClent { //return await ApiClient().postJsonForObject((json) => PasswordOTPRequest.fromJson(json), ApiConsts.ForgetPasswordOTPRequest, postParams); } - Future ForgetPasswordOTPCompare(String userToken, String otp) async { + Future ForgetPasswordOTPCompare(String userToken, String userOTP) async { var postParams = {"userToken": userToken, - "userOTP": otp}; + "userOTP": userOTP}; return await ApiClient().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams); // return await ApiClient().postJsonForObject((json) => PasswordOTPCompare.fromJson(json), ApiConsts.ForgetPasswordOTPCompare, postParams); } @@ -122,4 +126,41 @@ class UserApiClent { } + + Future ChangeMobileNoOTPRequest(countryID, String mobileNo, String password,) async { + var postParams = + { "countryID":1, + "mobileNo": mobileNo, + "password": password}; + String t = AppState().getUser.data!.accessToken ?? ""; + return await ApiClient().postJsonForObject((json) => ChangeMobile.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 ApiClient().postJsonForObject((json) => ConfirmMobile.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 ApiClient().postJsonForObject((json) => ChanEmail.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 ApiClient().postJsonForObject((json) => ConfirmEmail.fromJson(json), ApiConsts.ChangeEmail, postParams, token: t); + } + } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 97dec35..25641ac 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -21,6 +21,10 @@ class ApiConsts { 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"; //Profile static String GetProviderDocument = baseUrlServices + "api/ServiceProviders/ServiceProviderDocument_Get"; static String ServiceProviderDocument_Update = baseUrlServices + "api/ServiceProviders/ServiceProviderDocument_Update"; diff --git a/lib/config/routes.dart b/lib/config/routes.dart index b4fe535..9867598 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -4,9 +4,12 @@ import 'package:car_provider_app/pages/settings/create_services_page.dart'; import 'package:car_provider_app/pages/settings/dealership_page.dart'; import 'package:car_provider_app/pages/settings/define_branch_page.dart'; import 'package:car_provider_app/pages/settings/define_license_page.dart'; +import 'package:car_provider_app/pages/user/change_email_page.dart'; +import 'package:car_provider_app/pages/user/change_mobile_page.dart'; import 'package:car_provider_app/pages/user/change_password_page.dart'; import 'package:car_provider_app/pages/user/complete_profile_page.dart'; import 'package:car_provider_app/pages/user/confirm_new_password_page.dart'; +import 'package:car_provider_app/pages/user/forget_password_method_page.dart'; import 'package:car_provider_app/pages/user/forget_password_page.dart'; import 'package:car_provider_app/pages/user/login_method_selection_page.dart'; import 'package:car_provider_app/pages/user/login_verification_page.dart'; @@ -39,6 +42,9 @@ class AppRoutes { static final String confirmNewPasswordPage = "/confirmNewPasswordPage"; static final String defineLicense = "/defineLicese"; static final String changePassword = "/changePassword"; + static final String forgetPasswordMethodPage = "/forgetPasswordMethodPage"; + static final String changeMobilePage = "/changeMobilePage"; + static final String changeEmailPage = "/changeEmailPage"; static final String dashboard = "/dashboard"; @@ -67,6 +73,9 @@ class AppRoutes { vertifyPassword: (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) => ChangeEmailPage(), //Home page dashboard: (context) => DashboardPage(), diff --git a/lib/models/user/change_email.dart b/lib/models/user/change_email.dart new file mode 100644 index 0000000..f7f6af5 --- /dev/null +++ b/lib/models/user/change_email.dart @@ -0,0 +1,51 @@ + + +import 'dart:convert'; + +ChanEmail changeEmailFromJson(String str) => ChanEmail.fromJson(json.decode(str)); + +String changeEmailToJson(ChanEmail data) => json.encode(data.toJson()); + +class ChanEmail { + int? messageStatus; + Null? totalItemsCount; + Data? data; + String? message; + + ChanEmail( + {this.messageStatus, this.totalItemsCount, this.data, this.message}); + + ChanEmail.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 new file mode 100644 index 0000000..fed5923 --- /dev/null +++ b/lib/models/user/change_mobile.dart @@ -0,0 +1,51 @@ + + +import 'dart:convert'; + +ChangeMobile changeMobileFromJson(String str) => ChangeMobile.fromJson(json.decode(str)); + +String changeMobileToJson(ChangeMobile data) => json.encode(data.toJson()); + +class ChangeMobile { + int? messageStatus; + Null? totalItemsCount; + Data? data; + String? message; + + ChangeMobile( + {this.messageStatus, this.totalItemsCount, this.data, this.message}); + + ChangeMobile.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/confirm_email.dart b/lib/models/user/confirm_email.dart new file mode 100644 index 0000000..e64dc25 --- /dev/null +++ b/lib/models/user/confirm_email.dart @@ -0,0 +1,51 @@ + + +import 'dart:convert'; + +ConfirmEmail confirmEmailFromJson(String str) => ConfirmEmail.fromJson(json.decode(str)); + +String confirmEmailToJson(ConfirmEmail data) => json.encode(data.toJson()); + +class ConfirmEmail { + int? messageStatus; + Null? totalItemsCount; + Data? data; + String? message; + + ConfirmEmail( + {this.messageStatus, this.totalItemsCount, this.data, this.message}); + + ConfirmEmail.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 new file mode 100644 index 0000000..5ea817b --- /dev/null +++ b/lib/models/user/confirm_mobile.dart @@ -0,0 +1,53 @@ + + + +import 'dart:convert'; + +ConfirmMobile confirmMobileFromJson(String str) => ConfirmMobile.fromJson(json.decode(str)); + +String confirmMobileToJson(ConfirmMobile data) => json.encode(data.toJson()); + + +class ConfirmMobile { + int? messageStatus; + Null? totalItemsCount; + Data? data; + String? message; + + ConfirmMobile( + {this.messageStatus, this.totalItemsCount, this.data, this.message}); + + ConfirmMobile.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/pages/dashboard/dashboard_page.dart b/lib/pages/dashboard/dashboard_page.dart index 5edb58b..4e0fcde 100644 --- a/lib/pages/dashboard/dashboard_page.dart +++ b/lib/pages/dashboard/dashboard_page.dart @@ -167,6 +167,16 @@ class _DashboardPageState extends State { 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); + }, ), ListTile( leading: SvgPicture.asset("assets/images/ic_logout.svg"), diff --git a/lib/pages/user/change_email_page.dart b/lib/pages/user/change_email_page.dart new file mode 100644 index 0000000..a505967 --- /dev/null +++ b/lib/pages/user/change_email_page.dart @@ -0,0 +1,116 @@ + +import 'package:car_provider_app/api/client/user_api_client.dart'; +import 'package:car_provider_app/classes/utils.dart'; +import 'package:car_provider_app/config/routes.dart'; +import 'package:car_provider_app/extensions/int_extensions.dart'; +import 'package:car_provider_app/extensions/string_extensions.dart'; +import 'package:car_provider_app/models/user/change_email.dart'; +import 'package:car_provider_app/models/user/confirm_email.dart'; +import 'package:car_provider_app/utils/navigator.dart'; +import 'package:car_provider_app/widgets/app_bar.dart'; +import 'package:car_provider_app/widgets/dialog/dialogs.dart'; +import 'package:car_provider_app/widgets/dialog/message_dialog.dart'; +import 'package:car_provider_app/widgets/dialog/otp_dialog.dart'; +import 'package:car_provider_app/widgets/show_fill_button.dart'; +import 'package:flutter/material.dart'; + +import 'dart:convert'; +import 'package:http/http.dart'; + +class ChangeEmailPage extends StatefulWidget { + + @override + State createState() => _ChangeEmailPageState(); +} + +class _ChangeEmailPageState extends State { + String password = ""; + String email = ''; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: appBar(title: "Change Email"), + body: SingleChildScrollView( + child: Container( + // width: double.infinity, + // height: double.infinity, + padding: EdgeInsets.all(40), + child: Column( + children: [ + "Enter Email".toText24(), + 12.height, + TextFormField( + decoration: InputDecoration( + hintText: "Enter New Email", + hintStyle: TextStyle(color: Colors.grey), + border: OutlineInputBorder( + borderRadius: const BorderRadius.all( + const Radius.circular(5.0), + ), + ), + ), + obscureText: false, + onChanged: (v) => email = v, + ), + 12.height, + TextFormField( + decoration: InputDecoration( + hintText: "Enter Current Password", + hintStyle: TextStyle(color: Colors.grey), + border: OutlineInputBorder( + borderRadius: const BorderRadius.all( + const Radius.circular(5.0), + ), + ), + ), + obscureText: true, + onChanged: (v) => password = v, + ), + 40.height, + ShowFillButton( + title: "Confirm", + width: double.infinity, + onPressed: () { + changeEmail(context); + }, + ), + ], + ), + ), + ), + ); + } + + Future changeEmail(BuildContext context) async { + Utils.showLoading(context); + ChanEmail otpRequest = await UserApiClent().ChangeEmailOTPRequest(email, password); + Utils.hideLoading(context); + if (otpRequest.messageStatus == 1) { + showMDialog(context, child: OtpDialog( + onClick: (String code) async { + pop(context); + Utils.showLoading(context); + ConfirmEmail otpCompare = await UserApiClent().ChangeEmail(otpRequest.data!.userToken ?? "", code); + Utils.hideLoading(context); + if (otpCompare.messageStatus == 1) { + showMDialog( + context, + child: MessageDialog( + title: "Email Verified", + onClick: () { + Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.loginWithPassword, (Route route) => false); + }, + ), + ); + } else { + Utils.showToast(otpCompare.message ?? ""); + } + }, + )); + } else { + Utils.showToast(otpRequest.message ?? ""); + } + } + +} diff --git a/lib/pages/user/change_mobile_page.dart b/lib/pages/user/change_mobile_page.dart new file mode 100644 index 0000000..28fdb03 --- /dev/null +++ b/lib/pages/user/change_mobile_page.dart @@ -0,0 +1,119 @@ + +import 'package:car_provider_app/api/client/user_api_client.dart'; +import 'package:car_provider_app/classes/utils.dart'; +import 'package:car_provider_app/config/routes.dart'; +import 'package:car_provider_app/extensions/int_extensions.dart'; +import 'package:car_provider_app/extensions/string_extensions.dart'; +import 'package:car_provider_app/models/user/change_mobile.dart'; +import 'package:car_provider_app/models/user/confirm_mobile.dart'; +import 'package:car_provider_app/utils/navigator.dart'; +import 'package:car_provider_app/widgets/app_bar.dart'; +import 'package:car_provider_app/widgets/dialog/dialogs.dart'; +import 'package:car_provider_app/widgets/dialog/message_dialog.dart'; +import 'package:car_provider_app/widgets/dialog/otp_dialog.dart'; +import 'package:car_provider_app/widgets/show_fill_button.dart'; +import 'package:flutter/material.dart'; + +import 'dart:convert'; +import 'package:http/http.dart'; + +class ChangeMobilePage extends StatefulWidget { + + @override + State createState() => _ChangeMobilePageState(); +} + +class _ChangeMobilePageState extends State { + int countryID=1 ; + String mobileNo = ''; + String password = ''; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: appBar(title: "Change Mobile Number"), + body: SingleChildScrollView( + child: Container( + // width: double.infinity, + // height: double.infinity, + padding: EdgeInsets.all(40), + child: Column( + children: [ + "Enter New Phone Number".toText24(), + 12.height, + TextFormField( + decoration: InputDecoration( + hintText: "Enter New Phone Number", + hintStyle: TextStyle(color: Colors.grey), + border: OutlineInputBorder( + borderRadius: const BorderRadius.all( + const Radius.circular(5.0), + ), + ), + ), + obscureText: false, + onChanged: (v) => mobileNo = v, + ), + 12.height, + TextFormField( + decoration: InputDecoration( + hintText: "Enter Current Password", + hintStyle: TextStyle(color: Colors.grey), + border: OutlineInputBorder( + borderRadius: const BorderRadius.all( + const Radius.circular(5.0), + ), + ), + ), + obscureText: true, + onChanged: (v) => password = v, + ), + 40.height, + ShowFillButton( + title: "Confirm", + width: double.infinity, + onPressed: () { + changeMobile(context); + }, + ), + ], + ), + ), + ), + ); + } + + Future changeMobile(BuildContext context) async { + Utils.showLoading(context); + ChangeMobile otpRequest = await UserApiClent().ChangeMobileNoOTPRequest(countryID, mobileNo, password); + Utils.hideLoading(context); + if (otpRequest.messageStatus == 1) { + showMDialog(context, child: OtpDialog( + onClick: (String code) async { + pop(context); + Utils.showLoading(context); + ConfirmMobile otpCompare = await UserApiClent().ChangeMobileNo(otpRequest.data!.userToken ?? "", code); + Utils.hideLoading(context); + if (otpCompare.messageStatus == 1) { + showMDialog( + context, + child: MessageDialog( + title: "Phone Number Verified", + onClick: () { + Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.loginWithPassword, (Route route) => false); + }, + ), + ); + } else { + Utils.showToast(otpCompare.message ?? ""); + } + }, + )); + } else { + Utils.showToast(otpRequest.message ?? ""); + } + } + + + +} diff --git a/lib/pages/user/change_password_page.dart b/lib/pages/user/change_password_page.dart index 86f1cd3..1f67227 100644 --- a/lib/pages/user/change_password_page.dart +++ b/lib/pages/user/change_password_page.dart @@ -42,7 +42,7 @@ class _ChangePasswordPageState extends State { padding: EdgeInsets.all(40), child: Column( children: [ - "Inter New Phone Number".toText24(), + "Enter New Password".toText24(), 12.height, TextFormField( decoration: InputDecoration( @@ -60,7 +60,7 @@ class _ChangePasswordPageState extends State { 12.height, TextFormField( decoration: InputDecoration( - hintText: "Inter New Password", + hintText: "Enter New Password", hintStyle: TextStyle(color: Colors.grey), border: OutlineInputBorder( borderRadius: const BorderRadius.all( diff --git a/lib/pages/user/forget_password_method_page.dart b/lib/pages/user/forget_password_method_page.dart new file mode 100644 index 0000000..e9be135 --- /dev/null +++ b/lib/pages/user/forget_password_method_page.dart @@ -0,0 +1,95 @@ + + + +import 'dart:convert'; +import 'package:car_provider_app/api/client/user_api_client.dart'; +import 'package:car_provider_app/classes/utils.dart'; +import 'package:car_provider_app/config/constants.dart'; +import 'package:car_provider_app/config/routes.dart'; +import 'package:car_provider_app/extensions/int_extensions.dart'; +import 'package:car_provider_app/extensions/string_extensions.dart'; +import 'package:car_provider_app/models/user/forget_password_otp_compare.dart'; +import 'package:car_provider_app/utils/navigator.dart'; +import 'package:car_provider_app/utils/utils.dart'; +import 'package:car_provider_app/widgets/app_bar.dart'; +import 'package:car_provider_app/widgets/button/show_image_button.dart'; +import 'package:car_provider_app/widgets/dialog/dialogs.dart'; +import 'package:car_provider_app/widgets/dialog/otp_dialog.dart'; +import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + +class ForgetPasswordMethodPage extends StatefulWidget { + String userToken; + + ForgetPasswordMethodPage(this.userToken); + + @override + State createState() => _ForgetPasswordMethodPageState(); +} + +class _ForgetPasswordMethodPageState extends State { + int otpType = 1; + String userOTP = ""; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: appBar(title: "Forget Password"), + body: Container( + width: double.infinity, + height: double.infinity, + padding: EdgeInsets.all(40), + child: Column( + children: [ + "Select Method".toText24(), + 12.height, + Row( + children: [ + Expanded( + child: ShowImageButton( + onClick: () { + otpType = 1; + forgetPasswordOTPMethod(context); + }, + title: 'With SMS', + icon: icons + "ic_sms.png", + ), + ), + 20.width, + Expanded( + child: ShowImageButton( + onClick: () { + otpType = 1; + forgetPasswordOTPMethod(context); + }, + title: 'With Whatsapp', + icon: icons + "ic_whatsapp.png", + ), + ), + ], + ), + mFlex(10), + ], + ), + ), + ); + } + + Future forgetPasswordOTPMethod(BuildContext context) async { + showMDialog(context, child: OtpDialog( + onClick: (String code) async { + pop(context); + Utils.showLoading(context); + Response res = await UserApiClent().ForgetPasswordOTPCompare(widget.userToken?? "", code); + Utils.hideLoading(context); + PasswordOTPCompare otpCompare = PasswordOTPCompare.fromJson(jsonDecode(res.body)); + if (otpCompare.messageStatus == 1) { + var userToken = otpCompare.data!.userToken; + navigateWithName(context, AppRoutes.confirmNewPasswordPage, arguments: userToken); + } else { + Utils.showToast(otpCompare.message ?? ""); + } + }, + )); + } +} diff --git a/lib/pages/user/forget_password_page.dart b/lib/pages/user/forget_password_page.dart index 5a2469a..129e582 100644 --- a/lib/pages/user/forget_password_page.dart +++ b/lib/pages/user/forget_password_page.dart @@ -25,9 +25,18 @@ import 'package:car_provider_app/models/user/user.dart'; import 'dart:convert'; import 'package:http/http.dart'; -class ForgetPasswordPage extends StatelessWidget { +class ForgetPasswordPage extends StatefulWidget { + @override + State createState() => _ForgetPasswordPageState(); +} + +class _ForgetPasswordPageState extends State { int otpType = 1; + String userName = ""; + bool _email = true; + bool _mobile = true; + @override Widget build(BuildContext context) { @@ -41,74 +50,63 @@ class ForgetPasswordPage extends StatelessWidget { children: [ "Verify New Password".toText24(), mFlex(1), - TxtField( - hint: "Phone Number", + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + RaisedButton( + onPressed: () { + setState(() { + _mobile = true; + _email = false; + }); + },child: + Text("Mobile Number", + style: TextStyle(fontSize: 14, + fontWeight: FontWeight.w600,), + ),color: _mobile ? Colors.blue : Colors.transparent,textColor: _mobile ? Colors.white : Colors.blue, + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 12),), + + RaisedButton(onPressed: () { + setState(() { + _mobile = false; + _email = true; + }); + },child: + Text("Email Address", + style: TextStyle(fontSize: 14, + fontWeight: FontWeight.w600,),),color: _email? Colors.blue : Colors.transparent + ,textColor: _email ? Colors.white : Colors.blue, + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 12),), + ], + ), + 50.height, + "Retrieve Password".toText24(), + 12.height, + _mobile ? TxtField( + hint: "Phone Number" , value: userName, onChanged: (v) { userName = v; }, - ), - mFlex(2), - Row( - children: [ - Expanded( - child: ShowImageButton( - onClick: () { - otpType = 1; - forgetPasswordOTP(context); - // 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); - // }, - // ), - // ), - // ); - // }, - // )); - }, - title: 'With SMS', - icon: icons + "ic_sms.png", - ), - ), - 20.width, - Expanded( - child: ShowImageButton( - onClick: () { - otpType = 1; - forgetPasswordOTP(context); - // showMDialog(context, child: OtpDialog( - // onClick: (String code) { - // pop(context); - // delay(300).then( - // (value) => showMDialog( - // context, - // child: MessageDialog( - // title: "Phone Number Verified", - // onClick: () { - // otpType=2; - // navigateWithName(context, AppRoutes.confirmNewPasswordPage); - // // ForgetPasswordOTP(context); - // }, - // ), - // ), - // ); - // }, - // )); - }, - title: 'With Whatsapp', - icon: icons + "ic_whatsapp.png", - ), - ), - ], + ): + _email ? TxtField( + hint: "Email Address", + value: userName, + onChanged: (v) { + userName = v; + }, + ): Container(), + 50.height, + ShowFillButton( + title: "Continue", + width: double.infinity, + onPressed: () { + if(userName.isNum()) { + forgetPasswordPhoneOTP(context); + }else{ + forgetPasswordEmailOTP(context); + } + }, ), mFlex(10), ], @@ -117,50 +115,45 @@ class ForgetPasswordPage extends StatelessWidget { ); } - Future forgetPasswordOTP(BuildContext context) async { + Future forgetPasswordPhoneOTP(BuildContext context) async { Utils.showLoading(context); Response response = await UserApiClent().ForgetPasswordOTPRequest(userName, otpType); Utils.hideLoading(context); PasswordOTPRequest otpRequest = PasswordOTPRequest.fromJson(jsonDecode(response.body)); if (otpRequest.messageStatus == 1) { - showMDialog(context, child: OtpDialog( - onClick: (String code) async { - pop(context); - Utils.showLoading(context); - Response res = await UserApiClent().ForgetPasswordOTPCompare(otpRequest.data!.userToken ?? "", code); - Utils.hideLoading(context); - PasswordOTPCompare otpCompare = PasswordOTPCompare.fromJson(jsonDecode(res.body)); - if (otpCompare.messageStatus == 1) { - var userToken = otpCompare.data!.userToken; - print("token is ________"); - print(userToken); - navigateWithName(context, AppRoutes.confirmNewPasswordPage, arguments: userToken); - } else { - Utils.showToast(otpCompare.message ?? ""); - } - }, - )); - // 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); - // }, - // ), - // ), - // ); - // }, - // )); - // navigateWithName(context, AppRoutes.vertifyPassword); + var userToken = otpRequest.data!.userToken; + navigateReplaceWithName(context, AppRoutes.forgetPasswordMethodPage, arguments: userToken); } else { Utils.showToast(otpRequest.message ?? ""); } } + + Future forgetPasswordEmailOTP(BuildContext context) async { + Utils.showLoading(context); + Response response = await UserApiClent().ForgetPasswordOTPRequest(userName, otpType); + Utils.hideLoading(context); + PasswordOTPRequest otpRequest = PasswordOTPRequest.fromJson(jsonDecode(response.body)); + if (otpRequest.messageStatus == 1) { + Utils.showToast("Code is sent to email"); + showMDialog(context, child: OtpDialog( + onClick: (String code) async { + pop(context); + Utils.showLoading(context); + Response res = await UserApiClent().ForgetPasswordOTPCompare(otpRequest.data!.userToken ?? "", code); + Utils.hideLoading(context); + PasswordOTPCompare otpCompare = PasswordOTPCompare.fromJson(jsonDecode(res.body)); + if (otpCompare.messageStatus == 1) { + var userToken = otpCompare.data!.userToken; + print("token is ________"); + print(userToken); + navigateWithName(context, AppRoutes.confirmNewPasswordPage, arguments: userToken); + } else { + Utils.showToast(otpCompare.message ?? ""); + } + }, + )); + } else { + Utils.showToast(otpRequest.message ?? ""); + } +} } diff --git a/lib/pages/user/login_with_password_page.dart b/lib/pages/user/login_with_password_page.dart index 182de48..da7f423 100644 --- a/lib/pages/user/login_with_password_page.dart +++ b/lib/pages/user/login_with_password_page.dart @@ -23,9 +23,18 @@ import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart'; -class LoginWithPassword extends StatelessWidget { +class LoginWithPassword extends StatefulWidget { + @override + State createState() => _LoginWithPasswordState(); +} + +class _LoginWithPasswordState extends State { int otpType = 1; + bool _email = true; + bool _mobile = true; + String phoneNum = "", password = ""; + String email = ""; @override @@ -38,25 +47,69 @@ class LoginWithPassword extends StatelessWidget { padding: EdgeInsets.all(40), child: Column( children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + RaisedButton( + onPressed: () { + setState(() { + _mobile = true; + _email = false; + }); + },child: + Text("Mobile Number", + style: TextStyle(fontSize: 14, + fontWeight: FontWeight.w600,), + ),color: _mobile ? Colors.blue : Colors.transparent,textColor: _mobile ? Colors.white : Colors.blue, + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 12),), + + RaisedButton(onPressed: () { + setState(() { + _mobile = false; + _email = true; + }); + },child: + Text("Email Address", + style: TextStyle(fontSize: 14, + fontWeight: FontWeight.w600,),),color: _email? Colors.blue : Colors.transparent + ,textColor: _email ? Colors.white : Colors.blue, + padding: EdgeInsets.symmetric(horizontal: 18, vertical: 12),), + ], + ), + 50.height, "Enter Mobile or Email".toText24(), mFlex(1), + _mobile ? Column( + children: [ + TxtField( + hint: "Enter phone number", + value: phoneNum, + onChanged: (v) { + phoneNum = v; + }, + ), + 12.height, + TxtField( + hint: "Enter Password", + value: password, + isPasswordEnabled: true, + maxLines: 1, + onChanged: (v) { + password = v; + }, + ), + ], + ): _email ? TxtField( - hint: "Enter phone number or email", - value: phoneNum, - onChanged: (v) { - phoneNum = v; - }, - ), - 12.height, - TxtField( - hint: "Enter Password", + hint: "Enter Email", value: password, isPasswordEnabled: true, maxLines: 1, onChanged: (v) { password = v; }, - ), + ) + :Container(), 10.height, Row( mainAxisAlignment: MainAxisAlignment.end, @@ -98,6 +151,4 @@ class LoginWithPassword extends StatelessWidget { Future performBasicOtpEmail(BuildContext context) async { } - - }