From 39b6f06ca829285a1043e7a90fb81235a2d7653d Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Sun, 20 Feb 2022 10:53:04 +0300 Subject: [PATCH] 1.1 --- lib/api/user_api_client.dart | 30 ++++ lib/classes/consts.dart | 12 ++ lib/config/routes.dart | 6 + lib/models/user/confirm_password.dart | 30 ++++ .../user/forget_password_otp_compare.dart | 50 ++++++ .../user/forget_password_otp_request.dart | 50 ++++++ lib/pages/user/confirm_new_password_page.dart | 76 ++++++++ lib/pages/user/forget_password_page.dart | 155 +++++++++++++++-- lib/pages/user/login_with_password_page.dart | 9 + lib/pages/user/register_selection_page.dart | 19 +- lib/pages/user/vertify_password_page.dart | 162 ++++++++++++++++++ 11 files changed, 573 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_page.dart create mode 100644 lib/pages/user/vertify_password_page.dart diff --git a/lib/api/user_api_client.dart b/lib/api/user_api_client.dart index 95935e7..67c0440 100644 --- a/lib/api/user_api_client.dart +++ b/lib/api/user_api_client.dart @@ -1,4 +1,7 @@ import 'dart:async'; +import 'package:car_provider_app/models/user/confirm_password.dart'; +import 'package:car_provider_app/models/user/forget_password_otp_compare.dart'; +import 'package:car_provider_app/models/user/forget_password_otp_request.dart'; import 'package:http/http.dart'; import 'package:car_provider_app/classes/consts.dart'; import 'package:car_provider_app/models/content_info_model.dart'; @@ -56,4 +59,31 @@ 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); + //return await ApiClient().postJsonForObject((json) => PasswordOTPRequest.fromJson(json), ApiConsts.ForgetPasswordOTPRequest, postParams); + } + + Future ForgetPasswordOTPCompare(String userToken, String otp) async { + var postParams = + {"userToken": userToken, + "userOTP": otp}; + return await ApiClient().postJsonForResponse(ApiConsts.ForgetPasswordOTPCompare, postParams); + // return await ApiClient().postJsonForObject((json) => PasswordOTPCompare.fromJson(json), ApiConsts.ForgetPasswordOTPCompare, postParams); + } + + Future ForgetPassword(String userToken, String newPassword) async { + var postParams = { + "userToken": userToken, + "newPassword": newPassword, + }; + return await ApiClient().postJsonForResponse(ApiConsts.ForgetPassword, postParams); + //return await ApiClient().postJsonForObject((json) => ConfirmPassword.fromJson(json), ApiConsts.ForgetPassword, postParams); + } + } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 0615648..600d74a 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -11,6 +11,18 @@ 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 16f7736..51fe26d 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -13,6 +13,8 @@ import 'package:car_provider_app/pages/user/register_page.dart'; import 'package:car_provider_app/pages/user/register_selection_page.dart'; import 'package:car_provider_app/pages/user/splash_page.dart'; import 'package:flutter/material.dart'; +import 'package:car_provider_app/pages/user/vertify_password_page.dart'; +import 'package:car_provider_app/pages/user/confirm_new_password_page.dart'; class AppRoutes { //User @@ -28,6 +30,8 @@ class AppRoutes { static final String profile1 = "/profile1"; static final String profile2 = "/profile2"; static final String profile3 = "/profile3"; + static final String vertifyPassword = "/vertifyPassword"; + static final String confirmNewPasswordPage = "/confirmNewPasswordPage"; static final String dashboard = "/dashboard"; @@ -47,6 +51,8 @@ class AppRoutes { profile1: (context) => Profile1Page(), profile2: (context) => Profile2Page(), profile3: (context) => Profile3Page(), + vertifyPassword: (context) => VerifyPasswordPage(), + 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..03891f9 --- /dev/null +++ b/lib/models/user/confirm_password.dart @@ -0,0 +1,30 @@ + +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..049105f --- /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; + } +} \ No newline at end of file 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..7ab7e5c --- /dev/null +++ b/lib/models/user/forget_password_otp_request.dart @@ -0,0 +1,50 @@ + +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_page.dart b/lib/pages/user/confirm_new_password_page.dart new file mode 100644 index 0000000..abbd930 --- /dev/null +++ b/lib/pages/user/confirm_new_password_page.dart @@ -0,0 +1,76 @@ +import 'package:car_provider_app/api/shared_prefrence.dart'; +import 'package:car_provider_app/api/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/models/user/confirm_password.dart'; +import 'package:car_provider_app/models/user/forget_password_otp_compare.dart'; +import 'package:car_provider_app/models/user/forget_password_otp_request.dart'; +import 'package:car_provider_app/pages/user/vertify_password_page.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/dialog/dialogs.dart'; +import 'package:car_provider_app/widgets/dialog/message_dialog.dart'; +import 'package:car_provider_app/widgets/show_fill_button.dart'; +import 'package:car_provider_app/extensions/string_extensions.dart'; +import 'package:car_provider_app/extensions/int_extensions.dart'; +import 'package:car_provider_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 b562656..d8dad61 100644 --- a/lib/pages/user/forget_password_page.dart +++ b/lib/pages/user/forget_password_page.dart @@ -1,49 +1,170 @@ +import 'package:car_provider_app/api/shared_prefrence.dart'; +import 'package:car_provider_app/api/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/models/user/forget_password_otp_compare.dart'; +import 'package:car_provider_app/models/user/forget_password_otp_request.dart'; +import 'package:car_provider_app/pages/user/vertify_password_page.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/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:car_provider_app/extensions/string_extensions.dart'; import 'package:car_provider_app/extensions/int_extensions.dart'; import 'package:car_provider_app/extensions/widget_extensions.dart'; import 'package:car_provider_app/widgets/txt_field.dart'; import 'package:flutter/material.dart'; +import 'package:car_provider_app/models/user/user.dart'; + + +import 'dart:convert'; +import 'package:http/http.dart'; + class ForgetPasswordPage extends StatelessWidget { + + int otpType = 1; + String userName = ""; + @override Widget build(BuildContext context) { return Scaffold( - appBar: appBar(title: "Forget Password"), + appBar: appBar(title: "Change Password"), body: Container( width: double.infinity, height: double.infinity, padding: EdgeInsets.all(40), child: Column( children: [ - "Retrieve Password".toText24(), - 12.height, + "Verify New Password".toText24(), + mFlex(1), 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", + 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", + ), + ), + ], ), + mFlex(10), ], ), ), ); } + + 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; + 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); + } 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 ba83bf3..ecd1600 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 534a13d..337502b 100644 --- a/lib/pages/user/register_selection_page.dart +++ b/lib/pages/user/register_selection_page.dart @@ -21,21 +21,22 @@ 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", + // title: "Log In With Password", 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", diff --git a/lib/pages/user/vertify_password_page.dart b/lib/pages/user/vertify_password_page.dart new file mode 100644 index 0000000..f089885 --- /dev/null +++ b/lib/pages/user/vertify_password_page.dart @@ -0,0 +1,162 @@ + +import 'package:car_provider_app/api/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/models/user/forget_password_otp_compare.dart'; +import 'package:car_provider_app/models/user/forget_password_otp_request.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/extensions/int_extensions.dart'; +import 'package:car_provider_app/extensions/string_extensions.dart'; +import 'package:car_provider_app/extensions/widget_extensions.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/txt_field.dart'; +import 'package:flutter/material.dart'; + + + +class VerifyPasswordPage extends StatelessWidget { + int otpType = 1; + String phoneNum = ""; + String userName = ""; + String userToken = ""; + String otp = ""; + + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: appBar(title: "Change Password"), + body: Container( + width: double.infinity, + height: double.infinity, + padding: EdgeInsets.all(40), + child: Column( + children: [ + "Verify New Password".toText24(), + mFlex(1), + TxtField( + hint: "966500000000", + value: phoneNum, + onChanged: (v) { + phoneNum = v; + }, + ), + mFlex(2), + Row( + children: [ + Expanded( + child: ShowImageButton( + onClick: () { + otpType = 1; + // sendPasswordOTP(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; + // sendPasswordOTP(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", + ), + ), + ], + ), + 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); +// }, +// ), +// ), +// ); +// }, +// )); + + +}