login_view_model.dart 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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. 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 RepoService<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. }