diff --git a/lib/Common/controller/data/network/network_api.dart b/lib/Common/controller/data/network/network_api.dart index 5de863b..9929ce2 100644 --- a/lib/Common/controller/data/network/network_api.dart +++ b/lib/Common/controller/data/network/network_api.dart @@ -13,15 +13,16 @@ import 'package:http/http.dart' as http; import '../../entry_point_controller.dart'; class NetworkApiServices { - String basicAuth = 'Basic ' + - base64.encode( - utf8.encode('RegroupUserName:71%@L%es^bUX94`J9XT*@bh,._WWM{\$%^^&&')); + // String basicAuth = 'Basic ' + + // base64.encode( + // utf8.encode('RegroupUserName:71%@L%es^bUX94`J9XT*@bh,._WWM{\$%^^&&')); Dio dio = Dio(); final controllerEntryPoint = Get.put(EntryPointController()); - String basicAuth = 'Basic ' + - base64.encode(utf8.encode('RegroupUserName:71%@L%es^bUX94`J9XT*@bh,._WWM{\$%^^&&')); + String basicAuth = 'Basic ' + + base64.encode( + utf8.encode('RegroupUserName:71%@L%es^bUX94`J9XT*@bh,._WWM{\$%^^&&')); Future getApi(String url) async { if (kDebugMode) { @@ -76,7 +77,7 @@ class NetworkApiServices { // try { // response = await dio.post(url, // data: data, - // options: optionalpar + // options: optionalpar // ? // Options( // headers: { @@ -118,11 +119,9 @@ class NetworkApiServices { // } // } // } - //New post api - @override Future postApi(data, String url, {bool optionalpar = false}) async { if (kDebugMode) { @@ -132,8 +131,9 @@ class NetworkApiServices { Response response; SharedPreferences prefs = await SharedPreferences.getInstance(); - String? token = prefs.getString('accessToken'); + String? token = prefs.getString('access-token'); log(token.toString()); + log(basicAuth); try { response = await dio.post( url, @@ -145,15 +145,34 @@ class NetworkApiServices { }, ) : Options( - headers: {'authorization': basicAuth, 'access-token': token}, + headers: { + 'authorization': basicAuth, + // 'access-token': token + }, ), ); log(response.toString()); } on Exception catch (e) { if (e is DioException) { + log(e.response.toString()); + if (e.response == null) { + return ResponseData( + 'Oops something Went Wrong, Please try again!', + ResponseStatus.FAILED, + ); + } + if (e.response!.statusCode == 401) { + prefs.remove('token'); + prefs.remove('refreshToken'); + // Get.toNamed(RouteName.login); + return ResponseData( + 'Oops something Went Wrong, Please try again!', + ResponseStatus.FAILED, + ); + } if (e.response!.statusCode == 403) { return ResponseData( - e.response!.statusMessage!, ResponseStatus.FAILED, + e.response!.statusMessage!, ResponseStatus.PRIVATE, data: e.response!.data); } } @@ -163,21 +182,13 @@ class NetworkApiServices { ); } - if (response.statusCode == 200) { - return ResponseData("success", ResponseStatus.SUCCESS, - data: response.data); - } else if (response.statusCode == 201) { + if (response.statusCode == 200 || response.statusCode == 201) { return ResponseData("success", ResponseStatus.SUCCESS, data: response.data); } else if (response.statusCode == 203) { print(response.data); return ResponseData("success", ResponseStatus.PRIVATE, data: response.data); - } else if (response.statusCode == 403) { - print(response.data); - return ResponseData( - response.statusMessage!, ResponseStatus.ERROR, - data: response.data); } else { try { return ResponseData( diff --git a/lib/Login/View/loginscreen.dart b/lib/Login/View/loginscreen.dart index ad56f10..498f531 100644 --- a/lib/Login/View/loginscreen.dart +++ b/lib/Login/View/loginscreen.dart @@ -108,7 +108,7 @@ class _LoginScreenState extends State { ); } else { Map updata = { - "email": _emailController.text, + "email_address": _emailController.text, "password": _passwordController.text, // "access-token" : "" // @@ -116,7 +116,7 @@ class _LoginScreenState extends State { }; final data = await LoginAPI().loginApi(updata); if (data.status == ResponseStatus.SUCCESS) { - await global.setname(); + // await global.setname(); Get.snackbar( "Success!", 'Login successful!', @@ -268,6 +268,11 @@ class _LoginScreenState extends State { if (value!.isEmpty) { return 'Please enter your password'; } + if (!RegExp( + r'^(?=.*?[A-Z])(?=.*?[0-9])(?=.*?[!@#\$&*~]).{8,}$') + .hasMatch(value)) { + return 'Enter a valid password'; + } return null; }, @@ -288,7 +293,11 @@ class _LoginScreenState extends State { alignment: Alignment.centerRight, child: Padding( padding: EdgeInsets.only(right: 6.w), - child: text14400white('Forgot password ?'), + child: GestureDetector( + onTap: () { + Get.toNamed(RouteName.forgotpass); + }, + child: text14400white('Forgot password ?')), )), sizedBoxHeight(40.h), CustomButton( diff --git a/lib/Login/ViewModel/LoginApi.dart b/lib/Login/ViewModel/LoginApi.dart index 8ecb8d8..f4306b5 100644 --- a/lib/Login/ViewModel/LoginApi.dart +++ b/lib/Login/ViewModel/LoginApi.dart @@ -5,19 +5,18 @@ import 'package:shared_preferences/shared_preferences.dart'; class LoginAPI { LoginAPI(); - Future> loginApi(var data) async { + Future loginApi(var data) async { SharedPreferences prefs = await SharedPreferences.getInstance(); final response = await NetworkApiServices().postApi( - 'https://regroup.betadelivery.com/api/v1/login', - data, - optionalpar: true + data, 'https://regroup.betadelivery.com/api/v1/login', + optionalpar: true // "auth/login/", ); if (response.status == ResponseStatus.SUCCESS) { //Map responseData = jsonDecode(response.data); - if (response.data['success'] == true) { + if (response.data['status'] == 'success') { LoginModel loginObj = LoginModel.fromJson(response.data); await prefs.setString('access-token', loginObj.data!.accessToken!); // await prefs.setString('refreshToken', loginObj.data!.refresh!); diff --git a/lib/Utils/texts.dart b/lib/Utils/texts.dart index 40b5c1d..ab870e6 100644 --- a/lib/Utils/texts.dart +++ b/lib/Utils/texts.dart @@ -530,6 +530,16 @@ Widget text12w400_FCFCFC(String text) { fontWeight: FontWeight.w400), ); } +Widget text12w400_8E8E8E(String text) { + return Text( + text, + style: TextStyle( + fontSize: 12.sp, + color: Color(0xFF8E8E8E), + fontFamily: 'Helvetica', + fontWeight: FontWeight.w400), + ); +} Widget text12w700_FCFCFC(String text) { return Text( diff --git a/lib/onboarding/NewPass/View/NewPass.dart b/lib/onboarding/NewPass/View/NewPass.dart new file mode 100644 index 0000000..b9aa428 --- /dev/null +++ b/lib/onboarding/NewPass/View/NewPass.dart @@ -0,0 +1,61 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:regroup/Common/CommonButton.dart'; +import 'package:regroup/Utils/Common/CommonAppbar.dart'; +import 'package:regroup/Utils/Common/CustomTextformfield.dart'; +import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/texts.dart'; + +class NewPassword extends StatefulWidget { + const NewPassword({super.key}); + + @override + State createState() => _NewPasswordState(); +} + +class _NewPasswordState extends State { + @override + Widget build(BuildContext context) { + return Scaffold( + // key: _scaffoldKey1, + backgroundColor: Color(0xFF222935), + extendBody: true, + resizeToAvoidBottomInset: false, + appBar: CommonAppbar( + titleTxt: "", + ), + body: Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + sizedBoxHeight(30.h), + text22400white("Create password"), + sizedBoxHeight(15.h), + Container( + height: 1.h, + width: 250.w, + color: Color(0xFF858585), + ), + sizedBoxHeight(35.h), + text16w400_FCFCFC("Create new password"), + sizedBoxHeight(15.h), + CustomTextFormField(), + sizedBoxHeight(20.h), + text16w400_FCFCFC("Confirm password"), + sizedBoxHeight(15.h), + CustomTextFormField(), + sizedBoxHeight(90.h), + CommonBtn(text: 'Continue'), + ]))) + ])); + } +} diff --git a/lib/onboarding/Signup/View/verifyuser.dart b/lib/onboarding/Signup/View/verifyuser.dart index fc1575a..33879ae 100644 --- a/lib/onboarding/Signup/View/verifyuser.dart +++ b/lib/onboarding/Signup/View/verifyuser.dart @@ -4,13 +4,16 @@ import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:get/get.dart'; import 'package:glassmorphism/glassmorphism.dart'; import 'package:pin_code_fields/pin_code_fields.dart'; +import 'package:regroup/Common/base_manager.dart'; import 'package:regroup/Utils/Common/CommonAppbar.dart'; import 'package:regroup/Utils/Common/CustomNextButton.dart'; import 'package:regroup/Utils/Common/blureffect.dart'; import 'package:regroup/Utils/Common/sized_box.dart'; import 'package:regroup/Utils/dialogs.dart'; import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/onboarding/forgotPass/ViewModel/ForgotPassAPI.dart'; import 'package:regroup/resources/routes/route_name.dart'; +import 'package:shared_preferences/shared_preferences.dart'; class VerifyuserScreenState extends StatefulWidget { const VerifyuserScreenState({super.key}); @@ -20,8 +23,64 @@ class VerifyuserScreenState extends StatefulWidget { } class _VerifyuserScreenStateState extends State { - String accounttype = Get.arguments; + // String accounttype = Get.arguments; TextEditingController? pincode = TextEditingController(); + final String emailAddress = Get.arguments; + + String? principleId; + +// principleId = prefs.getString('email').toString(); + + checkValidation() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + principleId = prefs.getString('principal_xid'); + if (pincode!.text.isEmpty) { + utils.showToast('Pin field is empty'); + } else { + Map updata = { + "iam_principal_xid": principleId.toString(), + "otp": pincode!.text, + }; + final data = await ForgotPassAPI().verifyotp(updata); + if (data.status == ResponseStatus.SUCCESS) { + // btnController.success(); + // btnController.reset(); + Get.snackbar( + "Success!", + 'OTP verification successful!', + duration: Duration(seconds: 2), + colorText: Colors.white, + backgroundColor: Colors.green, + margin: EdgeInsets.all(8), + snackStyle: SnackStyle.FLOATING, + snackPosition: SnackPosition.BOTTOM, + ); + Future.delayed(Duration(seconds: 1), () { + Get.toNamed(RouteName.newpassword, arguments: emailAddress); + }); + // print('success'); + } else { + // btnController.error(); + // btnController.reset(); + Get.snackbar( + "Error!", + data.data['message'], + duration: Duration(seconds: 2), + colorText: Colors.white, + backgroundColor: Colors.red, + margin: EdgeInsets.all(8), + snackStyle: SnackStyle.FLOATING, + snackPosition: SnackPosition.BOTTOM, + ); + } + } + } + + @override + void initState() { + print(emailAddress); + super.initState(); + } @override Widget build(BuildContext context) { @@ -80,7 +139,7 @@ class _VerifyuserScreenStateState extends State { text22400white('Check your email'), sizedBoxHeight(10.h), text14400white( - 'Enter the verification code that we sent to loremipsum@gmail.com'), + 'Enter the verification code that we sent to $emailAddress'), sizedBoxHeight(40.h), text16400white('Enter code'), sizedBoxHeight(20.h), @@ -147,17 +206,18 @@ class _VerifyuserScreenStateState extends State { CustomButton( text: 'Continue', onPressed: () { - if (pincode!.text.isEmpty) { - utils.showToast('Pin field is empty'); - } else { - if (accounttype == 'Individual') { - print('individual selected'); - Get.toNamed(RouteName.tellusindividualscreen); - } else if (accounttype == 'Business') { - print('business selected'); - Get.toNamed(RouteName.tellusbusinessscreen); - } - } + // if (pincode!.text.isEmpty) { + // utils.showToast('Pin field is empty'); + // } else { + // if (accounttype == 'Individual') { + // print('individual selected'); + // Get.toNamed(RouteName.tellusindividualscreen); + // } else if (accounttype == 'Business') { + // print('business selected'); + // Get.toNamed(RouteName.tellusbusinessscreen); + // } + // } + checkValidation(); }), const Spacer( // flex: 2, diff --git a/lib/onboarding/forgotPass/View/ForgotPass.dart b/lib/onboarding/forgotPass/View/ForgotPass.dart new file mode 100644 index 0000000..5f68756 --- /dev/null +++ b/lib/onboarding/forgotPass/View/ForgotPass.dart @@ -0,0 +1,161 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_screenutil/flutter_screenutil.dart'; +import 'package:get/get.dart'; +import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Utils/Common/CommonAppbar.dart'; +import 'package:regroup/Utils/Common/CustomNextButton.dart'; +import 'package:regroup/Utils/Common/CustomTextformfield.dart'; +import 'package:regroup/Utils/Common/sized_box.dart'; +import 'package:regroup/Utils/dialogs.dart'; +import 'package:regroup/Utils/texts.dart'; +import 'package:regroup/onboarding/forgotPass/ViewModel/ForgotPassAPI.dart'; +import 'package:regroup/resources/routes/route_name.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class ForgotPass extends StatefulWidget { + const ForgotPass({super.key}); + + @override + State createState() => _ForgotPassState(); +} + +class _ForgotPassState extends State { + TextEditingController emailController = TextEditingController(); + // final _formKey = GlobalKey(); + + checkValidation() async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + + if (emailController.text.isEmpty) { + utils.showToast('Enter a email address'); + } else if (!emailController.text.isEmail) { + utils.showToast('Enter a valid email address'); + } else { + // Get.toNamed(RouteName.verifyusercreen, + // arguments: { + // "emailAddress": emailController.text + // }); + + Map updata = { + "email_address": emailController.text, + }; + final resp = await ForgotPassAPI().requestotp(updata); + if (resp.status == ResponseStatus.SUCCESS) { + Get.snackbar( + "Success!", + 'OTP sent successfully!', + duration: Duration(seconds: 2), + colorText: Colors.white, + backgroundColor: Colors.green, + margin: EdgeInsets.all(8), + snackStyle: SnackStyle.FLOATING, + snackPosition: SnackPosition.BOTTOM, + ); + prefs.setString('email', emailController.text); + prefs.setString('principal_xid', resp.data['data']['iam_principal_xid']); + Future.delayed(Duration(seconds: 1), () { + Get.toNamed(RouteName.verifyusercreen, + arguments: emailController.text); + }); + // print('success'); + } else if (resp.status == ResponseStatus.FAILED) { + Get.snackbar( + "Error!", + resp.message, + duration: Duration(seconds: 2), + colorText: Colors.white, + backgroundColor: Colors.red, + margin: EdgeInsets.all(8), + snackStyle: SnackStyle.FLOATING, + snackPosition: SnackPosition.BOTTOM, + ); + } else { + // btnController.error(); + // btnController.reset(); + Get.snackbar( + "Error!", + resp.data['message'], + duration: Duration(seconds: 2), + colorText: Colors.white, + backgroundColor: Colors.red, + margin: EdgeInsets.all(8), + snackStyle: SnackStyle.FLOATING, + snackPosition: SnackPosition.BOTTOM, + ); + } + } + } + + @override + Widget build(BuildContext context) { + return Scaffold( + // key: _scaffoldKey1, + backgroundColor: Color(0xFF222935), + extendBody: true, + resizeToAvoidBottomInset: false, + appBar: CommonAppbar( + titleTxt: "", + ), + body: Stack(children: [ + Container( + decoration: const BoxDecoration( + image: DecorationImage( + image: AssetImage("assets/images/png/Ellipse 1496.png"), + fit: BoxFit.fill)), + ), + SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 16), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + sizedBoxHeight(30.h), + text22400white("Forgot password"), + sizedBoxHeight(15.h), + Container( + height: 1.h, + width: 250.w, + color: Color(0xFF858585), + ), + sizedBoxHeight(35.h), + text16w400_FCFCFC("Email address"), + sizedBoxHeight(15.h), + CustomTextFormField( + textEditingController: emailController, + leadingIcon: Container( + height: 18.h, + width: 23.w, + child: Center( + child: Image.asset( + "assets/images/png/Frame 12 (1).png", + height: 18.h, + width: 23.w, + ), + ), + ), + hintText: "loremipsum@gmail.comess", + validator: (value) { + if (value!.isEmpty) { + return 'Enter your e-mail address'; + } + if (!RegExp( + r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$') + .hasMatch(value)) { + return 'Enter a valid e-mail address'; + } + return null; + }, + ), + sizedBoxHeight(8.h), + text12w400_8E8E8E( + "We’ll send four digit code to the registered email"), + sizedBoxHeight(90.h), + CustomButton( + text: 'Continue', + onPressed: () { + checkValidation(); + }), + ]))) + ])); + } +} diff --git a/lib/onboarding/forgotPass/ViewModel/ForgotPassAPI.dart b/lib/onboarding/forgotPass/ViewModel/ForgotPassAPI.dart new file mode 100644 index 0000000..970afba --- /dev/null +++ b/lib/onboarding/forgotPass/ViewModel/ForgotPassAPI.dart @@ -0,0 +1,50 @@ +import 'package:regroup/Common/base_manager.dart'; +import 'package:regroup/Common/controller/data/network/network_api.dart'; +import 'package:shared_preferences/shared_preferences.dart'; + +class ForgotPassAPI { + ForgotPassAPI(); + // class otpAPI { + // otpAPI(this.data); + // var data; + Future> requestotp(var data) async { + final response = await NetworkApiServices().postApi( + data, + "https://regroup.betadelivery.com/api/v1/forgot-password", + ); + + if (response.status == ResponseStatus.SUCCESS) { + //Map responseData = jsonDecode(response.data); + if (response.data['status'] == "success") { + return ResponseData( + response.data['message'], ResponseStatus.SUCCESS,data: response.data); + } else { + return ResponseData( + response.data['message'], ResponseStatus.FAILED); + } + } + + return response; + } + + Future> verifyotp(var data) async { + final response = await NetworkApiServices().postApi( + data, + "https://regroup.betadelivery.com/api/v1/forgot-password/verify-otp", + ); + + if (response.status == ResponseStatus.SUCCESS) { + //Map responseData = jsonDecode(response.data); + if (response.data['status'] == "success") { + return ResponseData( + response.data['message'], ResponseStatus.SUCCESS); + } else { + return ResponseData( + response.data['message'], ResponseStatus.FAILED); + } + } + + return response; + } +} + diff --git a/lib/resources/routes/route_name.dart b/lib/resources/routes/route_name.dart index 243d916..127ca3c 100644 --- a/lib/resources/routes/route_name.dart +++ b/lib/resources/routes/route_name.dart @@ -8,6 +8,7 @@ class RouteName { static const String verifyusercreen = '/verifyuser'; static const String tellusindividualscreen = '/tellusindividualscreen'; static const String tellusbusinessscreen = '/tellusbusinessscreen'; + static const String forgotpass = '/forgotpass'; static const String individualprofilestep1 = '/individualprofilestep1'; static const String individualactivitystep2 = '/individualactivitystep2'; @@ -79,8 +80,9 @@ class RouteName { static const String changepassword = '/changepassword'; static const String addtimeline = '/addtimeline'; static const String verifycode = '/verifycode'; - static const String availability = '/availability'; + static const String newpassword = '/newpassword'; + static const String availability = '/availability'; //Group Tab @@ -96,8 +98,6 @@ class RouteName { static const String certificate = '/certificate'; static const String sessions = '/sessions'; - - //subgroup static const String subgroups = '/subgroups'; static const String subgroupinfo = '/subgroupinfo'; @@ -110,7 +110,5 @@ class RouteName { static const String searchgroup = '/searchgroup'; static const String detailexplore = '/detailexplore'; - - static const String notificaationpage = '/notificationpage'; } diff --git a/lib/resources/routes/routes.dart b/lib/resources/routes/routes.dart index 995d921..54774a3 100644 --- a/lib/resources/routes/routes.dart +++ b/lib/resources/routes/routes.dart @@ -83,6 +83,7 @@ import 'package:regroup/Feed%20Module/sidemenu/SavedPosts/SavedPosts.dart'; import 'package:regroup/Feed%20Module/sidemenu/sidemenu.dart'; import 'package:regroup/Utils/Common/NoInternet.dart'; +import 'package:regroup/onboarding/NewPass/View/NewPass.dart'; import 'package:regroup/onboarding/Signup/View/Business/step1Letusunderstandbetter.dart'; import 'package:regroup/onboarding/Signup/View/Business/step2Selectgroup.dart'; import 'package:regroup/onboarding/Signup/View/Business/step3SelectCommunity.dart'; @@ -96,6 +97,7 @@ import 'package:regroup/onboarding/Signup/View/communitycommitment.dart'; import 'package:regroup/onboarding/Signup/View/signupendpage.dart'; import 'package:regroup/onboarding/Signup/View/signupscreen.dart'; import 'package:regroup/onboarding/Signup/View/verifyuser.dart'; +import 'package:regroup/onboarding/forgotPass/View/ForgotPass.dart'; import 'package:regroup/onboarding/onboarding1.dart'; import 'package:regroup/onboarding/splashscreen.dart'; import 'package:regroup/resources/routes/route_name.dart'; @@ -476,5 +478,14 @@ class AppRoutes { name: RouteName.sessions, page: () => const Sessions(), ), + + GetPage( + name: RouteName.forgotpass, + page: () => const ForgotPass(), + ), + GetPage( + name: RouteName.newpassword, + page: () => const NewPassword(), + ), ]; }