Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added password change dialog #258

Merged
merged 1 commit into from
Aug 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions lib/new_ui/screens/profile_screen/profile_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import 'package:tsec_app/models/student_model/student_model.dart';
import 'package:tsec_app/models/user_model/user_model.dart';
import 'package:tsec_app/new_ui/colors.dart';
import 'package:tsec_app/new_ui/screens/profile_screen/widgets/address_text_field.dart';
import 'package:tsec_app/new_ui/screens/profile_screen/widgets/change_password_dialog.dart';
import 'package:tsec_app/new_ui/screens/profile_screen/widgets/faculty_field.dart';
import 'package:tsec_app/new_ui/screens/profile_screen/widgets/phone_no_field.dart';
import 'package:tsec_app/new_ui/screens/profile_screen/widgets/profile_dropdown_field.dart';
Expand Down Expand Up @@ -788,6 +789,11 @@ class _ProfilePageState extends ConsumerState<ProfilePage> {
),
),
),
TextButton(onPressed: (){
showDialog(context: context, builder: (contextOfDialog){
return ChangePasswordDialog(ctx1: context,);
});
}, child: Text("Change password", style: TextStyle(color: Colors.blueAccent),))
],
),
)
Expand Down
136 changes: 136 additions & 0 deletions lib/new_ui/screens/profile_screen/widgets/change_password_dialog.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:riverpod/riverpod.dart';
import 'package:tsec_app/provider/auth_provider.dart';

class ChangePasswordDialog extends ConsumerWidget {
ChangePasswordDialog({super.key, required this.ctx1});
BuildContext ctx1;

final TextEditingController oldPasswordController = TextEditingController();

final TextEditingController newPasswordController = TextEditingController();

final TextEditingController confirmPasswordController = TextEditingController();

String? validatePassword(){
if(newPasswordController.text != confirmPasswordController.text){
return "Passwords do not match";
}
return null;
}

@override
Widget build(BuildContext context, WidgetRef ref) {
final _formKey = GlobalKey<FormState>();
return AlertDialog(
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(15),
),
title: Text('Change Password'),
content: Container(
//padding: const EdgeInsets.all(16),
child: Form(
autovalidateMode: AutovalidateMode.onUserInteraction,
key: _formKey,
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
// Text(
// 'Change Password',
// style: Theme.of(context).textTheme.headlineSmall,
// ),
const SizedBox(height: 16),
TextFormField(
style: TextStyle(color: Colors.white),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter some text';
}
return null;
},
obscureText: true,
controller: oldPasswordController,
decoration: InputDecoration(
errorStyle: TextStyle(fontSize: 12),
focusColor: Colors.red,
fillColor: Colors.transparent,
border: OutlineInputBorder(borderRadius: BorderRadius.circular(10)),
labelText: 'Old Password',
),
),
const SizedBox(height: 16),
TextFormField(
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter some text';
}
if(value != confirmPasswordController.text){
return "Passwords do not match";
}
return null;
},
style: TextStyle(color: Colors.white),
obscureText: true,
controller: newPasswordController,
decoration: InputDecoration(
errorStyle: TextStyle(fontSize: 12),
focusColor: Colors.red,
fillColor: Colors.transparent,
border: OutlineInputBorder(borderRadius: BorderRadius.circular(10)),
labelText: 'New Password',
errorText: validatePassword()
),
),
const SizedBox(height: 16),
TextFormField(
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter some text';
}
if(value != newPasswordController.text){
return "Passwords do not match";
}
return null;
},
style: TextStyle(color: Colors.white),
obscureText: true,
controller: confirmPasswordController,
decoration: InputDecoration(
errorStyle: TextStyle(fontSize: 12),
focusColor: Colors.red,
fillColor: Colors.transparent,
border: OutlineInputBorder(borderRadius: BorderRadius.circular(10)),
labelText: 'Confirm Password',
errorText: validatePassword(),
),

),
const SizedBox(height: 16),
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('Cancel'),
),
TextButton(
onPressed: () {
if(_formKey.currentState!.validate()){
ref.watch(authProvider.notifier).changePassword(oldPasswordController.text, newPasswordController.text, ctx1);
Navigator.of(context).pop();
}
},
child: Text('Change'),
),
],
),
],
),
),
),
);
}
}
6 changes: 5 additions & 1 deletion lib/provider/auth_provider.dart
Original file line number Diff line number Diff line change
Expand Up @@ -106,10 +106,14 @@ class AuthProvider extends StateNotifier<bool> {
return await _authService.fetchUserDetails(user, context);
}

void changePassword(String password, BuildContext context) {
void updatePassword(String password, BuildContext context) {
_authService.updatePassword(password, context);
}

void changePassword(String oldPass, String newPass, BuildContext context) {
_authService.changePassword(oldPass, newPass, context);
}

Future getUserData(WidgetRef ref, BuildContext context) async {
//this is being called on both splash and login screen
final user = _ref.watch(firebaseAuthProvider).currentUser;
Expand Down
2 changes: 1 addition & 1 deletion lib/screens/login_screen/widgets/custom_dialog_box.dart
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ class _ChangePasswordDialogState extends ConsumerState<ChangePasswordDialog> {
child: ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
ref.watch(authProvider.notifier).changePassword(
ref.watch(authProvider.notifier).updatePassword(
_passwordTextEditingController.text.trim(),
context);
GoRouter.of(context).go('/main');
Expand Down
14 changes: 14 additions & 0 deletions lib/services/auth_service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,20 @@ class AuthService {
await firebaseAuth.sendPasswordResetEmail(email: email);
}

void changePassword(String oldPass, String newPass, BuildContext context){
User user = firebaseAuth.currentUser!;
final credential = EmailAuthProvider.credential(email: user.email!, password: oldPass);
user.reauthenticateWithCredential(credential).then((value) {
user.updatePassword(newPass).then((_) {
showSnackBar(context, "Password updated successfully");
}).catchError((error) {
showSnackBar(context, "An error occurred while updating password");
});
}).catchError((error) {
showSnackBar(context, "An error occurred while updating password");
});
}

void updatePassword(String password, BuildContext context) async {
User user = firebaseAuth.currentUser!;
await user.updatePassword(password);
Expand Down
Loading