From 184ac7859d4f150a7d2b013388c0b3fb74c3fda8 Mon Sep 17 00:00:00 2001 From: Fatimah Alshammari Date: Tue, 29 Mar 2022 09:53:40 +0300 Subject: [PATCH] verify email --- lib/api/user_api_client.dart | 26 +++++ lib/classes/consts.dart | 3 + lib/config/routes.dart | 3 + lib/models/user/email_verify.dart | 52 +++++++++ lib/models/user/email_verify_otp.dart | 26 +++++ lib/pages/dashboard/dashboard_page.dart | 44 +++---- lib/pages/user/change_email_page.dart | 2 +- lib/pages/user/edit_account_page.dart | 149 ++++++++++++++++++++++++ 8 files changed, 282 insertions(+), 23 deletions(-) create mode 100644 lib/models/user/email_verify.dart create mode 100644 lib/models/user/email_verify_otp.dart create mode 100644 lib/pages/user/edit_account_page.dart diff --git a/lib/api/user_api_client.dart b/lib/api/user_api_client.dart index 623a883..8b1c093 100644 --- a/lib/api/user_api_client.dart +++ b/lib/api/user_api_client.dart @@ -1,4 +1,5 @@ import 'dart:async'; +import 'package:car_customer_app/api/shared_prefrence.dart'; import 'package:car_customer_app/classes/app_state.dart'; import 'package:car_customer_app/models/user/change_email.dart'; import 'package:car_customer_app/models/user/change_mobile.dart'; @@ -6,6 +7,7 @@ import 'package:car_customer_app/models/user/change_password.dart'; import 'package:car_customer_app/models/user/confirm_email.dart'; import 'package:car_customer_app/models/user/confirm_mobile.dart'; import 'package:car_customer_app/models/user/country.dart'; +import 'package:car_customer_app/models/user/email_verify.dart'; import 'package:http/http.dart'; import 'package:car_customer_app/classes/consts.dart'; import 'package:car_customer_app/models/content_info_model.dart'; @@ -13,6 +15,7 @@ import 'package:car_customer_app/models/member_model.dart'; import 'package:car_customer_app/models/surah_model.dart'; import 'package:car_customer_app/models/user/basic_otp.dart'; import 'package:car_customer_app/models/user/register_user.dart'; +import 'package:car_customer_app/models/user/email_verify_otp.dart'; import 'api_client.dart'; @@ -143,4 +146,27 @@ class UserApiClent { String t = AppState().getUser.data!.accessToken ?? ""; return await ApiClient().postJsonForObject((json) => ConfirmEmail.fromJson(json), ApiConsts.ChangeEmail, postParams, token: t); } + + Future EmailVerify(String email, String userID) async { + var postParams = { + // "email": email, + // "userID": userID, + "email": AppState().getUser.data!.userInfo!.email ?? "", + "userID": AppState().getUser.data!.userInfo!.userId ?? "", + }; + + String t = AppState().getUser.data!.accessToken ?? ""; + return await ApiClient().postJsonForObject((json) => VerifyEmail.fromJson(json), ApiConsts.EmailVerify, postParams, token: t); + } + + Future EmailVerifyOTPVerify(String userToken, String userOTP) async { + var postParams = + {"userToken": userToken, + "userOTP": userOTP}; + + String t = AppState().getUser.data!.accessToken ?? ""; + return await ApiClient().postJsonForObject((json) => VerifyEmailOTP.fromJson(json), ApiConsts.EmailVerifyOTPVerify, postParams, token: t); + } + + } diff --git a/lib/classes/consts.dart b/lib/classes/consts.dart index 7260769..669f578 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -23,6 +23,9 @@ class ApiConsts { static String ChangeMobileNo = baseUrlServices + "api/Account/ChangeMobileNo"; static String ChangeEmailOTPRequest = baseUrlServices + "api/Account/ChangeEmailOTPRequest"; static String ChangeEmail = baseUrlServices + "api/Account/ChangeEmail"; + static String EmailVerify = baseUrlServices + "api/Account/EmailVerify"; + static String EmailVerifyOTPVerify = baseUrlServices + "api/Account/EmailVerifyOTPVerify"; + } diff --git a/lib/config/routes.dart b/lib/config/routes.dart index f0cfeb0..b5dc34b 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -4,6 +4,7 @@ import 'package:car_customer_app/pages/user/change_email_page.dart'; import 'package:car_customer_app/pages/user/change_mobile_page.dart'; import 'package:car_customer_app/pages/user/change_password_page.dart'; import 'package:car_customer_app/pages/user/complete_profile_page.dart'; +import 'package:car_customer_app/pages/user/edit_account_page.dart'; import 'package:car_customer_app/pages/user/forget_password_page.dart'; import 'package:car_customer_app/pages/user/login_method_selection_page.dart'; import 'package:car_customer_app/pages/user/login_verification_page.dart'; @@ -33,6 +34,7 @@ class AppRoutes { static final String forgetPasswordMethodSPage = "/forgetPasswordMethodPage"; static final String changeMobilePage = "/changeMobilePage"; static final String changeEmailPage = "/changeEmailPage"; + static final String editAccoundPage = "/editAccoundPage"; static final String dashboard = "/dashboard"; @@ -54,6 +56,7 @@ class AppRoutes { forgetPasswordMethodSPage : (context) => ForgetPasswordMethodPage(ModalRoute.of(context)!.settings.arguments as String), changeMobilePage: (context) => ChangeMobilePage(), changeEmailPage : (context) => ChangeEmailPage(), + editAccoundPage : (context) => EditAccountPage(), //Home page dashboard: (context) => DashboardPage(), diff --git a/lib/models/user/email_verify.dart b/lib/models/user/email_verify.dart new file mode 100644 index 0000000..d39c963 --- /dev/null +++ b/lib/models/user/email_verify.dart @@ -0,0 +1,52 @@ + + +import 'dart:convert'; + +VerifyEmail verifyEmailFromJson(String str) => VerifyEmail.fromJson(json.decode(str)); + +String verifyEmailToJson(VerifyEmail data) => json.encode(data.toJson()); + + +class VerifyEmail { + Null? totalItemsCount; + Data? data; + int? messageStatus; + String? message; + + VerifyEmail( + {this.totalItemsCount, this.data, this.messageStatus, this.message}); + + VerifyEmail.fromJson(Map json) { + totalItemsCount = json['totalItemsCount']; + data = json['data'] != null ? new Data.fromJson(json['data']) : null; + messageStatus = json['messageStatus']; + message = json['message']; + } + + Map toJson() { + final Map data = new Map(); + data['totalItemsCount'] = this.totalItemsCount; + if (this.data != null) { + data['data'] = this.data!.toJson(); + } + data['messageStatus'] = this.messageStatus; + data['message'] = this.message; + return data; + } +} + +class Data { + String? userToken; + + Data({this.userToken}); + + Data.fromJson(Map json) { + userToken = json['userToken']; + } + + Map toJson() { + final Map data = new Map(); + data['userToken'] = this.userToken; + return data; + } +} \ No newline at end of file diff --git a/lib/models/user/email_verify_otp.dart b/lib/models/user/email_verify_otp.dart new file mode 100644 index 0000000..eea8503 --- /dev/null +++ b/lib/models/user/email_verify_otp.dart @@ -0,0 +1,26 @@ + + +import 'dart:convert'; + +VerifyEmailOTP verifyEmailOTPFromJson(String str) => VerifyEmailOTP.fromJson(json.decode(str)); + +String verifyEmailOTPToJson(VerifyEmailOTP data) => json.encode(data.toJson()); + +class VerifyEmailOTP { + bool? success; + Null? errors; + + VerifyEmailOTP({this.success, this.errors}); + + VerifyEmailOTP.fromJson(Map json) { + success = json['success']; + errors = json['errors']; + } + + Map toJson() { + final Map data = new Map(); + data['success'] = this.success; + data['errors'] = this.errors; + return data; + } +} \ No newline at end of file diff --git a/lib/pages/dashboard/dashboard_page.dart b/lib/pages/dashboard/dashboard_page.dart index b44debd..b012e18 100644 --- a/lib/pages/dashboard/dashboard_page.dart +++ b/lib/pages/dashboard/dashboard_page.dart @@ -107,7 +107,7 @@ class _DashboardPageState extends State { ShowFillButton( title: "EDIT", onPressed: () { - + navigateWithName(context, AppRoutes.editAccoundPage); }, ), ], @@ -125,27 +125,27 @@ class _DashboardPageState extends State { leading: Icon(Icons.person), title: "Account".toText12(), ), - ListTile( - leading: Icon(Icons.password), - title: "Change Password".toText12(), - onTap: () { - navigateWithName(context, AppRoutes.changePasswordPage); - }, - ), - ListTile( - leading: Icon(Icons.phone_android_sharp), - title: "Change Mobile".toText12(), - onTap: () { - navigateWithName(context, AppRoutes.changeMobilePage); - }, - ), - ListTile( - leading: Icon(Icons.email_outlined), - title: "Change Email".toText12(), - onTap: () { - navigateWithName(context, AppRoutes.changeEmailPage); - }, - ), + // ListTile( + // leading: Icon(Icons.password), + // title: "Change Password".toText12(), + // onTap: () { + // navigateWithName(context, AppRoutes.changePasswordPage); + // }, + // ), + // ListTile( + // leading: Icon(Icons.phone_android_sharp), + // title: "Change Mobile".toText12(), + // onTap: () { + // navigateWithName(context, AppRoutes.changeMobilePage); + // }, + // ), + // ListTile( + // leading: Icon(Icons.email_outlined), + // title: "Change Email".toText12(), + // onTap: () { + // navigateWithName(context, AppRoutes.changeEmailPage); + // }, + // ), ListTile( leading: Icon(Icons.logout), title: "Sign Out".toText12(), diff --git a/lib/pages/user/change_email_page.dart b/lib/pages/user/change_email_page.dart index 923ba05..99c07f9 100644 --- a/lib/pages/user/change_email_page.dart +++ b/lib/pages/user/change_email_page.dart @@ -99,7 +99,7 @@ class _ChangeEmailPageState extends State { showMDialog( context, child: MessageDialog( - title: "Email Verified", + title: "Email Changed Successfully", onClick: () { Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.loginWithPassword, (Route route) => false); }, diff --git a/lib/pages/user/edit_account_page.dart b/lib/pages/user/edit_account_page.dart new file mode 100644 index 0000000..f2f2a38 --- /dev/null +++ b/lib/pages/user/edit_account_page.dart @@ -0,0 +1,149 @@ + +import 'dart:convert'; + +import 'package:car_customer_app/api/shared_prefrence.dart'; +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/string_extensions.dart'; +import 'package:car_customer_app/models/user/email_verify.dart'; +import 'package:car_customer_app/models/user/email_verify_otp.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/extensions/int_extensions.dart'; +import 'package:car_customer_app/widgets/dialog/dialogs.dart'; +import 'package:car_customer_app/widgets/dialog/message_dialog.dart'; +import 'package:car_customer_app/widgets/dialog/otp_dialog.dart'; +import 'package:flutter/material.dart'; + + + +class EditAccountPage extends StatefulWidget { + @override + State createState() => _EditAccountPageState(); +} + +class _EditAccountPageState extends State { + String userID = ""; + String email = ''; + bool isVerified = false; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: appBar(title: "Edit Account"), + body: Container( + width: double.infinity, + height: double.infinity, + padding: EdgeInsets.all(20), + child: Column( + children: [ + ListTile( + leading: Icon(Icons.lock, color: Colors.blue,), + title: "Change Password".toText12(), + onTap: () { + navigateWithName(context, AppRoutes.changePasswordPage); + }, + ), + 15.height, + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Icon(Icons.phone_android_sharp, color: Colors.blue,), + "Change Mobile".toText12(), + "Verify".toText12(), + RaisedButton( + onPressed: (){ + navigateWithName(context, AppRoutes.changeMobilePage); + }, + child: Text("Change", + style: TextStyle(fontSize: 14, + fontWeight: FontWeight.w600,),),color:Colors.blue, + textColor: Colors.white, + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8) + ) + ], + ), + 20.height, + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + Icon(Icons.email, color: Colors.blue,), + "Change Email".toText12(), + InkWell( + child: "Verify".toText12(), + onTap:() { + verifyEmail(context); + }, + ), + RaisedButton( + onPressed: (){ + navigateWithName(context, AppRoutes.changeEmailPage); + }, + child: Text("Change", + style: TextStyle(fontSize: 14, + fontWeight: FontWeight.w600,),),color:Colors.blue, + textColor: Colors.white, + padding: EdgeInsets.symmetric(horizontal: 8, vertical: 8) + ) + ], + ) + // ListTile( + // leading: Icon(Icons.phone_android_sharp, color: Colors.blue,), + // 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); + // }, + // ), + + ], + ), + ), + ); + } + + + Future verifyEmail(BuildContext context) async { + Utils.showLoading(context); + VerifyEmail otpRequest = await UserApiClent().EmailVerify(email, userID); + Utils.hideLoading(context); + if (otpRequest.messageStatus == 1) { + showMDialog(context, child: OtpDialog( + onClick: (String code) async { + pop(context); + Utils.showLoading(context); + VerifyEmailOTP otpCompare = await UserApiClent().EmailVerifyOTPVerify(otpRequest.data!.userToken ?? "", code); + Utils.hideLoading(context); + if (otpCompare.success == true) { + showMDialog( + context, + child: MessageDialog( + title: "Email Verified", + onClick: () { + // !isVerified; + pop(context); + // Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.dashboard, (Route route) => false); + }, + ), + ); + } else { + Utils.showToast(otpCompare.errors ?? ""); + } + }, + )); + } else { + Utils.showToast(otpRequest.message ?? ""); + } + } + + + +}