Files
authsec_flutter/lib/screens/profileManagement/changepassword.dart
T

327 lines
12 KiB
Dart

import 'dart:convert';
import 'package:flutter/material.dart';
import '../../Utils/image_constant.dart';
import '../../Utils/size_utils.dart';
import '../../l10n/app_localizations.dart';
import '../../providers/token_manager.dart';
import '../../resources/api_constants.dart';
import 'package:http/http.dart' as http;
import '../../theme/app_style.dart';
import '../../widgets/app_bar/appbar_image.dart';
import '../../widgets/app_bar/appbar_title.dart';
import '../../widgets/app_bar/custom_app_bar.dart';
import '../../widgets/custom_button.dart';
import '../../widgets/custom_text_form_field.dart';
import '../Login Screen/login_screen.dart';
import '../LogoutService/Logoutservice.dart';
class ResetPasswordScreen extends StatelessWidget {
final String userEmail;
final Map<String, dynamic> userData;
ResetPasswordScreen({required this.userEmail,required this.userData});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar:
CustomAppBar(
height: getVerticalSize(49),
leadingWidth: 40,
leading: AppbarImage(
height: getSize(24),
width: getSize(24),
svgPath: ImageConstant.imgArrowleftBlueGray900,
margin: getMargin(left: 16, top: 12, bottom: 13),
onTap: () {
Navigator.pop(context);
}),
centerTitle: true,
title: AppbarTitle(
text: AppLocalizations.of(context)!.resetPassword)),
body: SingleChildScrollView(
padding: EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Text(
AppLocalizations.of(context)!.signedInAs(userEmail),
style: AppStyle.txtGilroyMedium16Bluegray800
),
const SizedBox(height: 20),
ResetPasswordForm(userData: userData,userEmail: userEmail),
const SizedBox(height: 20),
GestureDetector(
onTap: () {
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) => const LoginScreen()),
(route) => false, // Remove all routes from the stack
);
},
child: Text(
AppLocalizations.of(context)!.wrongAccount,
style: AppStyle.txtGreenSemiBold16,
),
),
],
),
),
);
}
}
class ResetPasswordForm extends StatefulWidget {
final String userEmail;
final Map<String, dynamic> userData;
const ResetPasswordForm({super.key, required this.userEmail,required this.userData});
@override
_ResetPasswordFormState createState() => _ResetPasswordFormState();
}
class _ResetPasswordFormState extends State<ResetPasswordForm> {
final TextEditingController oldPasswordController = TextEditingController();
final TextEditingController newPasswordController = TextEditingController();
final TextEditingController reEnterNewPasswordController =
TextEditingController();
var responseMessage;
var isVisible=false;
bool issuccess = false;
bool isOldPasswordVisible = false;
bool isNewPasswordVisible = false;
bool isReEnterNewPasswordVisible = false;
bool _isPasswordValid1 = true;
void _validatePassword1(String password) {
setState(() {
_isPasswordValid1 = password.isNotEmpty;
});
}
bool _isPasswordValid2 = true;
void _validatePassword2(String password) {
setState(() {
_isPasswordValid2 = password.isNotEmpty;
});
}
bool _isPasswordValid3 = true;
void _validatePassword3(String password) {
setState(() {
_isPasswordValid3 = password.isNotEmpty&&password==newPasswordController.text;
});
}
@override
Widget build(BuildContext context) {
return Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
isVisible?Text(responseMessage,style: TextStyle(
color: issuccess?Colors.green:Colors.red, // Set the text color to red
)):const Text(''),
Padding(
padding: getPadding(top: 19),
child: Text(AppLocalizations.of(context)!.enterOldPassword,
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.left,
style:
AppStyle.txtGilroyMedium16Bluegray900)),
CustomTextFormField(
focusNode: FocusNode(),
controller: oldPasswordController,
hintText:
AppLocalizations.of(context)!.enterOldPassword,
margin: getMargin(top: 6),
errorText:
_isPasswordValid1 ? null : AppLocalizations.of(context)!.oldPasswordError,
padding: TextFormFieldPadding.PaddingT12,
textInputAction: TextInputAction.done,
onChanged: _validatePassword1,
validator: (value) {
if (value!.isEmpty) {
return AppLocalizations.of(context)!.oldPasswordError;
}
return null; // Return null to indicate no error
},
textInputType:TextInputType.visiblePassword,
suffix: IconButton(
icon: Icon(
isOldPasswordVisible ? Icons.visibility : Icons.visibility_off,
),
onPressed: () {
setState(() {
isOldPasswordVisible = !isOldPasswordVisible;
});
},
),
suffixConstraints: BoxConstraints(
maxHeight: getVerticalSize(44)),
isObscureText: !isOldPasswordVisible),
Padding(
padding: getPadding(top: 19),
child: Text(AppLocalizations.of(context)!.enterNewPassword,
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.left,
style:
AppStyle.txtGilroyMedium16Bluegray900)),
CustomTextFormField(
focusNode: FocusNode(),
controller: newPasswordController,
hintText:
AppLocalizations.of(context)!.enterNewPassword,
margin: getMargin(top: 6),
padding: TextFormFieldPadding.PaddingT12,
textInputAction: TextInputAction.done,
suffix: IconButton(
icon: Icon(
isNewPasswordVisible ? Icons.visibility : Icons.visibility_off,
),
onPressed: () {
setState(() {
isNewPasswordVisible = !isNewPasswordVisible;
});
},
),
errorText:
_isPasswordValid2 ? null : AppLocalizations.of(context)!.newPasswordError,
onChanged: _validatePassword2,
validator: (value) {
if (value!.isEmpty) {
return AppLocalizations.of(context)!.newPasswordError;
}
return null;
},
suffixConstraints: BoxConstraints(
maxHeight: getVerticalSize(44)),
isObscureText:!isNewPasswordVisible,),
Padding(
padding: getPadding(top: 19),
child: Text(
AppLocalizations.of(context)!.reEnterNewPassword,
overflow: TextOverflow.ellipsis,
textAlign: TextAlign.left,
style:
AppStyle.txtGilroyMedium16Bluegray900)),
CustomTextFormField(
focusNode: FocusNode(),
controller: reEnterNewPasswordController,
hintText:
AppLocalizations.of(context)!.reEnterNewPassword,
margin: getMargin(top: 6),
padding: TextFormFieldPadding.PaddingT12,
onChanged: _validatePassword3,
validator: (value) {
if (value!.isEmpty) {
return AppLocalizations.of(context)!.reEnterPasswordError;
}
if (value != newPasswordController.text) {
return AppLocalizations.of(context)!.passwordsDontMatch;
}
return null;
},
suffix: IconButton(
icon: Icon(
isReEnterNewPasswordVisible
? Icons.visibility
: Icons.visibility_off,
),
onPressed: () {
setState(() {
isReEnterNewPasswordVisible = !isReEnterNewPasswordVisible;
});
},
),
errorText:
_isPasswordValid3 ? null : AppLocalizations.of(context)!.reEnterPasswordError,
textInputAction: TextInputAction.done,
suffixConstraints: BoxConstraints(
maxHeight: getVerticalSize(44)),
isObscureText:!isReEnterNewPasswordVisible,),
CustomButton(
height: getVerticalSize(50),
text: AppLocalizations.of(context)!.continueBtn,
margin: getMargin(top: 24, bottom: 5),
onTap: () async {
if (oldPasswordController.text.isEmpty ||
newPasswordController.text.isEmpty ||
reEnterNewPasswordController.text.isEmpty) {
print(oldPasswordController.text);
print(newPasswordController.text);
print(reEnterNewPasswordController.text);
} else {
Map<String, dynamic> passwordData = {
"userId":widget.userData['userId'],
"oldPassword": oldPasswordController.text,
"newPassword": newPasswordController.text,
"confirmPassword": reEnterNewPasswordController.text,
};
final token = await TokenManager.getToken();
final String baseUrl = ApiConstants.baseUrl;
final String apiUrl = '$baseUrl/api/reset_password';
try {
final response = await http.post(Uri.parse(apiUrl),
headers: {
'Authorization': 'Bearer $token',
'Content-Type': 'application/json',
},
body: json.encode(passwordData));
if(response.statusCode==401){
LogoutService.logout();
}
if (response.statusCode <= 209) {
setState(() {
isVisible=true;
issuccess=true;
responseMessage = AppLocalizations.of(context)!
.passwordChangedSuccess;
});
print("success");
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (context) => LoginScreen()),
(route) => false,
);
} else {
setState(() {
isVisible=true;
responseMessage = AppLocalizations.of(context)!
.incorrectPassword;
});
print(response.statusCode);
}
} catch (e) {
throw Exception('Failed to Update: $e');
}
}
},
),
],
);
}
@override
void dispose() {
oldPasswordController.dispose();
newPasswordController.dispose();
reEnterNewPasswordController.dispose();
super.dispose();
}
}