From 5137f2dd34ea9c257d48ea1a5f8cfaf04bfa49a3 Mon Sep 17 00:00:00 2001 From: WaseemAbbasi22 <50428976+WaseemAbbasi22@users.noreply.github.com> Date: Sun, 5 Jul 2026 11:17:19 +0300 Subject: [PATCH] bug fixes --- lib/main.dart | 2 +- ...application_demo_request_form_screen.dart} | 0 .../action_button/footer_action_button.dart | 4 +- .../common_widgets/app_filled_button.dart | 9 +- .../common_widgets/default_app_bar.dart | 4 +- .../forget_passwod_verify_otp.dart | 24 +++- .../reset_password_view.dart | 125 ++++++++++++++---- lib/new_views/pages/login_page.dart | 2 +- 8 files changed, 132 insertions(+), 38 deletions(-) rename lib/modules/applicationDemo/screens/{demo_request_form_screen.dart => application_demo_request_form_screen.dart} (100%) diff --git a/lib/main.dart b/lib/main.dart index ab9a41e5..9666a5e9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -65,7 +65,7 @@ import 'package:test_sa/modules/site_request_module/providers/site_request_provi import 'package:test_sa/modules/site_request_module/screens/site_request_form_screen.dart'; import 'package:test_sa/modules/site_request_module/screens/site_request_history_screen.dart'; import 'package:test_sa/modules/applicationDemo/providers/application_demo_request_provider.dart'; -import 'package:test_sa/modules/applicationDemo/screens/demo_request_form_screen.dart'; +import 'package:test_sa/modules/applicationDemo/screens/application_demo_request_form_screen.dart'; import 'package:test_sa/modules/tm_module/gas_refill/create_gas_refill_request.dart'; import 'package:test_sa/modules/tm_module/gas_refill/update_gas_refill_request.dart'; import 'package:test_sa/new_views/app_style/app_themes.dart'; diff --git a/lib/modules/applicationDemo/screens/demo_request_form_screen.dart b/lib/modules/applicationDemo/screens/application_demo_request_form_screen.dart similarity index 100% rename from lib/modules/applicationDemo/screens/demo_request_form_screen.dart rename to lib/modules/applicationDemo/screens/application_demo_request_form_screen.dart diff --git a/lib/modules/cm_module/views/components/action_button/footer_action_button.dart b/lib/modules/cm_module/views/components/action_button/footer_action_button.dart index d6613319..2b37e168 100644 --- a/lib/modules/cm_module/views/components/action_button/footer_action_button.dart +++ b/lib/modules/cm_module/views/components/action_button/footer_action_button.dart @@ -32,12 +32,12 @@ import 'package:test_sa/new_views/swipe_module/dialoge/acknowledge_work_dialog.d import 'package:test_sa/providers/service_request_providers/reject_reason_provider.dart'; class FooterActionButton { - static Widget footerContainer({required Widget child, required BuildContext context}) { + static Widget footerContainer({required Widget child, required BuildContext context, bool safeAreaTop = true}) { return Container( alignment: Alignment.bottomCenter, padding: const EdgeInsets.only(left: 16, right: 16, top: 12, bottom: 12), color: AppColor.background(context), - child: SafeArea(child: child), + child: SafeArea(top: safeAreaTop, child: child), ); } diff --git a/lib/new_views/common_widgets/app_filled_button.dart b/lib/new_views/common_widgets/app_filled_button.dart index 9756872b..1456eea4 100644 --- a/lib/new_views/common_widgets/app_filled_button.dart +++ b/lib/new_views/common_widgets/app_filled_button.dart @@ -41,13 +41,18 @@ class AppFilledButton extends StatelessWidget { @override Widget build(BuildContext context) { - return Container( + return AnimatedContainer( + duration: const Duration(milliseconds: 250), height: height.toScreenHeight, width: maxWidth ? double.infinity : width, alignment: Alignment.center, decoration: BoxDecoration( borderRadius: BorderRadius.circular(10), - color: disableButton ? context.isDark ?AppColor.neutral20 :AppColor.neutral140 : (buttonColor ?? AppColor.primary10), + color: disableButton + ? context.isDark + ? AppColor.neutral20 + : AppColor.neutral140 + : (buttonColor ?? AppColor.primary10), border: showBorder ? Border.all(color: textColor ?? AppColor.background(context)) : null, ), child: loading diff --git a/lib/new_views/common_widgets/default_app_bar.dart b/lib/new_views/common_widgets/default_app_bar.dart index 58ac9631..70f2f15e 100644 --- a/lib/new_views/common_widgets/default_app_bar.dart +++ b/lib/new_views/common_widgets/default_app_bar.dart @@ -12,12 +12,13 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget { final String? title; final List? actions; final Function? onBackPress; + final Color? backgroundColor; final bool showHomeActionButton; final bool showBackButton; final VoidCallback? onWillPopScope; final TextStyle? titleStyle; - const DefaultAppBar({this.title, this.onBackPress, this.onWillPopScope, this.actions, this.titleStyle, this.showHomeActionButton = false, this.showBackButton = true, Key? key}) : super(key: key); + const DefaultAppBar({this.title, this.onBackPress, this.onWillPopScope, this.actions,this.backgroundColor, this.titleStyle, this.showHomeActionButton = false, this.showBackButton = true, Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -41,6 +42,7 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget { return AppBar( automaticallyImplyLeading: false, titleSpacing: 16, + backgroundColor:backgroundColor, title: Row( children: [ if (showBackButton) diff --git a/lib/new_views/forget_password_module/forget_passwod_verify_otp.dart b/lib/new_views/forget_password_module/forget_passwod_verify_otp.dart index 0401c2d2..9d1cec65 100644 --- a/lib/new_views/forget_password_module/forget_passwod_verify_otp.dart +++ b/lib/new_views/forget_password_module/forget_passwod_verify_otp.dart @@ -9,8 +9,10 @@ import 'package:test_sa/extensions/int_extensions.dart'; import 'package:test_sa/extensions/text_extensions.dart'; import 'package:test_sa/extensions/widget_extensions.dart'; import 'package:test_sa/models/new_models/general_response_model.dart'; +import 'package:test_sa/modules/cm_module/views/components/action_button/footer_action_button.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/common_widgets/app_filled_button.dart'; +import 'package:test_sa/new_views/common_widgets/default_app_bar.dart'; import 'package:test_sa/new_views/forget_password_module/reset_password_view.dart'; import 'package:test_sa/views/widgets/item_views/info_text_widget.dart'; @@ -78,12 +80,18 @@ class _ForgetPasswordVerifyOtpViewState extends State { return Form( key: _formKey, child: Scaffold( + appBar: const DefaultAppBar( + title: '', + backgroundColor: Colors.transparent, + ), body: Column( children: [ SingleChildScrollView( + padding: const EdgeInsets.all(16), child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.start, @@ -57,6 +64,10 @@ class _ResetPasswordViewState extends State { validator: (value) => Validator.hasValue(value) ? null : context.translation.requiredField, labelText: context.translation.password, obscureText: !_passwordVisible, + onChange: (value) { + newPassword = value; + setState(() {}); + }, suffixIcon: Icon( // Based on passwordVisible state choose the icon _passwordVisible ? Icons.visibility : Icons.visibility_off, @@ -67,9 +78,10 @@ class _ResetPasswordViewState extends State { _passwordVisible = !_passwordVisible; }); }), - onSaved: (value) { - newPassword = value; - }, + // onSaved: (value) { + // + // newPassword = value; + // }, ), 16.height, AppTextFormField( @@ -77,45 +89,108 @@ class _ResetPasswordViewState extends State { labelText: context.translation.confirmPassword, obscureText: !_confirmPasswordVisible, showBorder: true, - validator: (value) => Validator.isValidPassword(value!) - ? null - : value.isEmpty - ? context.translation.requiredField - : context.translation.passwordLengthMessage, - onSaved: (value) { + onChange: (value) { confirmPassword = value; + setState(() {}); }, + // validator: (value) => Validator.isValidPassword(value!) + // ? null + // : value.isEmpty + // ? context.translation.requiredField + // : context.translation.passwordLengthMessage, + // onSaved: (value) { + // confirmPassword = value; + // }, suffixIcon: Icon(_confirmPasswordVisible ? Icons.visibility : Icons.visibility_off, color: AppColor.icon2Color(context)).paddingOnly(end: 12).onPress(() { setState(() { _confirmPasswordVisible = !_confirmPasswordVisible; }); }), ), + 12.height, + passwordConstraintsUI('At least one upper case', checkRegEx(r'[A-Z]')), + 8.height, + passwordConstraintsUI('At least one special character', checkRegEx(r'[^\w\s]')), + 8.height, + passwordConstraintsUI('At least one numeric', checkRegEx(r'[0-9]')), + 8.height, + passwordConstraintsUI('Minimum 8 characters', newPassword.length >= 8), + 8.height, + passwordConstraintsUI('Confirm password must match', newPassword.isNotEmpty && newPassword == confirmPassword), ], ), ).center.expanded, - AppFilledButton(label: context.translation.resetPassword, maxWidth: true, onPressed: () => _resetPassword(context)), + FooterActionButton.footerContainer( + safeAreaTop: false, + context: context, + child: AppFilledButton(label: context.translation.resetPassword, disableButton: !isPasswordCompliant(newPassword, 8), maxWidth: true, onPressed: () => _resetPassword(context))), ], - ).paddingOnly(start: 16, end: 16, bottom: 24, top: 24), + ), ), ); } + bool checkRegEx(String pattern) { + return RegExp(pattern).hasMatch(newPassword); + } + + bool isPasswordCompliant(String? password, int minLength) { + if (password == null || password.isEmpty) { + return false; + } + + bool hasUppercase = password.contains(RegExp(r'[A-Z]')); + bool hasDigits = password.contains(RegExp(r'[0-9]')); + bool hasSpecialCharacter = password.contains(RegExp(r'[^\w\s]')); + // bool hasSpecialCharacters = password.contains(RegExp(r'[!@#$%^&*(),.?":{}|<>]')); + bool hasMinLength = password.length >= minLength; + bool isMatched = password == confirmPassword; + + return hasDigits && hasUppercase && hasMinLength && isMatched && hasSpecialCharacter; + } + + Widget passwordConstraintsUI(String description, bool check) { + return Row( + children: [ + 4.width, + SizedBox( + width: 12, + height: 12, + // activeColor: AppColor.primary10, + // checkColor: AppColor.white10, + child: Checkbox( + fillColor: MaterialStateProperty.all(AppColor.primary10), + side: BorderSide(color: AppColor.icon2Color(context).withValues(alpha: .3), width: 1.0), + checkColor: AppColor.white10, + value: check, + onChanged: null, + activeColor: AppColor.blueStatus(context), + // side: BorderSide(color: AppColor.loadingColor(context), width: 1.0), + visualDensity: const VisualDensity(horizontal: -4.0, vertical: -4.0), + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + ), + ), + 12.width, + InfoTextLabelWidget(label: description), + ], + ); + } + Future _resetPassword(BuildContext context) async { - if (!_formKey.currentState!.validate()) return; - _formKey.currentState?.save(); - if (newPassword != confirmPassword) { - Fluttertoast.showToast(msg: 'Password not matched try again'); - } else { - UserProvider userProvider = Provider.of(context, listen: false); - UpdatePasswordModel updatePasswordModel = - UpdatePasswordModel(password: newPassword, confirmPassword: confirmPassword, userId: userProvider.verifyOtpModel.userId, token: userProvider.verifyOtpModel.token); - GeneralResponseModel generalResponseModel = await userProvider.updateNewPassword(context: context, updatePasswordModel: updatePasswordModel); - if (generalResponseModel.isSuccess == true) { - newPassword = ''; - confirmPassword = ''; - Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); - } + // if (!_formKey.currentState!.validate()) return; + // _formKey.currentState?.save(); + // if (newPassword != confirmPassword) { + // Fluttertoast.showToast(msg: 'Password not matched try again'); + // } else { + UserProvider userProvider = Provider.of(context, listen: false); + UpdatePasswordModel updatePasswordModel = + UpdatePasswordModel(password: newPassword, confirmPassword: confirmPassword, userId: userProvider.verifyOtpModel.userId, token: userProvider.verifyOtpModel.token); + GeneralResponseModel generalResponseModel = await userProvider.updateNewPassword(context: context, updatePasswordModel: updatePasswordModel); + if (generalResponseModel.isSuccess == true) { + newPassword = ''; + confirmPassword = ''; + Navigator.of(context).pushNamedAndRemoveUntil(LoginPage.routeName, (routes) => true); } + // } } } diff --git a/lib/new_views/pages/login_page.dart b/lib/new_views/pages/login_page.dart index 89ebabfd..30f7d165 100644 --- a/lib/new_views/pages/login_page.dart +++ b/lib/new_views/pages/login_page.dart @@ -16,7 +16,7 @@ import 'package:test_sa/models/new_models/general_response_model.dart'; import 'package:test_sa/modules/cx_module/chat/chat_page.dart'; import 'package:test_sa/modules/cx_module/survey/survey_page.dart'; import 'package:test_sa/modules/signup/screens/signup_screen.dart'; -import 'package:test_sa/modules/applicationDemo/screens/demo_request_form_screen.dart'; +import 'package:test_sa/modules/applicationDemo/screens/application_demo_request_form_screen.dart'; import 'package:test_sa/new_views/app_style/app_color.dart'; import 'package:test_sa/new_views/forget_password_module/forget_passwod_verify_otp.dart'; import 'package:test_sa/new_views/pages/land_page/land_page.dart';