From 978702a33053d79d262903db356dc13f53321554 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Sun, 27 Feb 2022 15:18:53 +0300 Subject: [PATCH] forget password --- lib/api/user_api_client.dart | 26 +++++ lib/classes/consts.dart | 4 + lib/config/routes.dart | 4 + lib/models/user/confirm_password.dart | 32 ++++++ .../user/forget_password_otp_compare.dart | 50 +++++++++ .../user/forget_password_otp_request.dart | 52 +++++++++ lib/pages/user/confirm_new_password.dart | 71 ++++++++++++ lib/pages/user/forget_password_page.dart | 104 +++++++++++++++--- lib/pages/user/login_with_password_page.dart | 9 ++ lib/pages/user/register_selection_page.dart | 18 +-- 10 files changed, 344 insertions(+), 26 deletions(-) create mode 100644 lib/models/user/confirm_password.dart create mode 100644 lib/models/user/forget_password_otp_compare.dart create mode 100644 lib/models/user/forget_password_otp_request.dart create mode 100644 lib/pages/user/confirm_new_password.dart diff --git a/lib/api/user_api_client.dart b/lib/api/user_api_client.dart index 8164fca..7be0a58 100644 --- a/lib/api/user_api_client.dart +++ b/lib/api/user_api_client.dart @@ -56,4 +56,30 @@ class UserApiClent { var postParams = {"userToken": userToken, "userOTP": otp}; return await ApiClient().postJsonForResponse(ApiConsts.Login_V2_OTPVerify, postParams); } + + + Future ForgetPasswordOTPRequest(String userName, int otpType) async { + var postParams = { + "userName": userName, + "otpType": 1, + }; + return await ApiClient().postJsonForResponse(ApiConsts.ForgetPasswordOTPRequest, postParams); + } + + Future ForgetPasswordOTPCompare(String userToken, String otp) async { + var postParams = + {"userToken": userToken, + "userOTP": otp}; + return await ApiClient().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams); + + } + + Future ForgetPassword(String userToken, String newPassword) async { + var postParams = { + "userToken": userToken, + "newPassword": newPassword, + }; + return await ApiClient().postJsonForResponse(ApiConsts.ForgetPassword, postParams); + + } } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 046538a..5f6fdd4 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -11,6 +11,10 @@ class ApiConsts { 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 ForgetPasswordOTPRequest = baseUrlServices + "api/Account/ForgetPasswordOTPRequest"; + static String ForgetPasswordOTPCompare = baseUrlServices + "api/Account/ForgetPasswordOTPCompare"; + static String ForgetPassword = baseUrlServices + "api/Account/ForgetPassword"; } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index f5bc288..ab9223c 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -10,6 +10,7 @@ import 'package:car_customer_app/pages/user/register_page.dart'; import 'package:car_customer_app/pages/user/register_selection_page.dart'; import 'package:car_customer_app/pages/user/splash_page.dart'; import 'package:flutter/material.dart'; +import 'package:car_customer_app/pages/user/confirm_new_password.dart'; class AppRoutes { //User @@ -23,6 +24,8 @@ class AppRoutes { static final String loginMethodSelection = "/loginMethodSelection"; static final String completeProfile = "/completeProfile"; + static final String confirmNewPasswordPage = "/confirmNewPasswordPage"; + static final String dashboard = "/dashboard"; static final String initialRoute = splash; @@ -38,6 +41,7 @@ class AppRoutes { loginWithPassword: (context) => LoginWithPassword(), loginMethodSelection: (context) => LoginMethodSelectionPage(ModalRoute.of(context)!.settings.arguments as String), completeProfile: (context) => CompleteProfilePage(ModalRoute.of(context)!.settings.arguments as RegisterUser), + confirmNewPasswordPage: (context) => ConfirmNewPasswordPage(ModalRoute.of(context)!.settings.arguments as String), //Home page dashboard: (context) => DashboardPage(), diff --git a/lib/models/user/confirm_password.dart b/lib/models/user/confirm_password.dart new file mode 100644 index 0000000..ce87f4c --- /dev/null +++ b/lib/models/user/confirm_password.dart @@ -0,0 +1,32 @@ + + + +import 'dart:convert'; + +ConfirmPassword confirmPasswordFromJson(String str) => ConfirmPassword.fromJson(json.decode(str)); + +String confirmPasswordToJson(ConfirmPassword data) => json.encode(data.toJson()); + +class ConfirmPassword { + dynamic totalItemsCount; + int? messageStatus; + String? message; + + ConfirmPassword( + {this.totalItemsCount, this.messageStatus, this.message}); + + ConfirmPassword.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/forget_password_otp_compare.dart b/lib/models/user/forget_password_otp_compare.dart new file mode 100644 index 0000000..9376d00 --- /dev/null +++ b/lib/models/user/forget_password_otp_compare.dart @@ -0,0 +1,50 @@ + + +import 'dart:convert'; + +PasswordOTPCompare otpCompareFromJson(String str) => PasswordOTPCompare.fromJson(json.decode(str)); + +String otpCompareToJson(PasswordOTPCompare data) => json.encode(data.toJson()); + +class PasswordOTPCompare { + dynamic totalItemsCount; + Data? data; + int? messageStatus; + String? message; + + PasswordOTPCompare({this.totalItemsCount, this.data, this.messageStatus, this.message}); + + PasswordOTPCompare.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 new file mode 100644 index 0000000..e7954bb --- /dev/null +++ b/lib/models/user/forget_password_otp_request.dart @@ -0,0 +1,52 @@ + + + +import 'dart:convert'; + +PasswordOTPRequest otpRequestFromJson(String str) => PasswordOTPRequest.fromJson(json.decode(str)); + +String otpRequestToJson(PasswordOTPRequest data) => json.encode(data.toJson()); + +class PasswordOTPRequest { + dynamic totalItemsCount; + Data? data; + int? messageStatus; + String? message; + + PasswordOTPRequest( + {this.totalItemsCount, this.data, this.messageStatus, this.message}); + + PasswordOTPRequest.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/pages/user/confirm_new_password.dart b/lib/pages/user/confirm_new_password.dart new file mode 100644 index 0000000..851fa46 --- /dev/null +++ b/lib/pages/user/confirm_new_password.dart @@ -0,0 +1,71 @@ + + +import 'package:car_customer_app/api/user_api_client.dart'; +import 'package:car_customer_app/classes/utils.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/models/user/confirm_password.dart'; +import 'package:car_customer_app/utils/navigator.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:flutter/material.dart'; + +import 'dart:convert'; +import 'package:http/http.dart'; + +class ConfirmNewPasswordPage extends StatelessWidget { + String userToken; + + ConfirmNewPasswordPage(this.userToken, {Key? key}) : super(key: key); + + String newPassword = ""; + + // String userToken = ""; + + @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: [ + "New Password".toText24(), + 12.height, + TxtField( + hint: "Inter New Password", + value: newPassword, + onChanged: (v) { + newPassword = v; + }, + ), + 40.height, + ShowFillButton( + title: "Confirm", + width: double.infinity, + onPressed: () { + confirmPasswordOTP(context); + }, + ), + ], + ), + ), + ); + } + + Future confirmPasswordOTP(BuildContext context) async { + Utils.showLoading(context); + Response res = await UserApiClent().ForgetPassword(userToken, newPassword); + Utils.hideLoading(context); + ConfirmPassword data = ConfirmPassword.fromJson(jsonDecode(res.body)); + if (data.messageStatus == 1) { + navigateWithName(context, AppRoutes.loginWithPassword); + } else { + Utils.showToast(data.message ?? ""); + } + } +} diff --git a/lib/pages/user/forget_password_page.dart b/lib/pages/user/forget_password_page.dart index 3d0e045..5469b91 100644 --- a/lib/pages/user/forget_password_page.dart +++ b/lib/pages/user/forget_password_page.dart @@ -1,15 +1,28 @@ +import 'dart:convert'; + +import 'package:car_customer_app/api/user_api_client.dart'; +import 'package:car_customer_app/classes/utils.dart'; +import 'package:car_customer_app/config/constants.dart'; +import 'package:car_customer_app/config/routes.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/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/show_fill_button.dart'; +import 'package:car_customer_app/widgets/dialog/otp_dialog.dart'; import 'package:car_customer_app/extensions/string_extensions.dart'; import 'package:car_customer_app/extensions/int_extensions.dart'; -import 'package:car_customer_app/extensions/widget_extensions.dart'; import 'package:car_customer_app/widgets/txt_field.dart'; import 'package:flutter/material.dart'; +import 'package:http/http.dart'; + class ForgetPasswordPage extends StatelessWidget { + int otpType = 1; + String userName = ""; + @override Widget build(BuildContext context) { return Scaffold( @@ -24,26 +37,83 @@ class ForgetPasswordPage extends StatelessWidget { 12.height, TxtField( hint: "Phone Number", + value: userName, + onChanged: (v) { + userName = v; + }, ), - TxtField( - hint: "Email", - ), - 40.height, - ShowFillButton( - title: "Continue", - width: double.infinity, - onPressed: () { - showMDialog( - context, - child: MessageDialog( - title: "New Password sent used", + // TxtField( + // hint: "Email", + // ), + mFlex(2), + Row( + children: [ + Expanded( + child: ShowImageButton( + onClick: () { + otpType = 1; + forgetPasswordOTP(context); + }, + title: 'With SMS', + icon: icons + "ic_sms.png", ), - ); - }, + ), + 20.width, + Expanded( + child: ShowImageButton( + onClick: () { + otpType = 1; + forgetPasswordOTP(context); + }, + title: 'With Whatsapp', + icon: icons + "ic_whatsapp.png", + ), + ), + ], ), + mFlex(10), + // 40.height, + // ShowFillButton( + // title: "Continue", + // width: double.infinity, + // onPressed: () { + // showMDialog( + // context, + // child: MessageDialog( + // title: "New Password sent used", + // ), + // ); + // }, + // ), ], ), ), ); } + + Future forgetPasswordOTP(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; + 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 4dff569..e5c9567 100644 --- a/lib/pages/user/login_with_password_page.dart +++ b/lib/pages/user/login_with_password_page.dart @@ -56,6 +56,15 @@ class LoginWithPassword extends StatelessWidget { password = v; }, ), + 10.height, + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + "Forget Password".toText12(color: Colors.blue).onPress(() { + navigateWithName(context, AppRoutes.forgetPassword); + }), + ], + ), 50.height, ShowFillButton( title: "Continue", diff --git a/lib/pages/user/register_selection_page.dart b/lib/pages/user/register_selection_page.dart index 0b9e71d..189402b 100644 --- a/lib/pages/user/register_selection_page.dart +++ b/lib/pages/user/register_selection_page.dart @@ -21,21 +21,21 @@ class RegisterSelectionPage extends StatelessWidget { children: [ "Welcome Message".toText24(), mFlex(1), - ShowFillButton( - title: "Log In With Password", - width: double.infinity, - onPressed: () { - navigateWithName(context, AppRoutes.loginWithPassword); - }, - ), - 20.height, ShowFillButton( title: "Log In", width: double.infinity, onPressed: () { - navigateWithName(context, AppRoutes.loginVerifyAccount); + navigateWithName(context, AppRoutes.loginWithPassword); }, ), + // 20.height, + // ShowFillButton( + // title: "Log In", + // width: double.infinity, + // onPressed: () { + // navigateWithName(context, AppRoutes.loginVerifyAccount); + // }, + // ), 20.height, ShowFillButton( title: "Sign Up",