diff --git a/lib/src/screens/login_email.dart b/lib/src/screens/login_email.dart index 85a0553..cee1499 100644 --- a/lib/src/screens/login_email.dart +++ b/lib/src/screens/login_email.dart @@ -154,20 +154,21 @@ class _LoginEmailScreenState extends State { child: TextFormField( controller: controller.email, decoration: InputDecoration( - enabledBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFECECEC)), - borderRadius: BorderRadius.all( - Radius.circular(50), - )), - focusedBorder: OutlineInputBorder( - borderSide: BorderSide(color: Color(0xFFECECEC)), - borderRadius: BorderRadius.all( - Radius.circular(50), - )), - hintText: 'Hello@gmail.com', - fillColor: Color.fromARGB(255, 239, 239, 239), - filled: true, - prefixIcon: Icon(Icons.email_outlined)), + enabledBorder: OutlineInputBorder( + borderSide: BorderSide(color: Color(0xFFECECEC)), + borderRadius: BorderRadius.all( + Radius.circular(50), + )), + focusedBorder: OutlineInputBorder( + borderSide: BorderSide(color: Color(0xFFECECEC)), + borderRadius: BorderRadius.all( + Radius.circular(50), + )), + hintText: 'Hello@gmail.com', + fillColor: Color.fromARGB(255, 239, 239, 239), + filled: true, + prefixIcon: Icon(Icons.email_outlined), + ), ), ), Padding( diff --git a/lib/src/screens/profile.dart b/lib/src/screens/profile.dart index bdc3171..5faefd9 100644 --- a/lib/src/screens/profile.dart +++ b/lib/src/screens/profile.dart @@ -22,21 +22,25 @@ class _ProfileScreenState extends State { File? imagen_to_upload; final uid = AuthenticationRepository.instance.getCurrentUserUid(); + bool _obscureText = true; final _formKey = GlobalKey(); final controller = Get.put(NameEmailCityController()); final _phoneNumberController = TextEditingController(); final _nameController = TextEditingController(); final _emailController = TextEditingController(); + final _passwordController = TextEditingController(); late final FirebaseAuth _auth; final FirebaseStorage storage = FirebaseStorage.instance; var photoTemp = ''; var _ciudad = '...'; var _photo = '...'; var _estado = '...'; + String? _email = ''; @override void initState() { super.initState(); + final uid = AuthenticationRepository.instance.getCurrentUserUid(); _auth = FirebaseAuth.instance; @@ -53,6 +57,8 @@ class _ProfileScreenState extends State { _emailController.text = currentUser.email!; } + _email = currentUser?.email; + if (_ciudad == '...') { AuthenticationRepository.instance .getCity(uid.toString()) @@ -147,7 +153,6 @@ class _ProfileScreenState extends State { } else { final imageData = await ref.getData(); if (imageData != null) { - // final widgetImage = Image.memory(imageData); final widgetImage = GestureDetector( onTap: () { _showChoiceDialog(context); @@ -216,19 +221,24 @@ class _ProfileScreenState extends State { String newName = _nameController.text.trim(); String newEmail = _emailController.text.trim(); + String newPassword = _passwordController.text.trim(); if (newName.isEmpty) { // Si el nuevo nombre está vacío, no lo actualizamos y mostramos un mensaje al usuario - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Ingrese un nombre válido')), + Get.snackbar( + 'Nombre Invalido', + 'Ingrese un nombre válido.', + snackPosition: SnackPosition.BOTTOM, ); return; } if (newEmail.isEmpty) { // Si el nuevo nombre está vacío, no lo actualizamos y mostramos un mensaje al usuario - ScaffoldMessenger.of(context).showSnackBar( - SnackBar(content: Text('Ingrese un email válido')), + Get.snackbar( + 'Correo Invalido', + 'Ingrese un email válido.', + snackPosition: SnackPosition.BOTTOM, ); return; } @@ -246,57 +256,17 @@ class _ProfileScreenState extends State { } if (currentUser?.email != newEmail) { - try { - // Enviar un correo electrónico de verificación al nuevo correo electrónico - await FirebaseAuth.instance.currentUser!.updateEmail(newEmail); - await FirebaseAuth.instance.currentUser!.sendEmailVerification(); - - // Esperar a que el usuario haga clic en el enlace de verificación enviado a su correo electrónico - await FirebaseAuth.instance.currentUser!.reload(); - while (!FirebaseAuth.instance.currentUser!.emailVerified) { - await Future.delayed(const Duration(seconds: 1)); - await FirebaseAuth.instance.currentUser!.reload(); - } - - // Actualiza los datos del usuario en tu base de datos - await FirebaseFirestore.instance.collection('users').doc(uid).update({ - 'email': newEmail, - }); - - print('Correo electrónico actualizado correctamente'); - } catch (e) { - AuthenticationRepository.instance.logout(); + if (newPassword.isNotEmpty) { + updateEmailAndPassword(newEmail, newPassword); + } else { + Get.snackbar( + 'Contraseña Invalida', + 'Porfavor ingrese una contraseña.', + snackPosition: SnackPosition.BOTTOM, + ); } } - // if (currentUser?.email != newEmail) { - // AuthCredential credential = - // EmailAuthProvider.credential(email: newEmail, password: ''); - // try { - // await FirebaseAuth.instance.currentUser!.updateEmail(newEmail); - // await FirebaseFirestore.instance.collection('users').doc(uid).update({ - // 'email': newEmail, - // }); - // print('Correo electrónico actualizado correctamente'); - - // // Reautentica al usuario con las credenciales proporcionadas - // await FirebaseAuth.instance.currentUser! - // .reauthenticateWithCredential(credential); - - // // Actualiza el correo electrónico del usuario - // await FirebaseAuth.instance.currentUser!.updateEmail(newEmail); - - // // Actualiza los datos del usuario en tu base de datos - // await FirebaseFirestore.instance.collection('users').doc(uid).update({ - // 'email': newEmail, - // }); - - // print('Correo electrónico actualizado correctamente'); - // } catch (e) { - // print('Error al actualizar el correo electrónico: $e'); - // } - // } - try { if (imagen_to_upload == null) { return; @@ -310,6 +280,23 @@ class _ProfileScreenState extends State { } } + Future updateEmailAndPassword(String email, String password) async { + final User? user = FirebaseAuth.instance.currentUser; + if (user != null) { + try { + await user.updateEmail(email); + await user.updatePassword(password); + } catch (e) { + Get.snackbar( + 'Agregar correo', + 'Inicie sesión para asegurarnos de que seas tú .', + snackPosition: SnackPosition.BOTTOM, + ); + AuthenticationRepository.instance.logout(); + } + } + } + Future _showChoiceDialog(BuildContext context) async { return showDialog( context: context, @@ -358,7 +345,6 @@ class _ProfileScreenState extends State { @override Widget build(BuildContext context) { final User? user = FirebaseAuth.instance.currentUser; - String city = _ciudad.toString(); String state = _estado.toString(); @@ -409,23 +395,53 @@ class _ProfileScreenState extends State { children: [ TextFormField( controller: _nameController, - decoration: InputDecoration( + decoration: const InputDecoration( prefixIcon: Icon(Icons.person_outline), hintText: 'Nombre (Obligatorio)'), ), - SizedBox( - height: - 20.0), // Agrega espacio vertical entre los TextFormFields - - TextFormField( - controller: _emailController, - decoration: InputDecoration( - prefixIcon: Icon(Icons.email_outlined), - hintText: 'Email (Obligatorio)'), - ), - SizedBox( + const SizedBox( height: 20.0), // Agrega espacio vertical entre los TextFormFields + _email != null + ? TextFormField( + readOnly: true, + controller: _emailController, + decoration: const InputDecoration( + prefixIcon: Icon(Icons.email_outlined), + hintText: 'Email (Obligatorio)'), + ) + : TextFormField( + controller: _emailController, + decoration: const InputDecoration( + prefixIcon: Icon(Icons.email_outlined), + hintText: 'Email (Obligatorio)'), + ), + const SizedBox(height: 20.0), + _email != null + ? const SizedBox.shrink() + : TextFormField( + controller: _passwordController, + obscureText: _obscureText, + decoration: InputDecoration( + prefixIcon: const Icon(Icons.lock_outline), + suffixIcon: IconButton( + icon: Icon( + _obscureText + ? Icons.visibility_off + : Icons.visibility, + color: Colors.grey, + ), + onPressed: () { + setState(() { + _obscureText = !_obscureText; + }); + }, + ), + hintText: 'Contraseña (Obligatorio)'), + ), + _email != null + ? const SizedBox.shrink() + : const SizedBox(height: 20.0), TextFormField( readOnly: true, onTap: () async { @@ -445,15 +461,9 @@ class _ProfileScreenState extends State { hintStyle: city == '' ? TextStyle() : TextStyle(color: Colors.black87), - hintText: city == '' - ? 'Profesión (Obligatorio)' - : '$city'), - // hintText: city == '' ? 'Ciudad' : '$city', + hintText: city == '' ? 'Ciudad' : '$city'), ), - - SizedBox( - height: - 20.0), // Agrega espacio vertical entre los TextFormFields + const SizedBox(height: 20.0), TextFormField( controller: _phoneNumberController, readOnly: true, @@ -470,10 +480,10 @@ class _ProfileScreenState extends State { ), Container( alignment: Alignment.bottomCenter, - margin: EdgeInsets.only(top: 170), + margin: EdgeInsets.only(top: 100), child: ElevatedButton( - onPressed: () { - updateInfo(); + onPressed: () async { + await updateInfo(); }, child: Text( 'Guardar',