bug fixes

export_module_ui_ux_enhancement_signup
WaseemAbbasi22 1 month ago
parent 359c796b72
commit 5137f2dd34

@ -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';

@ -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),
);
}

@ -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

@ -12,12 +12,13 @@ class DefaultAppBar extends StatelessWidget implements PreferredSizeWidget {
final String? title;
final List<Widget>? 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)

@ -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<ForgetPasswordVerifyOtpVie
String otpMethodValue = widget.data['typeSend'] == "SMS" ? widget.data['phoneNumber']["phoneNumber"] : widget.data["phoneNumber"]['email'];
return Scaffold(
appBar: const DefaultAppBar(
title: '',
backgroundColor: Colors.transparent,
),
body: Column(
children: [
SingleChildScrollView(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisAlignment: MainAxisAlignment.center,
// mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Text(context.translation.otpVerification, style: AppTextStyles.heading2.copyWith(color: AppColor.headingTextColor(context), fontWeight: FontWeight.w500)),
8.height,
@ -139,13 +147,17 @@ class _ForgetPasswordVerifyOtpViewState extends State<ForgetPasswordVerifyOtpVie
],
),
).center.expanded,
AppFilledButton(
label: context.translation.verify,
maxWidth: true,
onPressed: verifyOtp,
FooterActionButton.footerContainer(
safeAreaTop: false,
context: context,
child: AppFilledButton(
label: context.translation.verify,
maxWidth: true,
onPressed: verifyOtp,
),
),
],
).paddingOnly(start: 20, end: 20, bottom: 16),
),
);
}

@ -7,9 +7,11 @@ 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/models/new_models/update_password.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/app_text_form_field.dart';
import 'package:test_sa/new_views/common_widgets/default_app_bar.dart';
import 'package:test_sa/new_views/pages/login_page.dart';
import 'package:test_sa/views/widgets/item_views/info_header_widget.dart';
import 'package:test_sa/views/widgets/item_views/info_text_widget.dart';
@ -40,9 +42,14 @@ class _ResetPasswordViewState extends State<ResetPasswordView> {
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<ResetPasswordView> {
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<ResetPasswordView> {
_passwordVisible = !_passwordVisible;
});
}),
onSaved: (value) {
newPassword = value;
},
// onSaved: (value) {
//
// newPassword = value;
// },
),
16.height,
AppTextFormField(
@ -77,45 +89,108 @@ class _ResetPasswordViewState extends State<ResetPasswordView> {
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<void> _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<UserProvider>(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<UserProvider>(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);
}
// }
}
}

@ -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';

Loading…
Cancel
Save