Files
AppRecoleccion/lib/services/auth_service.dart
2026-05-22 20:43:49 -06:00

80 lines
2.9 KiB
Dart

import 'package:flutter/foundation.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../models/models.dart';
import '../database/db_helper.dart';
class AuthService extends ChangeNotifier {
UserModel? _user;
DomicilioModel? _primaryDomicilio;
List<DomicilioModel> _allDomicilios = [];
bool _loading = true;
UserModel? get currentUser => _user;
DomicilioModel? get primaryDomicilio => _primaryDomicilio;
List<DomicilioModel> get allDomicilios => _allDomicilios;
bool get isLoggedIn => _user != null;
bool get loading => _loading;
String get rol => _user?.rol ?? '';
AuthService() { _checkSession(); }
Future<void> _checkSession() async {
final p = await SharedPreferences.getInstance();
final id = p.getInt('user_id');
if (id != null) {
_user = await DbHelper.getUserById(id);
if (_user?.rol == 'CIUDADANO') await reloadDomicilios();
}
_loading = false;
notifyListeners();
}
Future<void> reloadDomicilios() async {
if (_user == null) return;
_allDomicilios = await DbHelper.getDomiciliosByUser(_user!.id!);
_primaryDomicilio = _allDomicilios.isNotEmpty
? _allDomicilios.firstWhere((d) => d.isPrimary,
orElse: () => _allDomicilios.first)
: null;
notifyListeners();
}
Future<String?> login(String email, String password) async {
final user = await DbHelper.getUserByEmail(email.trim().toLowerCase());
if (user == null) return 'Correo no registrado';
if (user.password != password) return 'Contraseña incorrecta';
_user = user;
if (user.rol == 'CIUDADANO') await reloadDomicilios();
final p = await SharedPreferences.getInstance();
await p.setInt('user_id', user.id!);
notifyListeners();
return null;
}
Future<String?> register({required String nombre, required String email,
required String password, required String calle, required String colonia,
required String routeId, required String horarioEstimado}) async {
final ex = await DbHelper.getUserByEmail(email.trim().toLowerCase());
if (ex != null) return 'Correo ya registrado';
final user = UserModel(nombre:nombre.trim(),
email:email.trim().toLowerCase(), password:password, rol:'CIUDADANO');
final uid = await DbHelper.insertUser(user);
await DbHelper.insertDomicilio(DomicilioModel(userId:uid, alias:'Casa',
calle:calle.trim(), colonia:colonia, routeId:routeId,
horarioEstimado:horarioEstimado, isPrimary:true));
_user = await DbHelper.getUserById(uid);
await reloadDomicilios();
final p = await SharedPreferences.getInstance();
await p.setInt('user_id', uid);
notifyListeners();
return null;
}
Future<void> logout() async {
_user = null; _primaryDomicilio = null; _allDomicilios = [];
final p = await SharedPreferences.getInstance();
await p.remove('user_id');
notifyListeners();
}
}