123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- import 'package:flutter/material.dart';
- import 'package:provider/provider.dart';
- import '../../core/services/session_storage.dart';
- import '../../core/models/models.dart';
- import '../../core/services/services.dart';
- import 'package:bcrypt/bcrypt.dart';
- enum Status { uninitialized, authenticated, authenticating, unauthenticated }
- class LoginViewModel extends ChangeNotifier {
- Status _status = Status.uninitialized;
- Status get status => _status;
- bool hasErrors = false;
- Map<String, dynamic>? _errores = {};
- bool _obscureText = true;
- Usuario? _usuario;
- int? _idUsuario;
- bool _isLoading = true;
- bool get isLoading => _isLoading;
- bool get obscureText => _obscureText;
- // Getters
- Usuario? get usuario => _usuario;
- Map<String, dynamic>? get errores => _errores;
- Future<void> login(String correo, String contrasena) async {
- try {
- print("Iniciando proceso de login para: $correo");
- List<Usuario> usuarios = await DatabaseService<Usuario>().obtenerTodos();
- Usuario? usuario = usuarios.firstWhere(
- (usuario) => usuario.correo?.toLowerCase() == correo.toLowerCase(),
- orElse: () => Usuario(),
- );
- if (usuario.id != 0 && usuario.clave != null) {
- bool esContrasenaValida = BCrypt.checkpw(contrasena, usuario.clave!);
- if (esContrasenaValida) {
- _status = Status.authenticated;
- _errores = null;
- _idUsuario = usuario.id;
- await SessionStorage().saveId(_idUsuario!);
- notifyListeners();
- } else {
- _errores = {'contrasena': 'Contraseña incorrecta'};
- _status = Status.unauthenticated;
- notifyListeners();
- }
- } else {
- _errores = {'correo': 'El correo no existe en el sistema'};
- _status = Status.unauthenticated;
- notifyListeners();
- }
- } catch (e) {
- print("Error durante el proceso de login: $e");
- _status = Status.unauthenticated;
- notifyListeners();
- }
- }
- Future<void> checkSession() async {
- _isLoading = true; // Inicia el estado de carga
- notifyListeners();
- int? idUsuarioGuardado = await SessionStorage().getId();
- if (idUsuarioGuardado != null) {
- print("Sesión encontrada para el ID de usuario: $idUsuarioGuardado");
- _idUsuario = idUsuarioGuardado;
- _status = Status.authenticated;
- } else {
- print("No se encontró ninguna sesión activa.");
- _status = Status.unauthenticated;
- }
- _isLoading = false;
- notifyListeners();
- }
- void logOut() async {
- print("Cerrando sesión...");
- _usuario = null;
- _idUsuario = null;
- _status = Status.unauthenticated;
- _errores = {};
- await SessionStorage().clearId();
- print("ID de usuario eliminado de SharedPreferences.");
- notifyListeners();
- }
- void showPassword() {
- _obscureText = !_obscureText;
- notifyListeners();
- }
- Future<void> showExitConfirmationDialog(context) async {
- final bool? confirm = await showDialog(
- context: context,
- builder: (ctx) {
- return AlertDialog(
- title: const Text('¿Cerrar sesión?'),
- content: const Text('¿Estás seguro de que quieres cerrar la sesión?'),
- actions: [
- TextButton(
- onPressed: () => Navigator.of(ctx).pop(false),
- child:
- const Text('Cancelar', style: TextStyle(color: Colors.red)),
- ),
- TextButton(
- onPressed: () async {
- Provider.of<LoginViewModel>(context, listen: false).logOut();
- Navigator.of(ctx).pop(true);
- },
- child: const Text('Aceptar'),
- ),
- ],
- );
- },
- );
- if (confirm == true) {
- Navigator.of(context).pushNamedAndRemoveUntil('login', (route) => false);
- }
- }
- }
|