This commit is contained in:
Felipe
2023-11-11 18:13:58 -05:00
parent f732d461d0
commit 24f0d80e32
15 changed files with 1439 additions and 194 deletions
+177 -113
View File
@@ -13,9 +13,13 @@ import 'package:prosappco/src/presentation/widgets/profile/birth_date_picker.dar
import 'package:prosappco/src/presentation/screens/city.dart';
import 'package:prosappco/src/presentation/screens/new_number.dart';
import 'package:prosappco/src/presentation/screens/new_password.dart';
import 'package:prosappco/src/presentation/widgets/shared/primary_checkbox.dart';
import 'package:prosappco/src/presentation/widgets/shared/warning_snackbar.dart';
import 'package:prosappco/src/providers/user_provider.dart';
import 'package:prosappco/src/services/select_image_profile.dart';
import 'package:prosappco/src/presentation/widgets/profile/gender_dropdown.dart';
import 'package:prosappco/src/presentation/widgets/shared/primary_button.dart';
import 'package:provider/provider.dart';
import '../../../components/photo_view.dart';
class ProfileScreen extends StatefulWidget {
@@ -275,13 +279,15 @@ class _ProfileScreenState extends State<ProfileScreen> {
return;
}
if (newEmail.isEmpty) {
Get.snackbar(
'Correo Invalido',
'Ingresa un email válido.',
snackPosition: SnackPosition.BOTTOM,
);
return;
if (enableLoginWithEmail) {
if (newEmail.isEmpty) {
Get.snackbar(
'Correo Invalido',
'Ingresa un email válido.',
snackPosition: SnackPosition.BOTTOM,
);
return;
}
}
if (currentUser?.displayName != newName) {
@@ -296,18 +302,29 @@ class _ProfileScreenState extends State<ProfileScreen> {
}
}
if (currentUser?.email != newEmail) {
if (newPassword.isNotEmpty) {
await FirebaseFirestore.instance.collection('users').doc(uid).update({
'email': newEmail,
});
updateEmailAndPassword(newEmail, newPassword);
} else {
Get.snackbar(
'Contraseña Invalida',
'Porfavor ingresa una contraseña.',
snackPosition: SnackPosition.BOTTOM,
);
if (enableLoginWithEmail) {
if (currentUser?.email != newEmail) {
if (newPassword.isNotEmpty) {
bool updateEmailSuccess =
await updateEmailAndPassword(newEmail, newPassword);
if (updateEmailSuccess) {
await FirebaseFirestore.instance
.collection('users')
.doc(uid)
.update({
'email': newEmail,
});
} else {
return;
}
} else {
Get.snackbar(
'Contraseña Invalida',
'Por favor ingresa una contraseña.',
snackPosition: SnackPosition.BOTTOM,
);
}
}
}
@@ -320,18 +337,8 @@ class _ProfileScreenState extends State<ProfileScreen> {
print('e');
}
try {
await FirebaseFirestore.instance
.collection('users')
.doc(uid)
.update({'email': newEmail});
} catch (e) {
print('Error al actualizar la imagen de perfil $e');
}
try {
if (imagen_to_upload == null) {
return;
} else {
final uploaded = await uploadImage(imagen_to_upload!);
updateImage(photoTemp);
@@ -341,10 +348,14 @@ class _ProfileScreenState extends State<ProfileScreen> {
print('Error al actualizar la imagen de perfil $e');
}
Get.snackbar(
'Informacion actualizada',
'Tu informacion ha sido actualizada con exito.',
snackPosition: SnackPosition.BOTTOM,
WarningSnackbar.show(
title: 'Informacion actualizada',
message: 'Tu informacion ha sido actualizada con exito.',
icon: const Icon(
Icons.check,
color: Colors.white,
),
backgroundColor: Colors.green,
);
}
@@ -401,19 +412,23 @@ class _ProfileScreenState extends State<ProfileScreen> {
_email = newEmail;
});
Get.snackbar(
'Éxito',
'Correo electrónico actualizado correctamente.',
snackPosition: SnackPosition.BOTTOM,
WarningSnackbar.show(
title: 'Actualizado exitosamente',
message: 'Correo electronico actualizado correctamente.',
icon: const Icon(Icons.check, color: Colors.white),
backgroundColor: Colors.green,
);
Navigator.of(context).pop();
if (Navigator.canPop(context)) {
Navigator.of(context).pop();
}
} catch (e) {
Get.snackbar(
'No se pudo actualizar el correo',
'Verifica tu contraseña actual y asegúrate de que el nuevo correo electrónico no se haya utilizado previamente.',
snackPosition: SnackPosition.BOTTOM,
WarningSnackbar.show(
title: 'No se pudo actualizar el correo',
message:
'Verifica tu contraseña actual y asegúrate de que el nuevo correo electrónico no se haya utilizado previamente.',
);
print('Error al actualizar el correo electrónico: $e');
}
}
@@ -472,23 +487,26 @@ class _ProfileScreenState extends State<ProfileScreen> {
);
}
Future<void> updateEmailAndPassword(String email, String password) async {
Future<bool> updateEmailAndPassword(String email, String password) async {
final User? user = FirebaseAuth.instance.currentUser;
if (user != null) {
try {
await user.updateEmail(email);
await user.updatePassword(password);
return true;
} catch (e) {
Get.snackbar(
'Agregar correo',
'Inicia sesión para asegurarnos de que seas tú.',
snackPosition: SnackPosition.BOTTOM,
);
// AuthenticationRepository.instance.logout(uid!);
WarningSnackbar.show(
title: 'Inicia sesión de nuevo',
message:
'Para agregar un correo debes haber iniciado sesión recientemente.');
}
}
return false;
}
bool enableLoginWithEmail = false;
Future<void> _showChoiceDialog(BuildContext context) async {
return showDialog(
context: context,
@@ -538,6 +556,8 @@ class _ProfileScreenState extends State<ProfileScreen> {
Widget build(BuildContext context) {
String city = _ciudad.toString();
final userProvider = Provider.of<UserProvider>(context);
return Scaffold(
appBar: PopAppbar(
onPressed: () {
@@ -582,70 +602,7 @@ class _ProfileScreenState extends State<ProfileScreen> {
prefixIcon: Icon(Icons.person_outline),
hintText: 'Nombre (Obligatorio)'),
),
const SizedBox(height: 0),
_email != null
? TextFormField(
onTap: () {
_showEmailUpdateDialog(context);
},
readOnly: true,
controller: _emailController,
decoration: const InputDecoration(
prefixIcon: Icon(Icons.email_outlined),
hintText: 'Email (Obligatorio)'),
)
: TextFormField(
controller: _emailController,
validator: (String? value) {
if (value == null || value.isEmpty) {
return 'Por favor ingrese un email';
}
final RegExp emailRegExp =
RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$');
if (!emailRegExp.hasMatch(value)) {
return 'Por favor ingrese un email válido';
}
return null;
},
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,
validator: (value) {
if (value == null || value.isEmpty) {
return 'Porfavor ingrese una contraseña.';
}
if (value.length < 5) {
return 'Debe tener al menos 5 caracteres.';
}
return null;
},
decoration: InputDecoration(
prefixIcon: const Icon(Icons.lock_outline),
suffixIcon: IconButton(
icon: Icon(
_obscureText
? Icons.visibility
: Icons.visibility_off,
color: Colors.grey,
),
onPressed: () {
setState(() {
_obscureText = !_obscureText;
});
},
),
hintText: 'Contraseña (Obligatorio)'),
),
_email != null
? const SizedBox.shrink()
: const SizedBox(height: 20.0),
const SizedBox(),
TextFormField(
readOnly: true,
onTap: () async {
@@ -719,6 +676,111 @@ class _ProfileScreenState extends State<ProfileScreen> {
),
)
: const SizedBox(),
_email != null
? TextFormField(
onTap: () {
_showEmailUpdateDialog(context);
},
readOnly: true,
controller: _emailController,
decoration: const InputDecoration(
prefixIcon: Icon(Icons.email_outlined),
hintText: 'Email (Obligatorio)'),
)
: const SizedBox(),
const SizedBox(height: 20),
_email == null
? PrimaryCheckbox(
text:
'Habilitar inicio de sesión con correo (Opcional)',
initialValue: enableLoginWithEmail,
onChanged: (value) {
setState(() {
enableLoginWithEmail = value;
});
},
)
: const SizedBox(),
const SizedBox(height: 15),
enableLoginWithEmail
? Container(
decoration: BoxDecoration(
border: Border.all(
color: Colors.blue,
width: 0.5,
),
borderRadius: BorderRadius.circular(10),
),
padding: const EdgeInsets.all(10),
child: Column(
children: [
TextFormField(
controller: _emailController,
validator: (String? value) {
if (enableLoginWithEmail) {
if (value == null || value.isEmpty) {
return 'Por favor ingrese un email';
}
final RegExp emailRegExp = RegExp(
r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$');
if (!emailRegExp.hasMatch(value)) {
return 'Por favor ingrese un email válido';
}
return null;
} else {
return null;
}
},
decoration: const InputDecoration(
prefixIcon: Icon(Icons.email_outlined),
hintText: 'Email'),
),
const SizedBox(height: 20.0),
_email != null
? const SizedBox.shrink()
: TextFormField(
controller: _passwordController,
obscureText: _obscureText,
validator: (value) {
if (enableLoginWithEmail) {
if (value == null ||
value.isEmpty) {
return 'Por favor ingrese una contraseña.';
}
if (value.length < 5) {
return 'Debe tener al menos 5 caracteres.';
}
return null;
} else {
return null;
}
},
decoration: InputDecoration(
prefixIcon: const Icon(
Icons.lock_outline),
suffixIcon: IconButton(
icon: Icon(
_obscureText
? Icons.visibility
: Icons.visibility_off,
color: Colors.grey,
),
onPressed: () {
setState(() {
_obscureText =
!_obscureText;
});
},
),
hintText: 'Contraseña'),
),
_email != null
? const SizedBox.shrink()
: const SizedBox(height: 20),
],
),
)
: const SizedBox(),
],
),
),
@@ -752,6 +814,8 @@ class _ProfileScreenState extends State<ProfileScreen> {
if (_formKey.currentState!.validate()) {
await updateInfo();
}
await userProvider.updateUserDataAndScores();
},
text: 'Guardar',
),