Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 8 additions & 13 deletions lib/config/router.dart → lib/config/routes/router.dart
Original file line number Diff line number Diff line change
@@ -1,20 +1,19 @@
import 'package:flutter/material.dart';
import 'package:get/route_manager.dart';
import 'package:mi_utem/config/routes.dart';
import 'package:mi_utem/screens/asignatura_detalle_screen.dart';
import 'package:mi_utem/screens/asignaturas_lista_screen.dart';
import 'package:mi_utem/config/routes/routes.dart';
import 'package:mi_utem/controllers/asignaturas_controller.dart';
import 'package:mi_utem/controllers/qr_passes_controller.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/screens/asignatura/asignatura_detalle_screen.dart';
import 'package:mi_utem/screens/asignatura/asignaturas_lista_screen.dart';
import 'package:mi_utem/screens/calculadora_notas_screen.dart';
import 'package:mi_utem/screens/credencial_screen.dart';
import 'package:mi_utem/screens/horario/horario_screen.dart';
import 'package:mi_utem/screens/login_screen/login_screen.dart';
import 'package:mi_utem/screens/main_screen.dart';
import 'package:mi_utem/screens/main/main_screen.dart';
import 'package:mi_utem/screens/permiso_covid_screen.dart';
import 'package:mi_utem/screens/splash_screen.dart';
import 'package:mi_utem/screens/usuario_screen.dart';
import 'package:mi_utem/services/auth_service.dart';
import 'package:mi_utem/services/perfil_service.dart';
import 'package:mi_utem/widgets/acerca_screen.dart';

final _loginPage = GetPage(
Expand All @@ -26,11 +25,7 @@ final _loginPage = GetPage(
final _homePage = GetPage(
name: Routes.home,
bindings: [QrPassesBinding()],
page: () {
final usuario = PerfilService.getLocalUsuario();

return MainScreen(usuario: usuario);
},
page: () => MainScreen(),
middlewares: [OnlyAuthMiddleware()],
);

Expand Down Expand Up @@ -86,7 +81,7 @@ final pages = <GetPage>[
class OnlyAuthMiddleware extends GetMiddleware {
@override
RouteSettings? redirect(String? page) {
final isLoggedIn = AuthService.isLoggedIn();
final isLoggedIn = UserController.to.isLoggedIn;
if (!isLoggedIn) {
return const RouteSettings(name: Routes.login);
}
Expand All @@ -97,7 +92,7 @@ class OnlyAuthMiddleware extends GetMiddleware {
class OnlyNoAuthMiddleware extends GetMiddleware {
@override
RouteSettings? redirect(String? page) {
final isLoggedIn = AuthService.isLoggedIn();
final isLoggedIn = UserController.to.isLoggedIn;
if (isLoggedIn) {
return const RouteSettings(name: Routes.home);
}
Expand Down
File renamed without changes.
8 changes: 4 additions & 4 deletions lib/controllers/asignatura_controller.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import 'package:get/get.dart';
import 'package:mi_utem/controllers/carreras_controller.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/models/asignatura.dart';
import 'package:mi_utem/models/carrera.dart';
import 'package:mi_utem/models/grades.dart';
Expand All @@ -19,13 +19,13 @@ class AsignaturaController extends GetxController with StateMixin<Asignatura> {

@override
void onInit() {
_selectedCarrera = Get.find<CarrerasController>().selectedCarrera.value;
_selectedCarrera = Get.find<UserController>().selectedCarrera.value;
if (_selectedCarrera != null) {
getAsignaturaDetail(Get.find<CarrerasController>().selectedCarrera.value);
getAsignaturaDetail(Get.find<UserController>().selectedCarrera.value);
}

ever<Carrera?>(
Get.find<CarrerasController>().selectedCarrera,
Get.find<UserController>().selectedCarrera,
(carrera) {
_selectedCarrera = carrera;
getAsignaturaDetail(carrera, forceRefresh: true);
Expand Down
10 changes: 5 additions & 5 deletions lib/controllers/asignaturas_controller.dart
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import 'package:get/get.dart';
import 'package:mi_utem/controllers/asignatura_controller.dart';
import 'package:mi_utem/controllers/carreras_controller.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/models/asignatura.dart';
import 'package:mi_utem/models/carrera.dart';
import 'package:mi_utem/services/asignaturas_service.dart';
Expand All @@ -11,12 +11,12 @@ class AsignaturasController extends GetxController
void onInit() {
change(null, status: RxStatus.loading());

if (Get.find<CarrerasController>().selectedCarrera.value != null) {
getAsignaturas(Get.find<CarrerasController>().selectedCarrera.value);
if (Get.find<UserController>().selectedCarrera.value != null) {
getAsignaturas(Get.find<UserController>().selectedCarrera.value);
}

ever<Carrera?>(
Get.find<CarrerasController>().selectedCarrera,
Get.find<UserController>().selectedCarrera,
(carrera) => getAsignaturas(carrera, forceRefresh: true),
);
super.onInit();
Expand Down Expand Up @@ -54,7 +54,7 @@ class AsignaturasController extends GetxController
}

void refreshAsignaturas() {
final carrera = Get.find<CarrerasController>().selectedCarrera.value;
final carrera = Get.find<UserController>().selectedCarrera.value;
getAsignaturas(carrera, forceRefresh: true);
}
}
Expand Down
18 changes: 12 additions & 6 deletions lib/controllers/carreras_controller.dart
Original file line number Diff line number Diff line change
@@ -1,25 +1,31 @@
import 'package:get/get.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/models/carrera.dart';
import 'package:mi_utem/models/usuario.dart';
import 'package:mi_utem/services/analytics_service.dart';
import 'package:mi_utem/services/carreras_service.dart';

class CarrerasController extends GetxController {
final carreras = <Carrera>[].obs;
final selectedCarrera = Rxn<Carrera>();

class CarrerasController extends GetxController with StateMixin<List<Carrera>> {
static CarrerasController get to => Get.find();

@override
void onInit() {
getCarreras();

ever<Usuario?>(
Get.find<UserController>().user,
(carrera) => getCarreras(),
);

super.onInit();
}

void getCarreras() async {
change(null, status: RxStatus.loading());

final carreras = await CarreraService.getCarreras(forceRefresh: true);

this.carreras.value = carreras;
change(carreras, status: RxStatus.success());
_autoSelectCarreraActiva(carreras);
}

Expand All @@ -43,6 +49,6 @@ class CarrerasController extends GetxController {
}

void changeSelectedCarrera(Carrera carrera) {
selectedCarrera.value = carrera;
UserController.to.selectCarrera(carrera);
}
}
7 changes: 3 additions & 4 deletions lib/controllers/grades_changes_controller.dart
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
import 'dart:developer';

import 'package:get_storage/get_storage.dart';
import 'package:mi_utem/controllers/carreras_controller.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/models/asignatura.dart';
import 'package:mi_utem/models/grades.dart';
import 'package:mi_utem/services/asignaturas_service.dart';
import 'package:mi_utem/services/auth_service.dart';
import 'package:mi_utem/services/grades_service.dart';
import 'package:mi_utem/services/notification_service.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
Expand Down Expand Up @@ -141,10 +140,10 @@ class GradesChangesController {
}

static Future<Map<String, GradeChangeType>> checkIfGradesHasChange() async {
final isLogged = AuthService.isLoggedIn();
final isLogged = UserController.to.isLoggedIn;

if (isLogged) {
final carrera = CarrerasController.to.selectedCarrera.value;
final carrera = UserController.to.selectedCarrera.value;
final carreraId = carrera?.id;

if (carreraId != null) {
Expand Down
8 changes: 4 additions & 4 deletions lib/controllers/horario_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'dart:developer';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:mi_utem/controllers/carreras_controller.dart';
import 'package:mi_utem/controllers/user_controller.dart';
import 'package:mi_utem/models/asignatura.dart';
import 'package:mi_utem/models/carrera.dart';
import 'package:mi_utem/models/horario.dart';
Expand Down Expand Up @@ -85,12 +85,12 @@ class HorarioController extends GetxController {

@override
onInit() {
if (Get.find<CarrerasController>().selectedCarrera.value != null) {
getHorarioData(Get.find<CarrerasController>().selectedCarrera.value);
if (Get.find<UserController>().selectedCarrera.value != null) {
getHorarioData(Get.find<UserController>().selectedCarrera.value);
}

ever<Carrera?>(
Get.find<CarrerasController>().selectedCarrera,
Get.find<UserController>().selectedCarrera,
(carrera) => getHorarioData(carrera),
);
_init();
Expand Down
2 changes: 1 addition & 1 deletion lib/controllers/notification_controller.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:awesome_notifications/awesome_notifications.dart';
import 'package:awesome_notifications_fcm/awesome_notifications_fcm.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:mi_utem/config/routes.dart';
import 'package:mi_utem/config/routes/routes.dart';
import 'package:mi_utem/models/asignatura.dart';
import 'package:mi_utem/services/analytics_service.dart';

Expand Down
154 changes: 154 additions & 0 deletions lib/controllers/user_controller.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,154 @@
import 'dart:convert';

import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:get/get.dart';
import 'package:get_storage/get_storage.dart';
import 'package:mi_utem/controllers/carreras_controller.dart';
import 'package:mi_utem/models/carrera.dart';
import 'package:mi_utem/models/usuario.dart';
import 'package:mi_utem/services/analytics_service.dart';
import 'package:mi_utem/services/auth_service.dart';
import 'package:mi_utem/services/perfil_service.dart';

class UserController extends GetxController {
static const _storageTokenKey = 'token';
static const _storageUserKey = 'user';
static const _storageFirstTimeKey = 'esAntiguo';
static const _storagePasswordKey = 'contrasenia';

static final GetStorage _box = GetStorage();
static final FlutterSecureStorage _secureStorage = FlutterSecureStorage();

static UserController get to => Get.find();

final user = Rxn<Usuario>(null);
final selectedCarrera = Rxn<Carrera>();

List<Role> get roles {
final roles = <Role>[];

if (user.value != null) {
final carreras = CarrerasController.to.state;
if (carreras != null && carreras.length > 0) {
roles.add(Role.hasCareers);
final hasActive = carreras.firstWhereOrNull((c) => c.isActive) != null;

if (hasActive) {
roles.add(Role.hasActiveCareer);
}
}
}
return roles;
}

@override
void onInit() {
super.onInit();

final user = _getStoredUser();
if (user != null) {
this.user.value = user;
}

ever(this.user, (Usuario? user) {
if (UserController.to.isLoggedIn && user != null) {
AnalyticsService.setUser(user);
} else {
AnalyticsService.removeUser();
}
});
}

Future<Usuario> login(String correo, String contrasenia) async {
try {
final user = await AuthService.login(correo, contrasenia);

_box.write(_storageFirstTimeKey, true);

_storeCredentials(user, contrasenia);
_storeUser(user);

return user;
} catch (e) {
throw e;
}
}

bool get isFirstTime {
return _box.read(_storageFirstTimeKey).toString() == 'true';
}

bool get isLoggedIn {
return user.value != null;
}

Future<void> logOut() async {
try {
invalidateToken();
_box.remove(_storageUserKey);
await _secureStorage.deleteAll();
try {
await PerfilService.deleteFcmToken();
} catch (e) {}
user.value = null;
} catch (e) {
print(e.toString());
throw e;
}
}

Future<String> refreshToken() async {
try {
final email = user.value?.correoUtem;
final password = await _secureStorage.read(key: _storagePasswordKey);

if (email != null && password != null) {
final token = await AuthService.refreshToken(email, password);
_storeToken(token);

return token;
}
throw Exception("No se pudo refrescar el token");
} catch (e) {
print(e.toString());
rethrow;
}
}

void _storeUser(Usuario userToStore) async {
user.value = userToStore;

_box.write(_storageUserKey, jsonEncode(userToStore.toJson()));
}

static void _storeCredentials(Usuario user, String contrasenia) async {
_box.write(_storageTokenKey, user.token);
await _secureStorage.write(key: _storagePasswordKey, value: contrasenia);
}

Usuario? _getStoredUser() {
final user = _box.read(_storageUserKey);
if (user == null) return null;

return Usuario.fromJson(jsonDecode(user));
}

static void _storeToken(String token) async {
_box.write(_storageTokenKey, token);
}

String getToken() {
final token = _box.read(_storageTokenKey);
if (token == null) throw Exception("No se ha encontrado el token");

return token;
}

void invalidateToken() async {
_box.remove(_storageTokenKey);
}

void selectCarrera(Carrera carrera) {
selectedCarrera.value = carrera;
}
}
Loading