login_view_model.dart 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import 'package:flutter/material.dart';
  2. import 'package:provider/provider.dart';
  3. import '../../core/services/session_storage.dart';
  4. import '../../core/models/models.dart';
  5. import '../../core/services/services.dart';
  6. import 'package:bcrypt/bcrypt.dart';
  7. enum Status { uninitialized, authenticated, authenticating, unauthenticated }
  8. class LoginViewModel extends ChangeNotifier {
  9. Status _status = Status.uninitialized;
  10. Status get status => _status;
  11. bool hasErrors = false;
  12. Map<String, dynamic>? _errores = {};
  13. bool _obscureText = true;
  14. Usuario? _usuario;
  15. int? _idUsuario;
  16. bool _isLoading = true;
  17. bool get isLoading => _isLoading;
  18. bool get obscureText => _obscureText;
  19. // Getters
  20. Usuario? get usuario => _usuario;
  21. Map<String, dynamic>? get errores => _errores;
  22. Future<void> login(String correo, String contrasena) async {
  23. try {
  24. print("Iniciando proceso de login para: $correo");
  25. List<Usuario> usuarios = await DatabaseService<Usuario>().obtenerTodos();
  26. Usuario? usuario = usuarios.firstWhere(
  27. (usuario) => usuario.correo?.toLowerCase() == correo.toLowerCase(),
  28. orElse: () => Usuario(),
  29. );
  30. if (usuario.id != 0 && usuario.clave != null) {
  31. bool esContrasenaValida = BCrypt.checkpw(contrasena, usuario.clave!);
  32. if (esContrasenaValida) {
  33. _status = Status.authenticated;
  34. _errores = null;
  35. _idUsuario = usuario.id;
  36. await SessionStorage().saveId(_idUsuario!);
  37. notifyListeners();
  38. } else {
  39. _errores = {'contrasena': 'Contraseña incorrecta'};
  40. _status = Status.unauthenticated;
  41. notifyListeners();
  42. }
  43. } else {
  44. _errores = {'correo': 'El correo no existe en el sistema'};
  45. _status = Status.unauthenticated;
  46. notifyListeners();
  47. }
  48. } catch (e) {
  49. print("Error durante el proceso de login: $e");
  50. _status = Status.unauthenticated;
  51. notifyListeners();
  52. }
  53. }
  54. Future<void> checkSession() async {
  55. _isLoading = true; // Inicia el estado de carga
  56. notifyListeners();
  57. int? idUsuarioGuardado = await SessionStorage().getId();
  58. if (idUsuarioGuardado != null) {
  59. print("Sesión encontrada para el ID de usuario: $idUsuarioGuardado");
  60. _idUsuario = idUsuarioGuardado;
  61. _status = Status.authenticated;
  62. } else {
  63. print("No se encontró ninguna sesión activa.");
  64. _status = Status.unauthenticated;
  65. }
  66. _isLoading = false;
  67. notifyListeners();
  68. }
  69. void logOut() async {
  70. print("Cerrando sesión...");
  71. _usuario = null;
  72. _idUsuario = null;
  73. _status = Status.unauthenticated;
  74. _errores = {};
  75. await SessionStorage().clearId();
  76. print("ID de usuario eliminado de SharedPreferences.");
  77. notifyListeners();
  78. }
  79. void showPassword() {
  80. _obscureText = !_obscureText;
  81. notifyListeners();
  82. }
  83. Future<void> showExitConfirmationDialog(context) async {
  84. final bool? confirm = await showDialog(
  85. context: context,
  86. builder: (ctx) {
  87. return AlertDialog(
  88. title: const Text('¿Cerrar sesión?'),
  89. content: const Text('¿Estás seguro de que quieres cerrar la sesión?'),
  90. actions: [
  91. TextButton(
  92. onPressed: () => Navigator.of(ctx).pop(false),
  93. child:
  94. const Text('Cancelar', style: TextStyle(color: Colors.red)),
  95. ),
  96. TextButton(
  97. onPressed: () async {
  98. Provider.of<LoginViewModel>(context, listen: false).logOut();
  99. Navigator.of(ctx).pop(true);
  100. },
  101. child: const Text('Aceptar'),
  102. ),
  103. ],
  104. );
  105. },
  106. );
  107. if (confirm == true) {
  108. Navigator.of(context).pushNamedAndRemoveUntil('login', (route) => false);
  109. }
  110. }
  111. }