diff --git a/lib/api/client/user_api_client.dart b/lib/api/client/user_api_client.dart index 6cceb1e..8bed061 100644 --- a/lib/api/client/user_api_client.dart +++ b/lib/api/client/user_api_client.dart @@ -9,6 +9,8 @@ import 'package:car_provider_app/models/user/role.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/models/user/verify_email.dart'; +import 'package:car_provider_app/models/user/verify_email_otp.dart'; import 'package:http/http.dart'; import 'package:car_provider_app/classes/consts.dart'; import 'package:car_provider_app/models/content_info_model.dart'; @@ -163,4 +165,25 @@ class UserApiClent { 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 25641ac..16a90ca 100644 --- a/lib/classes/consts.dart +++ b/lib/classes/consts.dart @@ -25,6 +25,8 @@ 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"; //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 9867598..302e12c 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -9,6 +9,7 @@ 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/edit_account_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'; @@ -45,6 +46,7 @@ class AppRoutes { static final String forgetPasswordMethodPage = "/forgetPasswordMethodPage"; static final String changeMobilePage = "/changeMobilePage"; static final String changeEmailPage = "/changeEmailPage"; + static final String editAccoundPage = "/editAccoundPage"; static final String dashboard = "/dashboard"; @@ -76,6 +78,7 @@ class AppRoutes { forgetPasswordMethodPage: (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/verify_email.dart b/lib/models/user/verify_email.dart new file mode 100644 index 0000000..bf0858f --- /dev/null +++ b/lib/models/user/verify_email.dart @@ -0,0 +1,53 @@ + + + +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/verify_email_otp.dart b/lib/models/user/verify_email_otp.dart new file mode 100644 index 0000000..aa0827c --- /dev/null +++ b/lib/models/user/verify_email_otp.dart @@ -0,0 +1,27 @@ + + + +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 4e0fcde..6abd4db 100644 --- a/lib/pages/dashboard/dashboard_page.dart +++ b/lib/pages/dashboard/dashboard_page.dart @@ -130,7 +130,9 @@ class _DashboardPageState extends State { ), ShowFillButton( title: "EDIT", - onPressed: () {}, + onPressed: () { + navigateWithName(context, AppRoutes.editAccoundPage); + }, ), ], ), @@ -157,27 +159,27 @@ class _DashboardPageState extends State { navigateWithName(context, AppRoutes.dealershipSetting); }, ), - ListTile( - leading: SvgPicture.asset("assets/images/ic_lock.svg"), - title: "Change Password".toText12(), - onTap: (){ - navigateWithName(context, AppRoutes.changePassword); - }, - ), - 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_lock.svg"), + // title: "Change Password".toText12(), + // onTap: (){ + // navigateWithName(context, AppRoutes.changePassword); + // }, + // ), + // 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"), title: "Sign Out".toText12(), diff --git a/lib/pages/user/change_email_page.dart b/lib/pages/user/change_email_page.dart index a505967..6e19455 100644 --- a/lib/pages/user/change_email_page.dart +++ b/lib/pages/user/change_email_page.dart @@ -97,7 +97,7 @@ class _ChangeEmailPageState extends State { showMDialog( context, child: MessageDialog( - title: "Email Verified", + title: "Email is 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..b6ba583 --- /dev/null +++ b/lib/pages/user/edit_account_page.dart @@ -0,0 +1,146 @@ + + +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/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/verify_email.dart'; +import 'package:car_provider_app/models/user/verify_email_otp.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:flutter/material.dart'; +import 'package:flutter_svg/flutter_svg.dart'; + + + +class EditAccountPage extends StatefulWidget { + @override + State createState() => _EditAccountPageState(); +} + +class _EditAccountPageState extends State { + String userID = ""; + String email = ''; + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: appBar(title: "Edit Account"), + body: Container( + width: double.infinity, + height: double.infinity, + padding: EdgeInsets.all(40), + child: Column( + children: [ + 20.height, + ListTile( + leading: SvgPicture.asset("assets/images/ic_lock.svg"), + title: "Change Password".toText12(), + onTap: (){ + navigateWithName(context, AppRoutes.changePassword); + }, + ), + 15.height, + Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + SvgPicture.asset("assets/images/ic_mobile.svg"), + "Change Mobile".toText12(), + "Verified".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: 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); + // }, + // ), + ], + ), + ), + ); + } + + 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 is Verified", + onClick: () { + Navigator.of(context).pushNamedAndRemoveUntil(AppRoutes.dashboard, (Route route) => false); + }, + ), + ); + } else { + Utils.showToast(otpCompare.errors ?? ""); + } + }, + )); + } else { + Utils.showToast(otpRequest.message ?? ""); + } + } + + +}