login_view_model.dart 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import 'package:flutter/material.dart';
  2. import '../data/session/session_storage.dart';
  3. import '../models/models.dart';
  4. import '../services/login_service.dart';
  5. import '../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. // Getters
  19. Usuario? get usuario => _usuario;
  20. Map<String, dynamic>? get errores => _errores;
  21. Future<void> login(String correo, String contrasena) async {
  22. try {
  23. print("Iniciando proceso de login para: $correo");
  24. List<Usuario> usuarios = await RepoService<Usuario>().obtenerTodos();
  25. Usuario? usuario = usuarios.firstWhere(
  26. (usuario) => usuario.correo?.toLowerCase() == correo.toLowerCase(),
  27. orElse: () => Usuario(),
  28. );
  29. if (usuario.id != 0 && usuario.clave != null) {
  30. bool esContrasenaValida = BCrypt.checkpw(contrasena, usuario.clave!);
  31. if (esContrasenaValida) {
  32. _status = Status.authenticated;
  33. _errores = null;
  34. _idUsuario = usuario.id;
  35. await SessionStorage().saveId(_idUsuario!);
  36. notifyListeners();
  37. } else {
  38. _errores = {'contrasena': 'Contraseña incorrecta'};
  39. _status = Status.unauthenticated;
  40. notifyListeners();
  41. }
  42. } else {
  43. _errores = {'correo': 'El correo no existe en el sistema'};
  44. _status = Status.unauthenticated;
  45. notifyListeners();
  46. }
  47. } catch (e) {
  48. print("Error durante el proceso de login: $e");
  49. _status = Status.unauthenticated;
  50. notifyListeners();
  51. }
  52. }
  53. Future<void> checkSession() async {
  54. _isLoading = true; // Inicia el estado de carga
  55. notifyListeners();
  56. int? idUsuarioGuardado = await SessionStorage().getId();
  57. if (idUsuarioGuardado != null) {
  58. print("Sesión encontrada para el ID de usuario: $idUsuarioGuardado");
  59. _idUsuario = idUsuarioGuardado;
  60. _status = Status.authenticated;
  61. } else {
  62. print("No se encontró ninguna sesión activa.");
  63. _status = Status.unauthenticated;
  64. }
  65. _isLoading = false;
  66. notifyListeners();
  67. }
  68. void logOut() async {
  69. print("Cerrando sesión...");
  70. _usuario = null;
  71. _idUsuario = null;
  72. _status = Status.unauthenticated;
  73. _errores = {};
  74. await SessionStorage().clearId();
  75. print("ID de usuario eliminado de SharedPreferences.");
  76. notifyListeners();
  77. }
  78. void showPassword() {
  79. _obscureText = !_obscureText;
  80. notifyListeners();
  81. }
  82. }