From 31aa77027a02bcbef09cb0f98b58a02d2e200915 Mon Sep 17 00:00:00 2001 From: Jorge Verdugo Date: Sat, 14 Oct 2023 18:25:55 -0300 Subject: [PATCH 1/8] Se mueve todo a un UserController --- lib/config/router.dart | 13 +- .../grades_changes_controller.dart | 4 +- lib/controllers/user_controller.dart | 121 ++++++++++++++++ lib/main.dart | 14 +- lib/models/usuario.dart | 28 ++-- lib/screens/credencial_screen.dart | 4 +- lib/screens/login_screen/login_screen.dart | 8 +- lib/screens/usuario_screen.dart | 3 +- lib/services/asignaturas_service.dart | 6 +- lib/services/auth_service.dart | 133 ++---------------- lib/services/carreras_service.dart | 4 +- lib/services/grades_service.dart | 4 +- lib/services/horarios_service.dart | 4 +- lib/services/perfil_service.dart | 37 +---- lib/services/permisos_covid_service.dart | 6 +- lib/utils/dio_miutem_client.dart | 8 +- lib/widgets/custom_drawer.dart | 4 +- pubspec.lock | 2 +- 18 files changed, 193 insertions(+), 210 deletions(-) create mode 100644 lib/controllers/user_controller.dart diff --git a/lib/config/router.dart b/lib/config/router.dart index 2826c2b..e56718b 100644 --- a/lib/config/router.dart +++ b/lib/config/router.dart @@ -1,10 +1,11 @@ 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/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_detalle_screen.dart'; +import 'package:mi_utem/screens/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'; @@ -13,8 +14,6 @@ import 'package:mi_utem/screens/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( @@ -27,7 +26,7 @@ final _homePage = GetPage( name: Routes.home, bindings: [QrPassesBinding()], page: () { - final usuario = PerfilService.getLocalUsuario(); + final usuario = UserController.to.getUser(); return MainScreen(usuario: usuario); }, @@ -86,7 +85,7 @@ final pages = [ 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); } @@ -97,7 +96,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); } diff --git a/lib/controllers/grades_changes_controller.dart b/lib/controllers/grades_changes_controller.dart index 0be8fb7..a6d80e1 100644 --- a/lib/controllers/grades_changes_controller.dart +++ b/lib/controllers/grades_changes_controller.dart @@ -2,10 +2,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'; @@ -141,7 +141,7 @@ class GradesChangesController { } static Future> checkIfGradesHasChange() async { - final isLogged = AuthService.isLoggedIn(); + final isLogged = UserController.to.isLoggedIn; if (isLogged) { final carrera = CarrerasController.to.selectedCarrera.value; diff --git a/lib/controllers/user_controller.dart b/lib/controllers/user_controller.dart new file mode 100644 index 0000000..9906f5a --- /dev/null +++ b/lib/controllers/user_controller.dart @@ -0,0 +1,121 @@ +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/models/usuario.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(); + + Future login(String correo, String contrasenia) async { + try { + final user = await AuthService.login(correo, contrasenia); + + if (user.token != null) { + _box.write(_storageTokenKey, user.token!); + } + + _box.write(_storageFirstTimeKey, true); + + await _secureStorage.write(key: _storagePasswordKey, value: contrasenia); + + _storeUser(user); + + return user; + } catch (e) { + throw e; + } + } + + bool get isFirstTime { + return _box.read(_storageFirstTimeKey).toString() == 'true'; + } + + bool get isLoggedIn { + try { + String? token = _box.read(_storageTokenKey); + Usuario? user = _getUser(); + + return token != null && token.isNotEmpty && user != null; + } catch (e) { + return false; + } + } + + Future logOut() async { + try { + _box.remove(_storageTokenKey); + _box.remove(_storageUserKey); + await _secureStorage.deleteAll(); + try { + await PerfilService.deleteFcmToken(); + } catch (e) {} + } catch (e) { + print(e.toString()); + throw e; + } + } + + Future refreshToken() async { + try { + final user = getUser(); + final email = user.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; + } + } + + static void _storeUser(Usuario user) async { + _box.write(_storageUserKey, jsonEncode(user.toJson())); + } + + Usuario getUser() { + final user = _getUser(); + if (user == null) throw Exception("No se ha encontrado el usuario"); + + return user; + } + + Usuario? _getUser() { + final user = _box.read(_storageUserKey); + if (user == null) return null; + + return Usuario.fromJson(jsonDecode(user)); + } + + static void _storeToken(String token) async { + _box.write('token', token); + } + + String getToken() { + final token = _box.read('token'); + if (token == null) throw Exception("No se ha encontrado el token"); + + return token; + } + + void invalidateToken() async { + _box.remove('token'); + } +} diff --git a/lib/main.dart b/lib/main.dart index e48103c..fffedc9 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -11,13 +11,10 @@ import 'package:get_storage/get_storage.dart'; import 'package:mi_utem/config/constants.dart'; import 'package:mi_utem/config/router.dart'; import 'package:mi_utem/config/routes.dart'; -import 'package:mi_utem/controllers/calculator_controller.dart'; import 'package:mi_utem/controllers/carreras_controller.dart'; -import 'package:mi_utem/services/analytics_service.dart'; -import 'package:mi_utem/services/auth_service.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/services/background_service.dart'; import 'package:mi_utem/services/notification_service.dart'; -import 'package:mi_utem/services/perfil_service.dart'; import 'package:mi_utem/themes/theme.dart'; import 'package:responsive_framework/responsive_framework.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; @@ -52,18 +49,18 @@ class MiUtem extends StatefulWidget { class _MiUtemState extends State { final FirebaseAnalytics analytics = FirebaseAnalytics.instance; - final calculatorController = Get.put(CalculatorController()); +/* final calculatorController = Get.put(CalculatorController()); @override void initState() { - if (AuthService.isLoggedIn()) { - final user = PerfilService.getLocalUsuario(); + if (UserController.to.isLoggedIn) { + final user = UserController.to.getUser(); AnalyticsService.setUser(user); } else { AnalyticsService.removeUser(); } super.initState(); - } + } */ @override Widget build(BuildContext context) { @@ -81,6 +78,7 @@ class _MiUtemState extends State { debugShowCheckedModeBanner: false, title: 'Mi UTEM', initialBinding: BindingsBuilder(() { + Get.put(UserController(), permanent: true); Get.put(CarrerasController(), permanent: true); }), theme: MainTheme.theme, diff --git a/lib/models/usuario.dart b/lib/models/usuario.dart index 66d0dd3..9f7df1e 100644 --- a/lib/models/usuario.dart +++ b/lib/models/usuario.dart @@ -1,6 +1,12 @@ import 'package:mi_utem/models/rut.dart'; import 'package:recase/recase.dart'; +enum Role { + hasCareers, + hasActiveCareer, + hasLunchBenefit, +} + class Usuario { String? nombre; String? nombres; @@ -10,16 +16,19 @@ class Usuario { String? token; String? fotoUrl; Rut? rut; + List roles; - Usuario( - {this.correoUtem, - this.correoPersonal, - this.token, - this.nombres, - this.nombre, - this.fotoUrl, - this.apellidos, - this.rut}); + Usuario({ + this.correoUtem, + this.correoPersonal, + this.token, + this.nombres, + this.nombre, + this.fotoUrl, + this.apellidos, + this.rut, + this.roles = const [], + }); factory Usuario.fromJson(Map? json) { if (json == null) { @@ -99,7 +108,6 @@ class Usuario { 'nombreCompleto': nombreCompleto, 'correoUtem': correoUtem, 'correoPersonal': correoPersonal, - 'token': token, 'fotoUrl': fotoUrl, 'nombres': nombres, 'apellidos': apellidos, diff --git a/lib/screens/credencial_screen.dart b/lib/screens/credencial_screen.dart index 998afc1..b5ef925 100644 --- a/lib/screens/credencial_screen.dart +++ b/lib/screens/credencial_screen.dart @@ -2,10 +2,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_windowmanager/flutter_windowmanager.dart'; import 'package:mdi/mdi.dart'; import 'package:mi_utem/controllers/carreras_controller.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/perfil_service.dart'; import 'package:mi_utem/services/review_service.dart'; import 'package:mi_utem/widgets/credencial_card.dart'; import 'package:mi_utem/widgets/custom_app_bar.dart'; @@ -51,7 +51,7 @@ class _CredencialScreenState extends State { Future _getData() async { try { - Usuario usuario = PerfilService.getLocalUsuario(); + Usuario usuario = UserController.to.getUser(); setState(() { _usuario = usuario; }); diff --git a/lib/screens/login_screen/login_screen.dart b/lib/screens/login_screen/login_screen.dart index a05fd7b..e610d52 100644 --- a/lib/screens/login_screen/login_screen.dart +++ b/lib/screens/login_screen/login_screen.dart @@ -9,10 +9,10 @@ import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:get/get.dart'; import 'package:mi_utem/config/routes.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/helpers/snackbars.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/remote_config/remote_config.dart'; import 'package:mi_utem/widgets/acerca_dialog.dart'; import 'package:mi_utem/widgets/dialogs/monkey_error_dialog.dart'; @@ -245,8 +245,8 @@ class _LoginScreenState extends State { ); try { - bool esPrimeraVez = await AuthService.esPrimeraVez(); - Usuario usuario = await AuthService.login(correo, contrasenia, true); + bool isFirstTime = UserController.to.isFirstTime; + Usuario usuario = await UserController.to.login(correo, contrasenia); AnalyticsService.logEvent('login'); AnalyticsService.setUser(usuario); @@ -255,7 +255,7 @@ class _LoginScreenState extends State { Routes.home, ); - if (esPrimeraVez) { + if (isFirstTime) { Get.dialog( AcercaDialog(), ); diff --git a/lib/screens/usuario_screen.dart b/lib/screens/usuario_screen.dart index 33e7fdc..ca54983 100644 --- a/lib/screens/usuario_screen.dart +++ b/lib/screens/usuario_screen.dart @@ -4,6 +4,7 @@ import 'package:clipboard/clipboard.dart'; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:mi_utem/config/routes.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/models/asignatura.dart'; import 'package:mi_utem/models/usuario.dart'; import 'package:mi_utem/services/docentes_service.dart'; @@ -58,7 +59,7 @@ class _UsuarioScreenState extends State { _usuario = usuario; }); } else { - usuario = PerfilService.getLocalUsuario(); + usuario = UserController.to.getUser(); setState(() { _usuario = usuario; }); diff --git a/lib/services/asignaturas_service.dart b/lib/services/asignaturas_service.dart index 9bb7352..144151b 100644 --- a/lib/services/asignaturas_service.dart +++ b/lib/services/asignaturas_service.dart @@ -1,8 +1,8 @@ import 'package:dio/dio.dart'; import 'package:dio_http_cache/dio_http_cache.dart'; import 'package:get_storage/get_storage.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/models/asignatura.dart'; -import 'package:mi_utem/services/perfil_service.dart'; import 'package:mi_utem/utils/dio_miutem_client.dart'; class AsignaturasService { @@ -14,7 +14,7 @@ class AsignaturasService { bool forceRefresh = false, }) async { final uri = "/v1/carreras/$carreraId/asignaturas"; - final user = PerfilService.getLocalUsuario(); + final user = UserController.to.getUser(); try { Response response = await _dio.get( @@ -40,7 +40,7 @@ class AsignaturasService { bool forceRefresh = false, }) async { final uri = "/v1/asignaturas/$codigo"; - final user = PerfilService.getLocalUsuario(); + final user = UserController.to.getUser(); try { Response response = await _dio.get( diff --git a/lib/services/auth_service.dart b/lib/services/auth_service.dart index 29d756f..d9f393f 100644 --- a/lib/services/auth_service.dart +++ b/lib/services/auth_service.dart @@ -1,150 +1,37 @@ import 'package:dio/dio.dart'; -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:get_storage/get_storage.dart'; import 'package:mi_utem/models/usuario.dart'; -import 'package:mi_utem/services/perfil_service.dart'; import 'package:mi_utem/utils/dio_miutem_client.dart'; class AuthService { static final Dio _dio = DioMiUtemClient.initDio; static final GetStorage box = GetStorage(); - static Future login(String? correo, String? contrasenia, - [bool guardar = false]) async { - String uri = "/v1/auth"; + static Future login(String correo, String contrasenia) async { + final uri = "/v1/auth"; try { - final FlutterSecureStorage storage = new FlutterSecureStorage(); + final data = {'correo': correo, 'contrasenia': contrasenia}; + final response = await _dio.post(uri, data: data); - dynamic data = {'correo': correo, 'contrasenia': contrasenia}; - - Response response = await _dio.post(uri, data: data); - - Usuario usuario = Usuario(); - if (response.statusCode == 200) { - usuario = Usuario.fromJson(response.data); - box.write('token', usuario.token!); - if (usuario.nombres != null) { - box.write('nombres', usuario.nombres!); - } - if (usuario.apellidos != null) { - box.write('apellidos', usuario.apellidos!); - } - if (usuario.nombre != null) { - box.write('nombre', usuario.nombre!); - } - if (usuario.fotoUrl != null) { - box.write('fotoUrl', usuario.fotoUrl!); - } - if (usuario.correoUtem != null) { - box.write('correoUtem', usuario.correoUtem!); - } - if (usuario.correoPersonal != null) { - box.write('correoPersonal', usuario.correoPersonal!); - } - if (usuario.rut?.numero != null) { - box.write('rut', usuario.rut!.numero!); - } - box.write('esAntiguo', true); - - if (guardar) { - await storage.write(key: "contrasenia", value: contrasenia); - } - } - return usuario; - } on DioError catch (e) { - print(e.message); - throw e; + return Usuario.fromJson(response.data); } catch (e) { throw e; } } - static Future esPrimeraVez() async { - try { - bool? esAntiguo = box.read("esAntiguo"); - if (esAntiguo == null) { - return true; - } else { - return !esAntiguo; - } - } catch (e) { - print(e); - return false; - } - } + static Future refreshToken(String correo, String contrasenia) async { + final uri = "/v1/auth/refresh"; - static bool isLoggedIn() { try { - String? token = box.read("token"); - bool isLoggedIn = token != null && token.isNotEmpty; + final data = {'correo': correo, 'contrasenia': contrasenia}; - return isLoggedIn; - } catch (e) { - print(e); - return false; - } - } - - static Future logOut() async { - try { - final FlutterSecureStorage storage = new FlutterSecureStorage(); + final response = await DioMiUtemClient.authDio.post(uri, data: data); - box.remove("token"); - box.remove("correo"); - box.remove("nombres"); - box.remove("nombre"); - box.remove("apellidos"); - box.remove("fotoUrl"); - box.remove("rut"); - await storage.deleteAll(); - try { - await PerfilService.deleteFcmToken(); - } catch (e) {} - } catch (e) { - print(e.toString()); - throw e; - } - } - - static Future refreshToken() async { - String uri = "/v1/auth/refresh"; - - try { - final FlutterSecureStorage secureStorage = new FlutterSecureStorage(); - - String? correo = box.read("correoUtem"); - String? contrasenia = await secureStorage.read(key: "contrasenia"); - - if (correo != null && contrasenia != null) { - dynamic data = {'correo': correo, 'contrasenia': contrasenia}; - - Response response = await DioMiUtemClient.authDio.post(uri, data: data); - - String token = response.data['token']; - _storeToken(token); - - return token; - } - throw Exception("No se pudo refrescar el token"); + return response.data['token'] as String; } catch (e) { print(e.toString()); rethrow; } } - - static void _storeToken(String token) async { - box.write('token', token); - } - - static String getToken() { - final token = box.read('token'); - if (token == null) throw Exception("No se ha encontrado el token"); - - return token; - } - - static void invalidateToken() async { - box.remove('token'); - } } diff --git a/lib/services/carreras_service.dart b/lib/services/carreras_service.dart index 3326442..547756d 100644 --- a/lib/services/carreras_service.dart +++ b/lib/services/carreras_service.dart @@ -1,7 +1,7 @@ import 'package:dio/dio.dart'; import 'package:dio_http_cache/dio_http_cache.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/models/carrera.dart'; -import 'package:mi_utem/services/perfil_service.dart'; import 'package:mi_utem/utils/dio_miutem_client.dart'; class CarreraService { @@ -9,7 +9,7 @@ class CarreraService { static Future> getCarreras({bool forceRefresh = false}) async { const uri = "/v1/carreras"; - final user = PerfilService.getLocalUsuario(); + final user = UserController.to.getUser(); Response response = await _dio.get( uri, diff --git a/lib/services/grades_service.dart b/lib/services/grades_service.dart index 4d13597..33b46a7 100644 --- a/lib/services/grades_service.dart +++ b/lib/services/grades_service.dart @@ -2,8 +2,8 @@ import 'package:dio/dio.dart'; import 'package:dio_http_cache/dio_http_cache.dart'; import 'package:get_storage/get_storage.dart'; import 'package:mi_utem/controllers/grades_changes_controller.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/models/grades.dart'; -import 'package:mi_utem/services/perfil_service.dart'; import 'package:mi_utem/utils/dio_miutem_client.dart'; class GradesService { @@ -17,7 +17,7 @@ class GradesService { bool saveGrades = true, }) async { final uri = "/v1/carreras/$carreraId/asignaturas/$asignaturaId/notas"; - final user = PerfilService.getLocalUsuario(); + final user = UserController.to.getUser(); Response response = await _dio.get( uri, diff --git a/lib/services/horarios_service.dart b/lib/services/horarios_service.dart index b185f15..d2f52b0 100644 --- a/lib/services/horarios_service.dart +++ b/lib/services/horarios_service.dart @@ -1,8 +1,8 @@ import 'package:dio/dio.dart'; import 'package:dio_http_cache/dio_http_cache.dart'; import 'package:get_storage/get_storage.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/models/horario.dart'; -import 'package:mi_utem/services/perfil_service.dart'; import 'package:mi_utem/utils/dio_miutem_client.dart'; class HorarioService { @@ -14,7 +14,7 @@ class HorarioService { bool forceRefresh = false, }) async { final uri = "/v1/carreras/$carreraId/horarios"; - final user = PerfilService.getLocalUsuario(); + final user = UserController.to.getUser(); try { Response response = await _dio.get( diff --git a/lib/services/perfil_service.dart b/lib/services/perfil_service.dart index 7adfa25..e46977b 100644 --- a/lib/services/perfil_service.dart +++ b/lib/services/perfil_service.dart @@ -1,7 +1,7 @@ import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:dio/dio.dart'; import 'package:get_storage/get_storage.dart'; -import 'package:mi_utem/models/rut.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/models/usuario.dart'; import 'package:mi_utem/services/notification_service.dart'; import 'package:mi_utem/utils/dio_miutem_client.dart'; @@ -10,37 +10,6 @@ class PerfilService { static final Dio _dio = DioMiUtemClient.authDio; static final GetStorage box = GetStorage(); - static Usuario getLocalUsuario() { - try { - String? token = box.read("token"); - String? nombres = box.read("nombres"); - String? apellidos = box.read("apellidos"); - String? nombre = box.read("nombre"); - String? fotoUrl = box.read("fotoUrl"); - Rut? rut = box.read("rut") != null - ? (box.read("rut") is int - ? Rut.deEntero(box.read("rut")) - : Rut.deString(box.read("rut"))) - : null; - String? correoUtem = box.read("correoUtem"); - String? correoPersonal = box.read("correoPersonal"); - - return Usuario( - token: token, - nombres: nombres, - fotoUrl: fotoUrl, - nombre: nombre, - apellidos: apellidos, - rut: rut, - correoUtem: correoUtem, - correoPersonal: correoPersonal, - ); - } catch (e) { - print(e); - throw e; - } - } - static Future changeFoto(String imagen) async { String uri = "/v1/usuarios/foto"; @@ -53,7 +22,7 @@ class PerfilService { box.write('fotoUrl', fotoUrl); - Usuario usuario = getLocalUsuario(); + Usuario usuario = UserController.to.getUser(); return usuario; } on DioError catch (e) { @@ -88,7 +57,7 @@ class PerfilService { try { String? fcmToken = await NotificationService.fcm.requestFirebaseAppToken(); - Usuario usuario = PerfilService.getLocalUsuario(); + Usuario usuario = UserController.to.getUser(); CollectionReference usuariosCollection = FirebaseFirestore.instance.collection('usuarios'); diff --git a/lib/services/permisos_covid_service.dart b/lib/services/permisos_covid_service.dart index 7d6e89f..8b2bbbe 100644 --- a/lib/services/permisos_covid_service.dart +++ b/lib/services/permisos_covid_service.dart @@ -2,8 +2,8 @@ import 'package:dio/dio.dart'; import 'package:dio_http_cache/dio_http_cache.dart'; import 'package:get_storage/get_storage.dart'; import 'package:mi_utem/config/logger.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/models/permiso_covid.dart'; -import 'package:mi_utem/services/perfil_service.dart'; import 'package:mi_utem/utils/dio_miutem_client.dart'; class PermisosCovidService { @@ -14,7 +14,7 @@ class PermisosCovidService { {bool forceRefresh = false}) async { const uri = "/v1/permisos"; - final user = PerfilService.getLocalUsuario(); + final user = UserController.to.getUser(); logger.d("Obteniendo permisos de ${user.rut?.numero}"); @@ -42,7 +42,7 @@ class PermisosCovidService { }) async { final uri = "/v1/permisos/$id"; - final user = PerfilService.getLocalUsuario(); + final user = UserController.to.getUser(); try { Response response = await _dio.post( diff --git a/lib/utils/dio_miutem_client.dart b/lib/utils/dio_miutem_client.dart index 0db10d8..0730480 100644 --- a/lib/utils/dio_miutem_client.dart +++ b/lib/utils/dio_miutem_client.dart @@ -3,7 +3,7 @@ import 'dart:developer'; import 'package:dio/dio.dart'; import 'package:dio_http_cache/dio_http_cache.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; -import 'package:mi_utem/services/auth_service.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; class DioMiUtemClient { static const bool isProduction = bool.fromEnvironment('dart.vm.product'); @@ -45,7 +45,7 @@ class AuthInterceptor extends QueuedInterceptor { final RequestInterceptorHandler handler, ) async { try { - final token = AuthService.getToken(); + final token = UserController.to.getToken(); options._setAuthenticationHeader(token); @@ -75,7 +75,7 @@ class AuthInterceptor extends QueuedInterceptor { // Force refresh auth token try { - final token = await AuthService.refreshToken(); + final token = await UserController.to.refreshToken(); log("Refreshing token, attempt $attempt..."); @@ -93,7 +93,7 @@ class AuthInterceptor extends QueuedInterceptor { } Future _onErrorRefreshingToken() async { - AuthService.invalidateToken(); + UserController.to.invalidateToken(); } } diff --git a/lib/widgets/custom_drawer.dart b/lib/widgets/custom_drawer.dart index 1880c31..fbc4163 100644 --- a/lib/widgets/custom_drawer.dart +++ b/lib/widgets/custom_drawer.dart @@ -5,8 +5,8 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:mdi/mdi.dart'; import 'package:mi_utem/config/routes.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/models/usuario.dart'; -import 'package:mi_utem/services/auth_service.dart'; import 'package:mi_utem/services/remote_config/remote_config.dart'; import 'package:mi_utem/services/review_service.dart'; import 'package:mi_utem/themes/theme.dart'; @@ -129,7 +129,7 @@ class CustomDrawer extends StatelessWidget { leading: Icon(Mdi.closeCircle), title: Text('Cerrar sesión'), onTap: () async { - await AuthService.logOut(); + await UserController.to.logOut(); await Get.offAllNamed(Routes.home); }, diff --git a/pubspec.lock b/pubspec.lock index db5cd6b..8c0b36b 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -1648,5 +1648,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=2.19.0 <3.0.0" + dart: ">=2.19.0 <4.0.0" flutter: ">=3.7.0" From fd54b7bef69a26119d70d703fdb5c5c1305560be Mon Sep 17 00:00:00 2001 From: Jorge Verdugo Date: Sun, 15 Oct 2023 19:11:58 -0300 Subject: [PATCH 2/8] Cambios para soportar Flutter 3.13.6 y iOS 17 + Xcode 15 --- CHANGELOG.md | 4 + README.md | 15 ++- android/build.gradle | 4 +- fastlane/Fastfile | 9 +- ios/Podfile.lock | 48 +++++--- ios/Runner.xcodeproj/project.pbxproj | 175 +++++++++++++-------------- pubspec.lock | 104 +++++++++------- pubspec.yaml | 15 +-- 8 files changed, 202 insertions(+), 172 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 514f160..ba86ae6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,10 @@ Tipos de cambios ## [Unreleased] +### Changed + +- Se actualizan dependecias de Flutter + ## [2.11.9] - 2023-10-11Z ### Added diff --git a/README.md b/README.md index 95eabb6..71eeefb 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,12 @@ # Mi UTEM para Android e iOS Aplicación multiplataforma hecha por estudiantes de la [Universidad Tecnológica Metropolitana de Chile](https://www.utem.cl/) enfocada en adaptar la [plataforma académica Mi.UTEM](https://mi.utem.cl/) de la institución a dispositivos móviles. +## Requisitos técnicos +- Flutter 3.13.6 + ## Créditos -Aplicación hecho por el Club de Desarrollo Experimental. +Este proyecto fue creado por el Club de Desarrollo Experimental (ExDev) de la Universidad Tecnológica Metropolitana y es mantenido por los propios estudiantes con el apoyo del equipo de SISEI. Mira los perfiles que han contribuido a este proyecto: -### Miembros del club -* Sebastián Albornoz Medina ([@Ballena0](https://github.com/ballena0 "GitHub de Sebastián Albornoz Medina")) - Desarrollador -* Juan Avendaño Nuñez ([@Javendanon](https://github.com/Javendanon "GitHub de Juan Avendaño Nuñez")) - Desarrollador -* Felipe Flores Vivanco ([@Spipe](https://github.com/spipe "GitHub de Felipe Flores Vivanco")) - Desarrollador -* Mariam V. Maldonado Marin ([@mariam6697](https://github.com/mariam6697 "GitHub de Mariam V. Maldonado Marin")) - Desarrolladora -* Jorge Verdugo Chacón ([@mapacheverdugo](https://github.com/mapacheverdugo/ "GitHub de Jorge Verdugo Chacón")) - Desarrollador -* Javiera Vergara Navarro ([@PollitoMayo](https://github.com/pollitomayo/ "GitHub de Javiera Vergara Navarro")) - Desarrolladora / Ilustradora \ No newline at end of file + + + \ No newline at end of file diff --git a/android/build.gradle b/android/build.gradle index 283ac1c..74e4842 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -38,6 +38,6 @@ subprojects { project.evaluationDependsOn(':app') } -task clean(type: Delete) { +tasks.register("clean", Delete) { delete rootProject.buildDir -} \ No newline at end of file +} diff --git a/fastlane/Fastfile b/fastlane/Fastfile index 1f741d0..fa0e814 100644 --- a/fastlane/Fastfile +++ b/fastlane/Fastfile @@ -83,6 +83,7 @@ platform :mobile do type = "release" skip_android = false skip_ios = false + skip_clean = false skip_match = false skip_cocoapods = false skip_git_push = false @@ -101,6 +102,10 @@ platform :mobile do skip_ios = options[:skip_ios] end + if options[:skip_clean] + skip_clean = options[:skip_clean] + end + if options[:skip_match] skip_match = options[:skip_match] end @@ -132,7 +137,7 @@ platform :mobile do changelog: changelog, type: type, is_ci: is_ci, - skip_clean: false, + skip_clean: skip_clean, ) end @@ -142,7 +147,7 @@ platform :mobile do build_name: build_name, changelog: changelog, type: type, - skip_clean: !skip_android, + skip_clean: skip_clean || !skip_android, skip_match: skip_match, skip_cocoapods: skip_cocoapods, is_ci: is_ci, diff --git a/ios/Podfile.lock b/ios/Podfile.lock index b186a58..1a54867 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -599,6 +599,8 @@ PODS: - awesome_notifications (0.0.5): - Flutter - IosAwnCore (= 0.7.3) + - awesome_notifications_core (0.0.1): + - Flutter - awesome_notifications_fcm (0.7.3): - awesome_notifications - Firebase @@ -655,7 +657,7 @@ PODS: - Firebase/RemoteConfig (= 10.7.0) - firebase_core - Flutter - - FirebaseABTesting (10.14.0): + - FirebaseABTesting (10.16.0): - FirebaseCore (~> 10.0) - FirebaseAnalytics (10.7.0): - FirebaseAnalytics/AdIdSupport (= 10.7.0) @@ -679,7 +681,7 @@ PODS: - FirebaseCoreInternal (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/Logger (~> 7.8) - - FirebaseCoreInternal (10.14.0): + - FirebaseCoreInternal (10.16.0): - "GoogleUtilities/NSData+zlib (~> 7.8)" - FirebaseFirestore (10.7.0): - abseil/algorithm (~> 1.20211102.0) @@ -700,7 +702,7 @@ PODS: - FirebaseInstallations (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - nanopb (< 2.30910.0, >= 2.30908.0) - - FirebaseInstallations (10.14.0): + - FirebaseInstallations (10.16.0): - FirebaseCore (~> 10.0) - GoogleUtilities/Environment (~> 7.8) - GoogleUtilities/UserDefaults (~> 7.8) @@ -854,11 +856,13 @@ PODS: - permission_handler_apple (9.1.1): - Flutter - PromisesObjC (2.3.1) - - Sentry/HybridSDK (7.31.5) + - Sentry/HybridSDK (8.11.0): + - SentryPrivate (= 8.11.0) - sentry_flutter (0.0.1): - Flutter - FlutterMacOS - - Sentry/HybridSDK (= 7.31.5) + - Sentry/HybridSDK (= 8.11.0) + - SentryPrivate (8.11.0) - share_plus (0.0.1): - Flutter - shared_preferences_foundation (0.0.1): @@ -869,12 +873,13 @@ PODS: - FMDB (>= 2.7.5) - url_launcher_ios (0.0.1): - Flutter - - UXCam (3.6.5) + - UXCam (3.6.6) - video_player_avfoundation (0.0.1): - Flutter DEPENDENCIES: - awesome_notifications (from `.symlinks/plugins/awesome_notifications/ios`) + - awesome_notifications_core (from `.symlinks/plugins/awesome_notifications_core/ios`) - awesome_notifications_fcm (from `.symlinks/plugins/awesome_notifications_fcm/ios`) - background_fetch (from `.symlinks/plugins/background_fetch/ios`) - cloud_firestore (from `.symlinks/plugins/cloud_firestore/ios`) @@ -890,11 +895,11 @@ DEPENDENCIES: - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - in_app_review (from `.symlinks/plugins/in_app_review/ios`) - package_info_plus (from `.symlinks/plugins/package_info_plus/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/darwin`) - permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`) - sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`) - share_plus (from `.symlinks/plugins/share_plus/ios`) - - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/ios`) + - shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`) - sqflite (from `.symlinks/plugins/sqflite/ios`) - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) - video_player_avfoundation (from `.symlinks/plugins/video_player_avfoundation/ios`) @@ -926,11 +931,14 @@ SPEC REPOS: - nanopb - PromisesObjC - Sentry + - SentryPrivate - UXCam EXTERNAL SOURCES: awesome_notifications: :path: ".symlinks/plugins/awesome_notifications/ios" + awesome_notifications_core: + :path: ".symlinks/plugins/awesome_notifications_core/ios" awesome_notifications_fcm: :path: ".symlinks/plugins/awesome_notifications_fcm/ios" background_fetch: @@ -962,7 +970,7 @@ EXTERNAL SOURCES: package_info_plus: :path: ".symlinks/plugins/package_info_plus/ios" path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/ios" + :path: ".symlinks/plugins/path_provider_foundation/darwin" permission_handler_apple: :path: ".symlinks/plugins/permission_handler_apple/ios" sentry_flutter: @@ -970,7 +978,7 @@ EXTERNAL SOURCES: share_plus: :path: ".symlinks/plugins/share_plus/ios" shared_preferences_foundation: - :path: ".symlinks/plugins/shared_preferences_foundation/ios" + :path: ".symlinks/plugins/shared_preferences_foundation/darwin" sqflite: :path: ".symlinks/plugins/sqflite/ios" url_launcher_ios: @@ -981,6 +989,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: abseil: ebe5b5529fb05d93a8bdb7951607be08b7fa71bc awesome_notifications: d63d9a25f126860f9a600850d99772237895b3ba + awesome_notifications_core: d02eed89738fa362d56cbd372850e9adcd2c6bef awesome_notifications_fcm: 7e2d7ab4ca1826fe3a9a5ca96771ace73e05db48 background_fetch: 896944864b038d2837fc750d470e9841e1e6a363 BoringSSL-GRPC: 3175b25143e648463a56daeaaa499c6cb86dad33 @@ -990,13 +999,13 @@ SPEC CHECKSUMS: firebase_core: dee76ded6c693fdb38b8ea39aef7129e32e587a3 firebase_in_app_messaging: 2b36a1746f4fefbd6f578a2f6659358a0d3f2c94 firebase_remote_config: e5f1ed5b29191424280b7b249228f0ed64bc90ee - FirebaseABTesting: e1535073fac4ff55c7537a6e041155c72d9e6906 + FirebaseABTesting: 03f0a8b88cf618350527f2c6a2234e29b9c65064 FirebaseAnalytics: f8133442ee6f8512e28ff19e62ce15398bfaeace FirebaseCore: e317665b9d744727a97e623edbbed009320afdd7 - FirebaseCoreInternal: d558159ee6cc4b823c2296ecc193de9f6d9a5bb3 + FirebaseCoreInternal: 26233f705cc4531236818a07ac84d20c333e505a FirebaseFirestore: 3963a6edd1c84b4748dab3e2c62624a29d03eca1 FirebaseInAppMessaging: d04732fe9c37c3d026d66435abba60120087a7f5 - FirebaseInstallations: f672b1eda64e6381c21d424a2f680a943fd83f3b + FirebaseInstallations: b822f91a61f7d1ba763e5ccc9d4f2e6f2ed3b3ee FirebaseMessaging: ac9062bcc35ed56e15a0241d8fd317022499baf8 FirebaseRemoteConfig: d5de62211e2eaa2152d8ee85a23c301b70887a74 Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 @@ -1017,19 +1026,20 @@ SPEC CHECKSUMS: leveldb-library: f03246171cce0484482ec291f88b6d563699ee06 Libuv-gRPC: 55e51798e14ef436ad9bc45d12d43b77b49df378 nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 - package_info_plus: 6c92f08e1f853dc01228d6f553146438dafcd14e + package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85 path_provider_foundation: 29f094ae23ebbca9d3d0cec13889cd9060c0e943 permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6 PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4 - Sentry: 4c9babff9034785067c896fd580b1f7de44da020 - sentry_flutter: 1346a880b24c0240807b53b10cf50ddad40f504e - share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 + Sentry: 39d57e691e311bdb73bc1ab5bbebbd6bc890050d + sentry_flutter: b2feefdad5b0f06602347172bc7257e8e9da5562 + SentryPrivate: 48712023cdfd523735c2edb6b06bedf26c4730a3 + share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5 shared_preferences_foundation: 5b919d13b803cadd15ed2dc053125c68730e5126 sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 - UXCam: d2f9782c4e99ecf10f7aae15edd244e2f6346154 + UXCam: 7f200dd8f0829ae92a2ef82cadbb35dadff6108d video_player_avfoundation: 81e49bb3d9fb63dccf9fa0f6d877dc3ddbeac126 PODFILE CHECKSUM: 816280d49dfc997733647f095bf1e4c52c291937 -COCOAPODS: 1.12.1 +COCOAPODS: 1.13.0 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 6049fa5..fc3827b 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -8,13 +8,13 @@ /* Begin PBXBuildFile section */ 1498D2341E8E89220040F4C2 /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */; }; - 30DAE1CFC81DDE043C47EFB7 /* Pods_MiUtemNotificationServiceExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 175FD8BE5FEC6733F528FF6A /* Pods_MiUtemNotificationServiceExtension.framework */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; - 4B47F7BDE8FF84101E5DC4A7 /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 243E7D668CFCB834EA06F2F9 /* Pods_Runner.framework */; }; 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 74858FAE1ED2DC5600515810 /* AppDelegate.swift */; }; + 8F4ED3CFA3A6AA57DAA4905A /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6121D4E2A474C9DE828CDCAE /* Pods_Runner.framework */; }; 97C146FC1CF9000F007C117D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FA1CF9000F007C117D /* Main.storyboard */; }; 97C146FE1CF9000F007C117D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FD1CF9000F007C117D /* Assets.xcassets */; }; 97C147011CF9000F007C117D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C146FF1CF9000F007C117D /* LaunchScreen.storyboard */; }; + CD503047F9D302C06B5A0368 /* Pods_MiUtemNotificationServiceExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CD7FFD10A37572B5E2396877 /* Pods_MiUtemNotificationServiceExtension.framework */; }; EBBC93162A9CF30F00452092 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = EBBC93152A9CF30F00452092 /* GoogleService-Info.plist */; }; EBCDF3152A08916400C04BA3 /* prod.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = EBCDF3142A08916400C04BA3 /* prod.xcconfig */; }; EBCDF3162A08916400C04BA3 /* prod.xcconfig in Resources */ = {isa = PBXBuildFile; fileRef = EBCDF3142A08916400C04BA3 /* prod.xcconfig */; }; @@ -59,20 +59,21 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 0E66CE5E3A60A9B1934B64CA /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.xcconfig"; sourceTree = ""; }; + 028D1D60BF59B575889466D8 /* Pods-Runner.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-dev.xcconfig"; sourceTree = ""; }; + 0D18ECB963B9AC9E555F6D58 /* Pods-MiUtemNotificationServiceExtension.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.profile-prod.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.profile-prod.xcconfig"; sourceTree = ""; }; 1498D2321E8E86230040F4C2 /* GeneratedPluginRegistrant.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = GeneratedPluginRegistrant.h; sourceTree = ""; }; 1498D2331E8E89220040F4C2 /* GeneratedPluginRegistrant.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = GeneratedPluginRegistrant.m; sourceTree = ""; }; - 175FD8BE5FEC6733F528FF6A /* Pods_MiUtemNotificationServiceExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MiUtemNotificationServiceExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 19EE483FBE4F0DA023507A8A /* Pods-Runner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release.xcconfig"; sourceTree = ""; }; - 1DABD6A006BB1390BCF23593 /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; - 1E98DE4BD311960EB4037F29 /* Pods-Runner.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile.xcconfig"; sourceTree = ""; }; - 243E7D668CFCB834EA06F2F9 /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 1D195389E35AFDBBC19F556A /* Pods-MiUtemNotificationServiceExtension.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.profile-dev.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.profile-dev.xcconfig"; sourceTree = ""; }; + 2A8E76026D6C8EDF63A50739 /* Pods-MiUtemNotificationServiceExtension.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.debug-prod.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.debug-prod.xcconfig"; sourceTree = ""; }; 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = AppFrameworkInfo.plist; path = Flutter/AppFrameworkInfo.plist; sourceTree = ""; }; - 4966531EF6EB9FC094381CC5 /* Pods-MiUtemNotificationServiceExtension.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.debug-dev.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.debug-dev.xcconfig"; sourceTree = ""; }; - 6A2BEBBB25934DE09542A657 /* Pods-MiUtemNotificationServiceExtension.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.debug-prod.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.debug-prod.xcconfig"; sourceTree = ""; }; + 5D4267C91BD4F6CA29666EAE /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; + 6121D4E2A474C9DE828CDCAE /* Pods_Runner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Runner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 67917C6A3CFC662D52BE1420 /* Pods-Runner.debug-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-prod.xcconfig"; sourceTree = ""; }; + 6DE503BB399A91B6C5520D76 /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; 74858FAD1ED2DC5600515810 /* Runner-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Runner-Bridging-Header.h"; sourceTree = ""; }; 74858FAE1ED2DC5600515810 /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 7AFA3C8E1D35360C0083082E /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Flutter/Release.xcconfig; sourceTree = ""; }; + 7FE2002C76C7F77E5A50737A /* Pods-MiUtemNotificationServiceExtension.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.debug-dev.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.debug-dev.xcconfig"; sourceTree = ""; }; 9740EEB21CF90195004384FC /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Flutter/Debug.xcconfig; sourceTree = ""; }; 9740EEB31CF90195004384FC /* Generated.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; name = Generated.xcconfig; path = Flutter/Generated.xcconfig; sourceTree = ""; }; 97C146EE1CF9000F007C117D /* Runner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Runner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -80,18 +81,11 @@ 97C146FD1CF9000F007C117D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 97C147001CF9000F007C117D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; 97C147021CF9000F007C117D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 9CBD779D41F276A7AC2B572E /* Pods-MiUtemNotificationServiceExtension.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.release-dev.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.release-dev.xcconfig"; sourceTree = ""; }; - A8FD661028BC76BA36783754 /* Pods-Runner.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-dev.xcconfig"; sourceTree = ""; }; - A9DBD6E19A9BF248843741C2 /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; - BC4589FD8E823EE03AE597C3 /* Pods-MiUtemNotificationServiceExtension.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.profile-prod.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.profile-prod.xcconfig"; sourceTree = ""; }; - C9B2E091E8F8621D6AB5E571 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; - D0E6334983448057168822B6 /* Pods-MiUtemNotificationServiceExtension.profile-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.profile-dev.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.profile-dev.xcconfig"; sourceTree = ""; }; - D344C06D3AF70CF3F876E06C /* Pods-MiUtemNotificationServiceExtension.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.release.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.release.xcconfig"; sourceTree = ""; }; - DA0B179EA806614E04AA7C25 /* Pods-MiUtemNotificationServiceExtension.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.release-prod.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.release-prod.xcconfig"; sourceTree = ""; }; - DAD427C338F11F0C1F044F0C /* Pods-MiUtemNotificationServiceExtension.profile.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.profile.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.profile.xcconfig"; sourceTree = ""; }; - E3DF90F3A21807C39C03D30F /* Pods-Runner.profile-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.profile-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.profile-prod.xcconfig"; sourceTree = ""; }; - E70F7055917B6FFFAE576207 /* Pods-Runner.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug.xcconfig"; sourceTree = ""; }; - E89F309C88BB79A4A8742037 /* Pods-MiUtemNotificationServiceExtension.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.debug.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.debug.xcconfig"; sourceTree = ""; }; + A3FA1AB011DC323121CB4846 /* Pods-Runner.debug-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.debug-dev.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.debug-dev.xcconfig"; sourceTree = ""; }; + C18F971B0C4AE83409EF3EE9 /* Pods-MiUtemNotificationServiceExtension.release-dev.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.release-dev.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.release-dev.xcconfig"; sourceTree = ""; }; + CD7FFD10A37572B5E2396877 /* Pods_MiUtemNotificationServiceExtension.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MiUtemNotificationServiceExtension.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D64F29F37589757D056742C4 /* Pods-Runner.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Runner.release-prod.xcconfig"; path = "Target Support Files/Pods-Runner/Pods-Runner.release-prod.xcconfig"; sourceTree = ""; }; + E9D8206B317F8C4150388A29 /* Pods-MiUtemNotificationServiceExtension.release-prod.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiUtemNotificationServiceExtension.release-prod.xcconfig"; path = "Target Support Files/Pods-MiUtemNotificationServiceExtension/Pods-MiUtemNotificationServiceExtension.release-prod.xcconfig"; sourceTree = ""; }; EBBC93152A9CF30F00452092 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; EBCDF3142A08916400C04BA3 /* prod.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = prod.xcconfig; sourceTree = ""; }; EBCDF3172A0891B800C04BA3 /* dev.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = dev.xcconfig; sourceTree = ""; }; @@ -106,7 +100,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4B47F7BDE8FF84101E5DC4A7 /* Pods_Runner.framework in Frameworks */, + 8F4ED3CFA3A6AA57DAA4905A /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -114,34 +108,37 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 30DAE1CFC81DDE043C47EFB7 /* Pods_MiUtemNotificationServiceExtension.framework in Frameworks */, + CD503047F9D302C06B5A0368 /* Pods_MiUtemNotificationServiceExtension.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 5943468C977B0D2375AA5EA6 /* Frameworks */ = { + isa = PBXGroup; + children = ( + CD7FFD10A37572B5E2396877 /* Pods_MiUtemNotificationServiceExtension.framework */, + 6121D4E2A474C9DE828CDCAE /* Pods_Runner.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 5BE064586DEE9A90F78F289D /* Pods */ = { isa = PBXGroup; children = ( - E70F7055917B6FFFAE576207 /* Pods-Runner.debug.xcconfig */, - 19EE483FBE4F0DA023507A8A /* Pods-Runner.release.xcconfig */, - 1E98DE4BD311960EB4037F29 /* Pods-Runner.profile.xcconfig */, - E89F309C88BB79A4A8742037 /* Pods-MiUtemNotificationServiceExtension.debug.xcconfig */, - D344C06D3AF70CF3F876E06C /* Pods-MiUtemNotificationServiceExtension.release.xcconfig */, - DAD427C338F11F0C1F044F0C /* Pods-MiUtemNotificationServiceExtension.profile.xcconfig */, - 4966531EF6EB9FC094381CC5 /* Pods-MiUtemNotificationServiceExtension.debug-dev.xcconfig */, - 9CBD779D41F276A7AC2B572E /* Pods-MiUtemNotificationServiceExtension.release-dev.xcconfig */, - D0E6334983448057168822B6 /* Pods-MiUtemNotificationServiceExtension.profile-dev.xcconfig */, - C9B2E091E8F8621D6AB5E571 /* Pods-Runner.debug-dev.xcconfig */, - A8FD661028BC76BA36783754 /* Pods-Runner.release-dev.xcconfig */, - 0E66CE5E3A60A9B1934B64CA /* Pods-Runner.profile-dev.xcconfig */, - 6A2BEBBB25934DE09542A657 /* Pods-MiUtemNotificationServiceExtension.debug-prod.xcconfig */, - DA0B179EA806614E04AA7C25 /* Pods-MiUtemNotificationServiceExtension.release-prod.xcconfig */, - BC4589FD8E823EE03AE597C3 /* Pods-MiUtemNotificationServiceExtension.profile-prod.xcconfig */, - 1DABD6A006BB1390BCF23593 /* Pods-Runner.debug-prod.xcconfig */, - A9DBD6E19A9BF248843741C2 /* Pods-Runner.release-prod.xcconfig */, - E3DF90F3A21807C39C03D30F /* Pods-Runner.profile-prod.xcconfig */, + 2A8E76026D6C8EDF63A50739 /* Pods-MiUtemNotificationServiceExtension.debug-prod.xcconfig */, + 7FE2002C76C7F77E5A50737A /* Pods-MiUtemNotificationServiceExtension.debug-dev.xcconfig */, + E9D8206B317F8C4150388A29 /* Pods-MiUtemNotificationServiceExtension.release-prod.xcconfig */, + C18F971B0C4AE83409EF3EE9 /* Pods-MiUtemNotificationServiceExtension.release-dev.xcconfig */, + 0D18ECB963B9AC9E555F6D58 /* Pods-MiUtemNotificationServiceExtension.profile-prod.xcconfig */, + 1D195389E35AFDBBC19F556A /* Pods-MiUtemNotificationServiceExtension.profile-dev.xcconfig */, + 67917C6A3CFC662D52BE1420 /* Pods-Runner.debug-prod.xcconfig */, + A3FA1AB011DC323121CB4846 /* Pods-Runner.debug-dev.xcconfig */, + D64F29F37589757D056742C4 /* Pods-Runner.release-prod.xcconfig */, + 6DE503BB399A91B6C5520D76 /* Pods-Runner.release-dev.xcconfig */, + 5D4267C91BD4F6CA29666EAE /* Pods-Runner.profile-prod.xcconfig */, + 028D1D60BF59B575889466D8 /* Pods-Runner.profile-dev.xcconfig */, ); path = Pods; sourceTree = ""; @@ -167,7 +164,7 @@ EBE5B6BC29D4D890005924AB /* MiUtemNotificationServiceExtension */, 97C146EF1CF9000F007C117D /* Products */, 5BE064586DEE9A90F78F289D /* Pods */, - F6A1FF0D1A697AB576081748 /* Frameworks */, + 5943468C977B0D2375AA5EA6 /* Frameworks */, ); sourceTree = ""; }; @@ -206,15 +203,6 @@ path = MiUtemNotificationServiceExtension; sourceTree = ""; }; - F6A1FF0D1A697AB576081748 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 243E7D668CFCB834EA06F2F9 /* Pods_Runner.framework */, - 175FD8BE5FEC6733F528FF6A /* Pods_MiUtemNotificationServiceExtension.framework */, - ); - name = Frameworks; - sourceTree = ""; - }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -222,16 +210,16 @@ isa = PBXNativeTarget; buildConfigurationList = 97C147051CF9000F007C117D /* Build configuration list for PBXNativeTarget "Runner" */; buildPhases = ( - 94E083E75031E6E772DBDA7C /* [CP] Check Pods Manifest.lock */, + 4CFEEF06D81C25B5F5382E38 /* [CP] Check Pods Manifest.lock */, EB04E4B02A08BA2D00698618 /* Firebase */, 9740EEB61CF901F6004384FC /* Run Script */, 97C146EA1CF9000F007C117D /* Sources */, 97C146EB1CF9000F007C117D /* Frameworks */, + EBE5B6C729D4D890005924AB /* Embed Foundation Extensions */, 97C146EC1CF9000F007C117D /* Resources */, 9705A1C41CF9048500538489 /* Embed Frameworks */, 3B06AD1E1E4923F5004D2608 /* Thin Binary */, - 09DFE2173D67B99B024BDA8C /* [CP] Embed Pods Frameworks */, - EBE5B6C729D4D890005924AB /* Embed Foundation Extensions */, + D373ECD8927B88A41A34AE2E /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -247,7 +235,7 @@ isa = PBXNativeTarget; buildConfigurationList = EBE5B6C329D4D890005924AB /* Build configuration list for PBXNativeTarget "MiUtemNotificationServiceExtension" */; buildPhases = ( - 5CA1814B24B462F60978F7B3 /* [CP] Check Pods Manifest.lock */, + A4370C68AA35EFC7FD3B8BDC /* [CP] Check Pods Manifest.lock */, EBE5B6B729D4D890005924AB /* Sources */, EBE5B6B829D4D890005924AB /* Frameworks */, EBE5B6B929D4D890005924AB /* Resources */, @@ -268,7 +256,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1420; - LastUpgradeCheck = 1300; + LastUpgradeCheck = 1430; ORGANIZATIONNAME = ""; TargetAttributes = { 97C146ED1CF9000F007C117D = { @@ -326,23 +314,6 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 09DFE2173D67B99B024BDA8C /* [CP] Embed Pods Frameworks */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", - ); - name = "[CP] Embed Pods Frameworks"; - outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; - showEnvVarsInLog = 0; - }; 3B06AD1E1E4923F5004D2608 /* Thin Binary */ = { isa = PBXShellScriptBuildPhase; alwaysOutOfDate = 1; @@ -350,6 +321,7 @@ files = ( ); inputPaths = ( + "${TARGET_BUILD_DIR}/${INFOPLIST_PATH}", ); name = "Thin Binary"; outputPaths = ( @@ -358,7 +330,7 @@ shellPath = /bin/sh; shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" embed_and_thin"; }; - 5CA1814B24B462F60978F7B3 /* [CP] Check Pods Manifest.lock */ = { + 4CFEEF06D81C25B5F5382E38 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -373,14 +345,29 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-MiUtemNotificationServiceExtension-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 94E083E75031E6E772DBDA7C /* [CP] Check Pods Manifest.lock */ = { + 9740EEB61CF901F6004384FC /* Run Script */ = { + isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "Run Script"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; + }; + A4370C68AA35EFC7FD3B8BDC /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -395,27 +382,29 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-Runner-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-MiUtemNotificationServiceExtension-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 9740EEB61CF901F6004384FC /* Run Script */ = { + D373ECD8927B88A41A34AE2E /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); - inputPaths = ( + inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "Run Script"; - outputPaths = ( + name = "[CP] Embed Pods Frameworks"; + outputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "/bin/sh \"$FLUTTER_ROOT/packages/flutter_tools/bin/xcode_backend.sh\" build\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; EB04E4B02A08BA2D00698618 /* Firebase */ = { isa = PBXShellScriptBuildPhase; @@ -562,6 +551,7 @@ PRODUCT_BUNDLE_IDENTIFIER = cl.utem.miutem; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -703,6 +693,7 @@ PRODUCT_BUNDLE_IDENTIFIER = cl.utem.miutem; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -739,6 +730,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore cl.utem.miutem"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -827,6 +819,7 @@ PRODUCT_BUNDLE_IDENTIFIER = cl.utem.miutem.dev; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; @@ -836,7 +829,7 @@ }; EBCDF31C2A08921600C04BA3 /* Debug-dev */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 4966531EF6EB9FC094381CC5 /* Pods-MiUtemNotificationServiceExtension.debug-dev.xcconfig */; + baseConfigurationReference = 7FE2002C76C7F77E5A50737A /* Pods-MiUtemNotificationServiceExtension.debug-dev.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; BUILD_LIBRARY_FOR_DISTRIBUTION = NO; @@ -957,6 +950,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; "PROVISIONING_PROFILE_SPECIFIER[sdk=iphoneos*]" = "match AppStore cl.utem.miutem"; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -965,7 +959,7 @@ }; EBCDF31F2A08921C00C04BA3 /* Release-dev */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 9CBD779D41F276A7AC2B572E /* Pods-MiUtemNotificationServiceExtension.release-dev.xcconfig */; + baseConfigurationReference = C18F971B0C4AE83409EF3EE9 /* Pods-MiUtemNotificationServiceExtension.release-dev.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; BUILD_LIBRARY_FOR_DISTRIBUTION = NO; @@ -1082,6 +1076,7 @@ PRODUCT_BUNDLE_IDENTIFIER = cl.utem.miutem.dev; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE_SPECIFIER = ""; + SUPPORTED_PLATFORMS = "iphonesimulator iphoneos"; SWIFT_OBJC_BRIDGING_HEADER = "Runner/Runner-Bridging-Header.h"; SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; @@ -1090,7 +1085,7 @@ }; EBCDF3222A08922100C04BA3 /* Profile-dev */ = { isa = XCBuildConfiguration; - baseConfigurationReference = D0E6334983448057168822B6 /* Pods-MiUtemNotificationServiceExtension.profile-dev.xcconfig */; + baseConfigurationReference = 1D195389E35AFDBBC19F556A /* Pods-MiUtemNotificationServiceExtension.profile-dev.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; BUILD_LIBRARY_FOR_DISTRIBUTION = NO; @@ -1128,7 +1123,7 @@ }; EBE5B6C429D4D890005924AB /* Debug-prod */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6A2BEBBB25934DE09542A657 /* Pods-MiUtemNotificationServiceExtension.debug-prod.xcconfig */; + baseConfigurationReference = 2A8E76026D6C8EDF63A50739 /* Pods-MiUtemNotificationServiceExtension.debug-prod.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; BUILD_LIBRARY_FOR_DISTRIBUTION = NO; @@ -1169,7 +1164,7 @@ }; EBE5B6C529D4D890005924AB /* Release-prod */ = { isa = XCBuildConfiguration; - baseConfigurationReference = DA0B179EA806614E04AA7C25 /* Pods-MiUtemNotificationServiceExtension.release-prod.xcconfig */; + baseConfigurationReference = E9D8206B317F8C4150388A29 /* Pods-MiUtemNotificationServiceExtension.release-prod.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; BUILD_LIBRARY_FOR_DISTRIBUTION = NO; @@ -1211,7 +1206,7 @@ }; EBE5B6C629D4D890005924AB /* Profile-prod */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BC4589FD8E823EE03AE597C3 /* Pods-MiUtemNotificationServiceExtension.profile-prod.xcconfig */; + baseConfigurationReference = 0D18ECB963B9AC9E555F6D58 /* Pods-MiUtemNotificationServiceExtension.profile-prod.xcconfig */; buildSettings = { APPLICATION_EXTENSION_API_ONLY = YES; BUILD_LIBRARY_FOR_DISTRIBUTION = NO; diff --git a/pubspec.lock b/pubspec.lock index db5cd6b..994e81d 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -45,10 +45,10 @@ packages: dependency: transitive description: name: async - sha256: bfe67ef28df125b7dddcea62755991f807aa39a2492a23e1550161692950bbe0 + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "2.11.0" awesome_notifications: dependency: "direct main" description: @@ -57,6 +57,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.4+1" + awesome_notifications_core: + dependency: "direct main" + description: + name: awesome_notifications_core + sha256: "0d67f3539aac87f9052b9eb204bdfbd00893a9d83b5975151098265428332bea" + url: "https://pub.dev" + source: hosted + version: "0.8.1" awesome_notifications_fcm: dependency: "direct main" description: @@ -165,10 +173,10 @@ packages: dependency: transitive description: name: characters - sha256: e6a326c8af69605aec75ed6c187d06b349707a27fbff8222ca9cc2cff167975c + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "1.3.0" charts_common: dependency: transitive description: @@ -254,10 +262,10 @@ packages: dependency: transitive description: name: collection - sha256: cfc915e6923fe5ce6e153b0723c753045de46de1b4d63771530504004a45fae0 + sha256: f092b211a4319e98e5ff58223576de6c2803db36221657b46c82574721240687 url: "https://pub.dev" source: hosted - version: "1.17.0" + version: "1.17.2" convert: dependency: transitive description: @@ -350,18 +358,18 @@ packages: dependency: "direct main" description: name: extended_image - sha256: a6b738d9b8d5513be72c545cc3e9c5c451fbee77c8db3cbec7c32ae85b82fb93 + sha256: b4d72a27851751cfadaf048936d42939db7cd66c08fdcfe651eeaa1179714ee6 url: "https://pub.dev" source: hosted - version: "6.4.1" + version: "8.1.1" extended_image_library: dependency: transitive description: name: extended_image_library - sha256: "550743b43ab093aed35ef234500fcc7a304cbac1eca47b0cc991e07e88750758" + sha256: "8bf87c0b14dcb59200c923a9a3952304e4732a0901e40811428834ef39018ee1" url: "https://pub.dev" source: hosted - version: "3.4.2" + version: "3.6.0" fake_async: dependency: transitive description: @@ -774,18 +782,18 @@ packages: dependency: transitive description: name: http - sha256: "5895291c13fa8a3bd82e76d5627f69e0d85ca6a30dcac95c4ea19a5d555879c2" + sha256: "759d1a329847dd0f39226c688d3e06a6b8679668e350e2891a6474f8b4bb8525" url: "https://pub.dev" source: hosted - version: "0.13.6" + version: "1.1.0" http_client_helper: dependency: transitive description: name: http_client_helper - sha256: "14c6e756644339f561321dab021215475ba4779aa962466f59ccb3ecf66b36c3" + sha256: "8a9127650734da86b5c73760de2b404494c968a3fd55602045ffec789dac3cb1" url: "https://pub.dev" source: hosted - version: "2.0.4" + version: "3.0.0" http_parser: dependency: transitive description: @@ -926,10 +934,10 @@ packages: dependency: transitive description: name: js - sha256: "5528c2f391ededb7775ec1daa69e65a2d61276f7552de2b5f7b8d34ee9fd4ab7" + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 url: "https://pub.dev" source: hosted - version: "0.6.5" + version: "0.6.7" json_annotation: dependency: "direct overridden" description: @@ -982,18 +990,18 @@ packages: dependency: transitive description: name: matcher - sha256: "16db949ceee371e9b99d22f88fa3a73c4e59fd0afed0bd25fc336eb76c198b72" + sha256: "1803e76e6653768d64ed8ff2e1e67bea3ad4b923eb5c56a295c3e634bad5960e" url: "https://pub.dev" source: hosted - version: "0.12.13" + version: "0.12.16" material_color_utilities: dependency: transitive description: name: material_color_utilities - sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + sha256: "9528f2f296073ff54cb9fee677df673ace1218163c3bc7628093e7eed5203d41" url: "https://pub.dev" source: hosted - version: "0.2.0" + version: "0.5.0" mdi: dependency: "direct main" description: @@ -1006,10 +1014,10 @@ packages: dependency: transitive description: name: meta - sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" url: "https://pub.dev" source: hosted - version: "1.8.0" + version: "1.9.1" mime: dependency: transitive description: @@ -1038,10 +1046,10 @@ packages: dependency: "direct main" description: name: package_info_plus - sha256: "10259b111176fba5c505b102e3a5b022b51dd97e30522e906d6922c745584745" + sha256: "7e76fad405b3e4016cd39d08f455a4eb5199723cf594cd1b8916d47140d93017" url: "https://pub.dev" source: hosted - version: "3.1.2" + version: "4.2.0" package_info_plus_platform_interface: dependency: transitive description: @@ -1054,10 +1062,10 @@ packages: dependency: transitive description: name: path - sha256: db9d4f58c908a4ba5953fcee2ae317c94889433e5024c27ce74a37f94267945b + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.8.3" path_drawing: dependency: transitive description: @@ -1278,42 +1286,42 @@ packages: dependency: "direct main" description: name: screenshot - sha256: "30bb9fade6eb2578a1fc2e84f6b184141fc86883cda10988d4500ff00eb728e2" + sha256: "455284ff1f5b911d94a43c25e1385485cf6b4f288293eba68f15dad711c7b81c" url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "2.1.0" sentry: dependency: transitive description: name: sentry - sha256: a1529c545fcbc899e5dcc7c94ff1c6ad0c334dfc99a3cda366b1da98af7c5678 + sha256: "830667eadc0398fea3a3424ed1b74568e2db603a42758d0922e2f2974ce55a60" url: "https://pub.dev" source: hosted - version: "6.22.0" + version: "7.10.1" sentry_flutter: dependency: "direct main" description: name: sentry_flutter - sha256: cab07e99a8f27af94f399cabceaff6968011660505b30a0e2286728a81bc476c + sha256: "6730f41b304c6fb0fa590dacccaf73ba11082fc64b274cfe8a79776f2b95309c" url: "https://pub.dev" source: hosted - version: "6.22.0" + version: "7.10.1" share_plus: dependency: "direct main" description: name: share_plus - sha256: b1f15232d41e9701ab2f04181f21610c36c83a12ae426b79b4bd011c567934b1 + sha256: f74fc3f1cbd99f39760182e176802f693fa0ec9625c045561cfad54681ea93dd url: "https://pub.dev" source: hosted - version: "6.3.4" + version: "7.2.1" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: "357412af4178d8e11d14f41723f80f12caea54cf0d5cd29af9dcdab85d58aea7" + sha256: df08bc3a07d01f5ea47b45d03ffcba1fa9cd5370fb44b3f38c70e42cced0f956 url: "https://pub.dev" source: hosted - version: "3.3.0" + version: "3.3.1" shared_preferences: dependency: "direct main" description: @@ -1395,10 +1403,10 @@ packages: dependency: transitive description: name: source_span - sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" url: "https://pub.dev" source: hosted - version: "1.9.1" + version: "1.10.0" sqflite: dependency: transitive description: @@ -1459,10 +1467,10 @@ packages: dependency: transitive description: name: test_api - sha256: ad540f65f92caa91bf21dfc8ffb8c589d6e4dc0c2267818b4cc2792857706206 + sha256: "75760ffd7786fffdfb9597c35c5b27eaeec82be8edfb6d71d32651128ed7aab8" url: "https://pub.dev" source: hosted - version: "0.4.16" + version: "0.6.0" tint: dependency: transitive description: @@ -1615,14 +1623,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.2" + web: + dependency: transitive + description: + name: web + sha256: dc8ccd225a2005c1be616fe02951e2e342092edf968cf0844220383757ef8f10 + url: "https://pub.dev" + source: hosted + version: "0.1.4-beta" win32: dependency: transitive description: name: win32 - sha256: a6f0236dbda0f63aa9a25ad1ff9a9d8a4eaaa5012da0dc59d21afdb1dc361ca4 + sha256: f2add6fa510d3ae152903412227bda57d0d5a8da61d2c39c1fb022c9429a41c0 url: "https://pub.dev" source: hosted - version: "3.1.4" + version: "5.0.6" xdg_directories: dependency: transitive description: @@ -1648,5 +1664,5 @@ packages: source: hosted version: "3.1.2" sdks: - dart: ">=2.19.0 <3.0.0" - flutter: ">=3.7.0" + dart: ">=3.1.0-185.0.dev <4.0.0" + flutter: ">=3.13.0" diff --git a/pubspec.yaml b/pubspec.yaml index 9b8a998..2bef81c 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -9,8 +9,9 @@ environment: sdk: ">=2.14.4 <3.0.0" dependencies: - awesome_notifications: ^0.7.4+1 - awesome_notifications_fcm: ^0.7.4+1 + awesome_notifications_core: ^0.8.1 + awesome_notifications: any + awesome_notifications_fcm: any badges: ^2.0.2 barcode_widget: ^2.0.3 barcode_image: ^2.0.2 @@ -28,7 +29,7 @@ dependencies: dio_cache_interceptor: ^3.2.6 dio_cache_interceptor_hive_store: ^3.1.1 dotted_border: ^2.0.0+2 - extended_image: ^6.0.2+1 + extended_image: ^8.1.1 firebase_core: 2.11.0 firebase_analytics: 10.2.1 firebase_in_app_messaging: ^0.7.0+10 @@ -54,16 +55,16 @@ dependencies: in_app_review: ^2.0.3 logger: ^1.3.0 mdi: ^5.0.0-nullsafety.0 - package_info_plus: ^3.0.2 + package_info_plus: ^4.2.0 path_provider: ^2.0.2 permission_handler: ^10.2.0 photo_view: ^0.14.0 qr_flutter: ^4.0.0 recase: ^4.0.0 responsive_framework: ^0.2.0 - screenshot: ^1.2.3 - sentry_flutter: ^6.18.2 - share_plus: ^6.3.0 + screenshot: ^2.1.0 + sentry_flutter: ^7.10.1 + share_plus: ^7.2.1 simple_gesture_detector: ^0.2.0 url_launcher: ^6.1.7 video_player: ^2.6.1 From 21c4d729457054303369c7ac4b48f224fe3a4dbd Mon Sep 17 00:00:00 2001 From: Jorge Verdugo Date: Sun, 15 Oct 2023 19:19:01 -0300 Subject: [PATCH 3/8] Se mejora template de PR --- docs/pull_request_template.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/pull_request_template.md b/docs/pull_request_template.md index 4cd1b40..91701e6 100644 --- a/docs/pull_request_template.md +++ b/docs/pull_request_template.md @@ -16,9 +16,13 @@ Si incluyes nuevas dependencias, por favor, haz una lista de las necesarias. # Checklist: -- [ ] He practicado una revisión de mi propio codigo. -- [ ] He comentado mi codigo, sobretodo en las partes que pueden resultar dificiles de entender. -- [ ] Mis cambios no generan nuevas alertas (Warnings). +- [ ] He hecho una revisión de mi propio codigo. +- [ ] Hice pruebas en un dispositivo Android real. +- [ ] Hice pruebas en un dispositivo Android emulador. +- [ ] Hice pruebas en un dispositivo iOS real. +- [ ] Hice pruebas en un dispositivo iOS simulador. +- [ ] Mis cambios no generan nuevos lint Problems. +- [ ] Agregué mis cambios al CHANGELOG.md. - [ ] Este pull request contiene <1000 lineas de codigo (LOC). From 18392e4f9b5dc2e4a52ec3a68963dd08ff58d7ae Mon Sep 17 00:00:00 2001 From: Jorge Verdugo Date: Sun, 15 Oct 2023 22:24:57 -0300 Subject: [PATCH 4/8] Controller mejorado --- lib/config/router.dart | 4 +- lib/controllers/asignatura_controller.dart | 8 +- lib/controllers/asignaturas_controller.dart | 10 +- lib/controllers/carreras_controller.dart | 18 ++- .../grades_changes_controller.dart | 3 +- lib/controllers/horario_controller.dart | 8 +- lib/controllers/user_controller.dart | 70 +++++---- lib/main.dart | 20 +-- lib/screens/credencial_screen.dart | 139 +++++------------- lib/screens/usuario_screen.dart | 4 +- lib/services/asignaturas_service.dart | 8 +- lib/services/carreras_service.dart | 4 +- lib/services/grades_service.dart | 4 +- lib/services/horarios_service.dart | 4 +- lib/services/perfil_service.dart | 10 +- lib/services/permisos_covid_service.dart | 10 +- 16 files changed, 127 insertions(+), 197 deletions(-) diff --git a/lib/config/router.dart b/lib/config/router.dart index e56718b..07addc0 100644 --- a/lib/config/router.dart +++ b/lib/config/router.dart @@ -26,9 +26,9 @@ final _homePage = GetPage( name: Routes.home, bindings: [QrPassesBinding()], page: () { - final usuario = UserController.to.getUser(); + final usuario = UserController.to.user.value; - return MainScreen(usuario: usuario); + return MainScreen(usuario: usuario!); }, middlewares: [OnlyAuthMiddleware()], ); diff --git a/lib/controllers/asignatura_controller.dart b/lib/controllers/asignatura_controller.dart index 544e732..17a9e1e 100644 --- a/lib/controllers/asignatura_controller.dart +++ b/lib/controllers/asignatura_controller.dart @@ -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'; @@ -19,13 +19,13 @@ class AsignaturaController extends GetxController with StateMixin { @override void onInit() { - _selectedCarrera = Get.find().selectedCarrera.value; + _selectedCarrera = Get.find().selectedCarrera.value; if (_selectedCarrera != null) { - getAsignaturaDetail(Get.find().selectedCarrera.value); + getAsignaturaDetail(Get.find().selectedCarrera.value); } ever( - Get.find().selectedCarrera, + Get.find().selectedCarrera, (carrera) { _selectedCarrera = carrera; getAsignaturaDetail(carrera, forceRefresh: true); diff --git a/lib/controllers/asignaturas_controller.dart b/lib/controllers/asignaturas_controller.dart index a8090d1..cf12a3f 100644 --- a/lib/controllers/asignaturas_controller.dart +++ b/lib/controllers/asignaturas_controller.dart @@ -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'; @@ -11,12 +11,12 @@ class AsignaturasController extends GetxController void onInit() { change(null, status: RxStatus.loading()); - if (Get.find().selectedCarrera.value != null) { - getAsignaturas(Get.find().selectedCarrera.value); + if (Get.find().selectedCarrera.value != null) { + getAsignaturas(Get.find().selectedCarrera.value); } ever( - Get.find().selectedCarrera, + Get.find().selectedCarrera, (carrera) => getAsignaturas(carrera, forceRefresh: true), ); super.onInit(); @@ -54,7 +54,7 @@ class AsignaturasController extends GetxController } void refreshAsignaturas() { - final carrera = Get.find().selectedCarrera.value; + final carrera = Get.find().selectedCarrera.value; getAsignaturas(carrera, forceRefresh: true); } } diff --git a/lib/controllers/carreras_controller.dart b/lib/controllers/carreras_controller.dart index 20eb963..c8d6aa6 100644 --- a/lib/controllers/carreras_controller.dart +++ b/lib/controllers/carreras_controller.dart @@ -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 = [].obs; - final selectedCarrera = Rxn(); - +class CarrerasController extends GetxController with StateMixin> { static CarrerasController get to => Get.find(); @override void onInit() { getCarreras(); + ever( + Get.find().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); } @@ -43,6 +49,6 @@ class CarrerasController extends GetxController { } void changeSelectedCarrera(Carrera carrera) { - selectedCarrera.value = carrera; + UserController.to.selectCarrera(carrera); } } diff --git a/lib/controllers/grades_changes_controller.dart b/lib/controllers/grades_changes_controller.dart index a6d80e1..0c81836 100644 --- a/lib/controllers/grades_changes_controller.dart +++ b/lib/controllers/grades_changes_controller.dart @@ -1,7 +1,6 @@ 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'; @@ -144,7 +143,7 @@ class GradesChangesController { 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) { diff --git a/lib/controllers/horario_controller.dart b/lib/controllers/horario_controller.dart index aac0bb3..02cdb85 100644 --- a/lib/controllers/horario_controller.dart +++ b/lib/controllers/horario_controller.dart @@ -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'; @@ -85,12 +85,12 @@ class HorarioController extends GetxController { @override onInit() { - if (Get.find().selectedCarrera.value != null) { - getHorarioData(Get.find().selectedCarrera.value); + if (Get.find().selectedCarrera.value != null) { + getHorarioData(Get.find().selectedCarrera.value); } ever( - Get.find().selectedCarrera, + Get.find().selectedCarrera, (carrera) => getHorarioData(carrera), ); _init(); diff --git a/lib/controllers/user_controller.dart b/lib/controllers/user_controller.dart index 9906f5a..5b5c16a 100644 --- a/lib/controllers/user_controller.dart +++ b/lib/controllers/user_controller.dart @@ -3,7 +3,9 @@ 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/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'; @@ -18,18 +20,34 @@ class UserController extends GetxController { static UserController get to => Get.find(); + final user = Rxn(null); + final selectedCarrera = Rxn(); + + @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 login(String correo, String contrasenia) async { try { final user = await AuthService.login(correo, contrasenia); - if (user.token != null) { - _box.write(_storageTokenKey, user.token!); - } - _box.write(_storageFirstTimeKey, true); - await _secureStorage.write(key: _storagePasswordKey, value: contrasenia); - + _storeCredentials(user, contrasenia); _storeUser(user); return user; @@ -43,19 +61,12 @@ class UserController extends GetxController { } bool get isLoggedIn { - try { - String? token = _box.read(_storageTokenKey); - Usuario? user = _getUser(); - - return token != null && token.isNotEmpty && user != null; - } catch (e) { - return false; - } + return user.value != null; } Future logOut() async { try { - _box.remove(_storageTokenKey); + invalidateToken(); _box.remove(_storageUserKey); await _secureStorage.deleteAll(); try { @@ -69,8 +80,7 @@ class UserController extends GetxController { Future refreshToken() async { try { - final user = getUser(); - final email = user.correoUtem; + final email = user.value?.correoUtem; final password = await _secureStorage.read(key: _storagePasswordKey); if (email != null && password != null) { @@ -86,18 +96,18 @@ class UserController extends GetxController { } } - static void _storeUser(Usuario user) async { - _box.write(_storageUserKey, jsonEncode(user.toJson())); - } + void _storeUser(Usuario userToStore) async { + user.value = userToStore; - Usuario getUser() { - final user = _getUser(); - if (user == null) throw Exception("No se ha encontrado el usuario"); + _box.write(_storageUserKey, jsonEncode(userToStore.toJson())); + } - return user; + static void _storeCredentials(Usuario user, String contrasenia) async { + _box.write(_storageTokenKey, user.token); + await _secureStorage.write(key: _storagePasswordKey, value: contrasenia); } - Usuario? _getUser() { + Usuario? _getStoredUser() { final user = _box.read(_storageUserKey); if (user == null) return null; @@ -105,17 +115,21 @@ class UserController extends GetxController { } static void _storeToken(String token) async { - _box.write('token', token); + _box.write(_storageTokenKey, token); } String getToken() { - final token = _box.read('token'); + final token = _box.read(_storageTokenKey); if (token == null) throw Exception("No se ha encontrado el token"); return token; } void invalidateToken() async { - _box.remove('token'); + _box.remove(_storageTokenKey); + } + + void selectCarrera(Carrera carrera) { + selectedCarrera.value = carrera; } } diff --git a/lib/main.dart b/lib/main.dart index fffedc9..e5372cd 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -41,27 +41,9 @@ void main() async { ); } -class MiUtem extends StatefulWidget { - @override - State createState() => _MiUtemState(); -} - -class _MiUtemState extends State { +class MiUtem extends StatelessWidget { final FirebaseAnalytics analytics = FirebaseAnalytics.instance; -/* final calculatorController = Get.put(CalculatorController()); - - @override - void initState() { - if (UserController.to.isLoggedIn) { - final user = UserController.to.getUser(); - AnalyticsService.setUser(user); - } else { - AnalyticsService.removeUser(); - } - super.initState(); - } */ - @override Widget build(BuildContext context) { FlutterUxcam.optIntoSchematicRecordings(); diff --git a/lib/screens/credencial_screen.dart b/lib/screens/credencial_screen.dart index b5ef925..9ad5e81 100644 --- a/lib/screens/credencial_screen.dart +++ b/lib/screens/credencial_screen.dart @@ -1,17 +1,14 @@ import 'package:flutter/material.dart'; import 'package:flutter_windowmanager/flutter_windowmanager.dart'; +import 'package:get/get.dart'; import 'package:mdi/mdi.dart'; -import 'package:mi_utem/controllers/carreras_controller.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/review_service.dart'; import 'package:mi_utem/widgets/credencial_card.dart'; import 'package:mi_utem/widgets/custom_app_bar.dart'; import 'package:mi_utem/widgets/custom_error_widget.dart'; import 'package:mi_utem/widgets/flip_widget.dart'; -import 'package:mi_utem/widgets/loading_indicator.dart'; class CredencialScreen extends StatefulWidget { CredencialScreen({ @@ -23,15 +20,12 @@ class CredencialScreen extends StatefulWidget { } class _CredencialScreenState extends State { - Future? _future; - Usuario? _usuario; FlipController _flipController = FlipController(); @override void initState() { ReviewService.addScreen("CredencialScreen"); _secureScreen(); - _future = _getData(); super.initState(); } @@ -49,109 +43,46 @@ class _CredencialScreenState extends State { super.dispose(); } - Future _getData() async { - try { - Usuario usuario = UserController.to.getUser(); - setState(() { - _usuario = usuario; - }); - return usuario; - } catch (e) { - throw e; - } - } + UserController get controller => UserController.to; @override Widget build(BuildContext context) { - Carrera? carreraActiva = CarrerasController.to.selectedCarrera.value; - return Scaffold( - appBar: CustomAppBar( - title: Text("Credencial universitaria"), - actions: [ - IconButton( - icon: Icon(_flipController.actualFace == FlipController.front - ? Icons.info - : Mdi.accountCircle), - onPressed: () { - _flipController.flip!(); - }, - ), - ], - ), - backgroundColor: Colors.grey[200], - body: FutureBuilder( - future: _future, - builder: (context, snapshot) { - if (snapshot.hasError) { + appBar: CustomAppBar( + title: Text("Credencial universitaria"), + actions: [ + IconButton( + icon: Icon(_flipController.actualFace == FlipController.front + ? Icons.info + : Mdi.accountCircle), + onPressed: () { + _flipController.flip!(); + }, + ), + ], + ), + backgroundColor: Colors.grey[200], + body: Obx(() { + final user = controller.user.value; + final selectedCarrera = controller.selectedCarrera.value; + + if (user == null || selectedCarrera == null) { return CustomErrorWidget( - title: "Ocurrió un error al generar tu crendencial", - error: snapshot.error); - } else { - if (snapshot.hasData) { - if (_usuario!.rut != null && - carreraActiva!.nombre != null && - carreraActiva.nombre!.isNotEmpty) { - return Center( - child: SafeArea( - child: CredencialCard( - usuario: _usuario, - carrera: carreraActiva, - controller: _flipController, - onFlip: (direction) => _onFlip(), - ), - ), - ); - } else { - return Container( - padding: EdgeInsets.all(20), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Text( - "😕", - textAlign: TextAlign.center, - style: TextStyle( - fontSize: 50, - ), - ), - Container(height: 15), - Text( - "Ocurrió un error al generar tu credencial", - textAlign: TextAlign.center, - style: TextStyle( - fontWeight: FontWeight.bold, - fontSize: 18, - ), - ), - Container(height: 15), - Text( - snapshot.error.toString(), - textAlign: TextAlign.center, - ), - ], - ), - ); - } - } else { - return Container( - padding: EdgeInsets.all(20), - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - child: Center( - child: LoadingIndicator(), - ), - ), - ], - ), - ); - } + title: "Ocurrió un error al generar tu crendencial", + ); } - }, - ), - ); + + return Center( + child: SafeArea( + child: CredencialCard( + usuario: user, + carrera: selectedCarrera, + controller: _flipController, + onFlip: (direction) => _onFlip(), + ), + ), + ); + })); } void _onFlip() { diff --git a/lib/screens/usuario_screen.dart b/lib/screens/usuario_screen.dart index ca54983..7b9b5f7 100644 --- a/lib/screens/usuario_screen.dart +++ b/lib/screens/usuario_screen.dart @@ -59,7 +59,7 @@ class _UsuarioScreenState extends State { _usuario = usuario; }); } else { - usuario = UserController.to.getUser(); + usuario = UserController.to.user.value!; setState(() { _usuario = usuario; }); @@ -78,7 +78,7 @@ class _UsuarioScreenState extends State { ); try { - Usuario usuario = await PerfilService.changeFoto(imagen); + Usuario? usuario = await PerfilService.changeFoto(imagen); Get.back(); setState(() { diff --git a/lib/services/asignaturas_service.dart b/lib/services/asignaturas_service.dart index 144151b..611ed9a 100644 --- a/lib/services/asignaturas_service.dart +++ b/lib/services/asignaturas_service.dart @@ -14,7 +14,7 @@ class AsignaturasService { bool forceRefresh = false, }) async { final uri = "/v1/carreras/$carreraId/asignaturas"; - final user = UserController.to.getUser(); + final user = UserController.to.user.value; try { Response response = await _dio.get( @@ -22,7 +22,7 @@ class AsignaturasService { options: buildCacheOptions( Duration(days: 7), forceRefresh: forceRefresh, - subKey: user.rut?.numero.toString(), + subKey: user?.rut?.numero.toString(), ), ); @@ -40,7 +40,7 @@ class AsignaturasService { bool forceRefresh = false, }) async { final uri = "/v1/asignaturas/$codigo"; - final user = UserController.to.getUser(); + final user = UserController.to.user.value; try { Response response = await _dio.get( @@ -48,7 +48,7 @@ class AsignaturasService { options: buildCacheOptions( Duration(days: 7), forceRefresh: forceRefresh, - subKey: user.rut?.numero.toString(), + subKey: user?.rut?.numero.toString(), ), ); diff --git a/lib/services/carreras_service.dart b/lib/services/carreras_service.dart index 547756d..c21cba4 100644 --- a/lib/services/carreras_service.dart +++ b/lib/services/carreras_service.dart @@ -9,14 +9,14 @@ class CarreraService { static Future> getCarreras({bool forceRefresh = false}) async { const uri = "/v1/carreras"; - final user = UserController.to.getUser(); + final user = UserController.to.user.value; Response response = await _dio.get( uri, options: buildCacheOptions( Duration(days: 7), forceRefresh: forceRefresh, - subKey: user.rut?.numero.toString(), + subKey: user?.rut?.numero.toString(), ), ); diff --git a/lib/services/grades_service.dart b/lib/services/grades_service.dart index 33b46a7..67a65a8 100644 --- a/lib/services/grades_service.dart +++ b/lib/services/grades_service.dart @@ -17,7 +17,7 @@ class GradesService { bool saveGrades = true, }) async { final uri = "/v1/carreras/$carreraId/asignaturas/$asignaturaId/notas"; - final user = UserController.to.getUser(); + final user = UserController.to.user.value; Response response = await _dio.get( uri, @@ -25,7 +25,7 @@ class GradesService { Duration(days: 1), maxStale: Duration(days: 7), forceRefresh: forceRefresh, - subKey: user.rut?.numero.toString(), + subKey: user?.rut?.numero.toString(), ), ); diff --git a/lib/services/horarios_service.dart b/lib/services/horarios_service.dart index d2f52b0..bdcf22a 100644 --- a/lib/services/horarios_service.dart +++ b/lib/services/horarios_service.dart @@ -14,7 +14,7 @@ class HorarioService { bool forceRefresh = false, }) async { final uri = "/v1/carreras/$carreraId/horarios"; - final user = UserController.to.getUser(); + final user = UserController.to.user.value; try { Response response = await _dio.get( @@ -22,7 +22,7 @@ class HorarioService { options: buildCacheOptions( Duration(days: 30), forceRefresh: true, - subKey: user.rut?.numero.toString(), + subKey: user?.rut?.numero.toString(), ), ); diff --git a/lib/services/perfil_service.dart b/lib/services/perfil_service.dart index e46977b..3d87772 100644 --- a/lib/services/perfil_service.dart +++ b/lib/services/perfil_service.dart @@ -10,7 +10,7 @@ class PerfilService { static final Dio _dio = DioMiUtemClient.authDio; static final GetStorage box = GetStorage(); - static Future changeFoto(String imagen) async { + static Future changeFoto(String imagen) async { String uri = "/v1/usuarios/foto"; try { @@ -22,9 +22,7 @@ class PerfilService { box.write('fotoUrl', fotoUrl); - Usuario usuario = UserController.to.getUser(); - - return usuario; + return UserController.to.user.value; } on DioError catch (e) { print(e.message); throw e; @@ -57,13 +55,13 @@ class PerfilService { try { String? fcmToken = await NotificationService.fcm.requestFirebaseAppToken(); - Usuario usuario = UserController.to.getUser(); + Usuario? usuario = UserController.to.user.value; CollectionReference usuariosCollection = FirebaseFirestore.instance.collection('usuarios'); await PerfilService.deleteFcmToken(); - usuariosCollection.doc(usuario.rut!.numero.toString()).set( + usuariosCollection.doc(usuario!.rut!.numero.toString()).set( { "fcmTokens": FieldValue.arrayUnion([fcmToken]), }, diff --git a/lib/services/permisos_covid_service.dart b/lib/services/permisos_covid_service.dart index 8b2bbbe..f85b330 100644 --- a/lib/services/permisos_covid_service.dart +++ b/lib/services/permisos_covid_service.dart @@ -14,9 +14,9 @@ class PermisosCovidService { {bool forceRefresh = false}) async { const uri = "/v1/permisos"; - final user = UserController.to.getUser(); + final user = UserController.to.user.value; - logger.d("Obteniendo permisos de ${user.rut?.numero}"); + logger.d("Obteniendo permisos de ${user?.rut?.numero}"); try { Response response = await _dio.post( @@ -25,7 +25,7 @@ class PermisosCovidService { Duration(days: 300), maxStale: Duration(days: 300), forceRefresh: forceRefresh, - subKey: user.rut?.numero.toString(), + subKey: user?.rut?.numero.toString(), ), ); @@ -42,7 +42,7 @@ class PermisosCovidService { }) async { final uri = "/v1/permisos/$id"; - final user = UserController.to.getUser(); + final user = UserController.to.user.value; try { Response response = await _dio.post( @@ -51,7 +51,7 @@ class PermisosCovidService { Duration(days: 180), maxStale: Duration(days: 365), forceRefresh: forceRefresh, - subKey: user.rut?.numero.toString(), + subKey: user?.rut?.numero.toString(), ), ); From b172488ed148378de52f4359229452a211df56f2 Mon Sep 17 00:00:00 2001 From: Jorge Verdugo Date: Sun, 15 Oct 2023 23:36:54 -0300 Subject: [PATCH 5/8] Menu dinamico con roles --- lib/config/router.dart | 8 +- lib/controllers/user_controller.dart | 18 ++ lib/models/carrera.dart | 4 + lib/models/usuario.dart | 28 ++- lib/screens/{ => main}/main_screen.dart | 33 +-- lib/screens/main/widgets/greetings.dart | 41 ++++ lib/services/remote_config/defaults.dart | 44 ++-- lib/services/remote_config/remote_config.dart | 11 +- lib/widgets/custom_drawer.dart | 212 +++++++++++------- 9 files changed, 258 insertions(+), 141 deletions(-) rename lib/screens/{ => main}/main_screen.dart (72%) create mode 100644 lib/screens/main/widgets/greetings.dart diff --git a/lib/config/router.dart b/lib/config/router.dart index 07addc0..8af9e35 100644 --- a/lib/config/router.dart +++ b/lib/config/router.dart @@ -10,7 +10,7 @@ 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'; @@ -25,11 +25,7 @@ final _loginPage = GetPage( final _homePage = GetPage( name: Routes.home, bindings: [QrPassesBinding()], - page: () { - final usuario = UserController.to.user.value; - - return MainScreen(usuario: usuario!); - }, + page: () => MainScreen(), middlewares: [OnlyAuthMiddleware()], ); diff --git a/lib/controllers/user_controller.dart b/lib/controllers/user_controller.dart index 5b5c16a..238acc5 100644 --- a/lib/controllers/user_controller.dart +++ b/lib/controllers/user_controller.dart @@ -3,6 +3,7 @@ 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'; @@ -23,6 +24,23 @@ class UserController extends GetxController { final user = Rxn(null); final selectedCarrera = Rxn(); + List get roles { + final roles = []; + + 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(); diff --git a/lib/models/carrera.dart b/lib/models/carrera.dart index e42b32b..b7f5cb7 100644 --- a/lib/models/carrera.dart +++ b/lib/models/carrera.dart @@ -1,6 +1,8 @@ import 'package:recase/recase.dart'; class Carrera { + static const _stateActive = 'Regular'; + String? id; String? nombre; String? estado; @@ -9,6 +11,8 @@ class Carrera { Carrera({this.id, this.nombre, this.estado, this.codigo, this.plan}); + bool get isActive => estado == _stateActive; + factory Carrera.fromJson(Map? json) { if (json == null) { return Carrera(); diff --git a/lib/models/usuario.dart b/lib/models/usuario.dart index 9f7df1e..21d8e8e 100644 --- a/lib/models/usuario.dart +++ b/lib/models/usuario.dart @@ -7,6 +7,32 @@ enum Role { hasLunchBenefit, } +extension RoleExtension on Role { + String get name { + switch (this) { + case Role.hasCareers: + return 'hasCareers'; + case Role.hasActiveCareer: + return 'hasActiveCareer'; + case Role.hasLunchBenefit: + return 'hasLunchBenefit'; + } + } + + static Role? fromName(String name) { + switch (name) { + case 'hasCareers': + return Role.hasCareers; + case 'hasActiveCareer': + return Role.hasActiveCareer; + case 'hasLunchBenefit': + return Role.hasLunchBenefit; + default: + return null; + } + } +} + class Usuario { String? nombre; String? nombres; @@ -16,7 +42,6 @@ class Usuario { String? token; String? fotoUrl; Rut? rut; - List roles; Usuario({ this.correoUtem, @@ -27,7 +52,6 @@ class Usuario { this.fotoUrl, this.apellidos, this.rut, - this.roles = const [], }); factory Usuario.fromJson(Map? json) { diff --git a/lib/screens/main_screen.dart b/lib/screens/main/main_screen.dart similarity index 72% rename from lib/screens/main_screen.dart rename to lib/screens/main/main_screen.dart index bd0759d..93d3634 100644 --- a/lib/screens/main_screen.dart +++ b/lib/screens/main/main_screen.dart @@ -1,13 +1,8 @@ -import "dart:convert"; -import "dart:math"; - import 'package:flutter/foundation.dart'; import "package:flutter/material.dart"; import "package:flutter/services.dart"; -import "package:flutter_markdown/flutter_markdown.dart"; -import "package:get/get.dart"; import 'package:mi_utem/controllers/grades_changes_controller.dart'; -import "package:mi_utem/models/usuario.dart"; +import "package:mi_utem/screens/main/widgets/greetings.dart"; import "package:mi_utem/services/perfil_service.dart"; import "package:mi_utem/services/remote_config/remote_config.dart"; import "package:mi_utem/services/review_service.dart"; @@ -19,8 +14,7 @@ import "package:mi_utem/widgets/permisos_section.dart"; import "package:mi_utem/widgets/quick_menu_section.dart"; class MainScreen extends StatefulWidget { - final Usuario usuario; - MainScreen({Key? key, required this.usuario}) : super(key: key); + MainScreen({Key? key}) : super(key: key); @override _MainScreenState createState() => _MainScreenState(); @@ -50,22 +44,13 @@ class _MainScreenState extends State { super.dispose(); } - String get _greetingText { - List texts = jsonDecode(RemoteConfigService.greetings); - - Random random = new Random(); - String text = texts[random.nextInt(texts.length)]; - text = text.replaceAll("%name", widget.usuario.primerNombre); - return text; - } - @override Widget build(BuildContext context) { final banners = RemoteConfigService.banners; return Scaffold( appBar: CustomAppBar(title: Text("Inicio")), - drawer: CustomDrawer(usuario: widget.usuario), + drawer: CustomDrawer(), floatingActionButton: kDebugMode ? FloatingActionButton( onPressed: () { @@ -83,17 +68,7 @@ class _MainScreenState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Container(height: 20), - Container( - padding: EdgeInsets.symmetric(horizontal: 20), - width: double.infinity, - child: MarkdownBody( - data: _greetingText, - styleSheet: MarkdownStyleSheet( - p: Get.textTheme.displayMedium! - .copyWith(fontWeight: FontWeight.normal), - ), - ), - ), + MainScreenGreetings(), Container(height: 20), PermisosCovidSection(), Container(height: 20), diff --git a/lib/screens/main/widgets/greetings.dart b/lib/screens/main/widgets/greetings.dart new file mode 100644 index 0000000..f73b28b --- /dev/null +++ b/lib/screens/main/widgets/greetings.dart @@ -0,0 +1,41 @@ +import 'dart:math'; + +import 'package:flutter/material.dart'; +import 'package:flutter_markdown/flutter_markdown.dart'; +import 'package:get/get.dart'; +import 'package:mi_utem/controllers/user_controller.dart'; +import 'package:mi_utem/services/remote_config/remote_config.dart'; + +class MainScreenGreetings extends StatelessWidget { + const MainScreenGreetings({ + Key? key, + }) : super(key: key); + + String getGreetingText(String firstName) { + List texts = RemoteConfigService.greetings; + + Random random = new Random(); + String text = texts[random.nextInt(texts.length)]; + text = text.replaceAll("%name", firstName); + return text; + } + + @override + Widget build(BuildContext context) { + return Container( + padding: EdgeInsets.symmetric(horizontal: 20), + width: double.infinity, + child: Obx( + () => MarkdownBody( + data: getGreetingText( + UserController.to.user.value?.primerNombre ?? "Desconocido", + ), + styleSheet: MarkdownStyleSheet( + p: Get.textTheme.displayMedium! + .copyWith(fontWeight: FontWeight.normal), + ), + ), + ), + ); + } +} diff --git a/lib/services/remote_config/defaults.dart b/lib/services/remote_config/defaults.dart index eaba945..1d3a098 100644 --- a/lib/services/remote_config/defaults.dart +++ b/lib/services/remote_config/defaults.dart @@ -185,53 +185,45 @@ final _defaults = { RemoteConfigServiceKeys.egHabilitados: true, RemoteConfigServiceKeys.drawerMenu: jsonEncode([ { - "nombre": "Perfil", - "icono": { + "title": "Perfil", + "icon": { "codePoint": Icons.person.codePoint, "fontFamily": 'MaterialIcons' }, - "mostrar": true, - "esNuevo": false + "route": Routes.perfil, + "show": true, }, { - "nombre": "Asignaturas", - "icono": { + "title": "Asignaturas", + "icon": { "codePoint": Icons.book.codePoint, "fontFamily": 'MaterialIcons' }, - "mostrar": true, - "esNuevo": false + "route": Routes.asignaturas, + "show": true, }, { - "nombre": "Horario", - "icono": { + "title": "Horario", + "icon": { "codePoint": Mdi.clockTimeEight.codePoint, "fontFamily": 'Material Design Icons', "fontPackage": "mdi" }, - "mostrar": true, - "esNuevo": false + "route": Routes.horario, + "show": true }, { - "nombre": "Credencial", - "icono": { + "title": "Credencial", + "icon": { "codePoint": Mdi.cardAccountDetails.codePoint, "fontFamily": 'Material Design Icons', "fontPackage": "mdi" }, - "mostrar": true, - "esNuevo": true + "show": true, + "route": Routes.credencial, + "requiredRoles": ["hasActiveCareer"], + "badge": "Nuevo" }, - // { - // "nombre": "Docentes", - // "icono": { - // "codePoint": Mdi.accountTie.codePoint, - // "fontFamily": 'Material Design Icons', - // "fontPackage": "mdi" - // }, - // "mostrar": true, - // "esNuevo": true - // }, ]), RemoteConfigServiceKeys.greetings: jsonEncode(['Que gusto verte, **%name**']), RemoteConfigServiceKeys.quickMenu: jsonEncode([ diff --git a/lib/services/remote_config/remote_config.dart b/lib/services/remote_config/remote_config.dart index c288086..d639adc 100644 --- a/lib/services/remote_config/remote_config.dart +++ b/lib/services/remote_config/remote_config.dart @@ -4,8 +4,10 @@ import 'package:firebase_remote_config/firebase_remote_config.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:mdi/mdi.dart'; +import 'package:mi_utem/config/routes.dart'; import 'package:mi_utem/services/remote_config/keys.dart'; import 'package:mi_utem/widgets/banner.dart'; +import 'package:mi_utem/widgets/custom_drawer.dart'; part 'defaults.dart'; @@ -55,8 +57,13 @@ class RemoteConfigService { _getString(RemoteConfigServiceKeys.homeProntoTexto); static final prontoEg = _getString(RemoteConfigServiceKeys.prontoEg); static final egHabilitados = _getBool(RemoteConfigServiceKeys.egHabilitados); - static final drawerMenu = _getString(RemoteConfigServiceKeys.drawerMenu); - static final greetings = _getString(RemoteConfigServiceKeys.greetings); + static final drawerMenu = IDrawerItem.fromJsonList( + jsonDecode(_getString(RemoteConfigServiceKeys.drawerMenu))); + static final greetings = + (jsonDecode(_getString(RemoteConfigServiceKeys.greetings)) + as List) + .map((e) => e.toString()) + .toList(); static final quickMenu = _getString(RemoteConfigServiceKeys.quickMenu); factory RemoteConfigService() => instance; diff --git a/lib/widgets/custom_drawer.dart b/lib/widgets/custom_drawer.dart index fbc4163..77000e9 100644 --- a/lib/widgets/custom_drawer.dart +++ b/lib/widgets/custom_drawer.dart @@ -1,4 +1,4 @@ -import 'dart:convert'; +import 'dart:developer'; import 'package:badges/badges.dart' as badge; import 'package:flutter/material.dart'; @@ -12,33 +12,65 @@ import 'package:mi_utem/services/review_service.dart'; import 'package:mi_utem/themes/theme.dart'; import 'package:mi_utem/widgets/profile_photo.dart'; -class CustomDrawer extends StatelessWidget { - final Usuario usuario; - CustomDrawer({Key? key, required this.usuario}) : super(key: key); - - String? _getRoute(String? name) { - switch (name) { - case "Perfil": - return Routes.perfil; - case "Asignaturas": - return Routes.asignaturas; - case "Horario": - return Routes.horario; - case "Credencial": - return Routes.credencial; - // case "Docentes": - // return DocentesScreen(); - // break; - default: - return Routes.home; +class IDrawerItem { + final String title; + final IconData icon; + final String route; + final List requiredRoles; + final bool show; + final String? badge; + + IDrawerItem({ + required this.title, + required this.icon, + required this.route, + this.requiredRoles = const [], + this.show = true, + this.badge, + }); + + factory IDrawerItem.fromJson(Map json) { + final roles = []; + if (json['requiredRoles'] != null) { + for (String roleString in json['requiredRoles']) { + final role = RoleExtension.fromName(roleString); + if (role != null) { + roles.add(role); + } + } } + + return IDrawerItem( + title: json['title'], + icon: IconData( + json['icon']['codePoint'], + fontFamily: json['icon']['fontFamily'], + fontPackage: json['icon']['fontPackage'], + ), + route: json['route'], + badge: json['badge'], + show: json['show'] ?? true, + requiredRoles: roles, + ); } - List? get _menu { - return jsonDecode(RemoteConfigService.drawerMenu) - .where((e) => e['mostrar'] == true) - .toList(); + static List fromJsonList(dynamic json) { + if (json == null) { + return []; + } + List list = []; + for (var item in json) { + list.add(IDrawerItem.fromJson(item)); + } + return list; } +} + +List _filteredMenu = + RemoteConfigService.drawerMenu.where((e) => e.show).toList(); + +class CustomDrawer extends StatelessWidget { + CustomDrawer({Key? key}) : super(key: key); @override Widget build(BuildContext context) { @@ -57,59 +89,39 @@ class CustomDrawer extends StatelessWidget { mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - UserAccountsDrawerHeader( - accountEmail: Text( - usuario.correoUtem ?? usuario.correoPersonal ?? ""), - accountName: Text( - usuario.nombreCompleto ?? "", - style: - TextStyle(fontSize: 16, fontWeight: FontWeight.w500), - ), - currentAccountPicture: ProfilePhoto( - usuario: usuario, - radius: 30, - ), - decoration: BoxDecoration( - gradient: LinearGradient( - begin: Alignment.bottomLeft, - end: Alignment.topRight, - colors: [ - MainTheme.utemAzul, - MainTheme.utemVerde, - ], + Obx(() { + final user = UserController.to.user.value; + return UserAccountsDrawerHeader( + accountEmail: Text(user?.correoUtem ?? + user?.correoPersonal ?? + "Sin correo"), + accountName: Text( + user?.nombreCompleto ?? "Sin nombre", + style: TextStyle( + fontSize: 16, fontWeight: FontWeight.w500), + ), + currentAccountPicture: ProfilePhoto( + usuario: user, + radius: 30, + ), + decoration: BoxDecoration( + gradient: LinearGradient( + begin: Alignment.bottomLeft, + end: Alignment.topRight, + colors: [ + MainTheme.utemAzul, + MainTheme.utemVerde, + ], + ), + ), + ); + }), + for (var e in _filteredMenu) + Obx( + () => CustomDrawerItem( + item: e, + currentUserRoles: UserController.to.roles, ), - ), - ), - for (var e in _menu!) - ListTile( - leading: Icon(IconData(e["icono"]["codePoint"], - fontFamily: e["icono"]["fontFamily"], - fontPackage: e["icono"]["fontPackage"])), - title: Text(e["nombre"]), - trailing: e["esNuevo"] - ? badge.Badge( - shape: badge.BadgeShape.square, - borderRadius: BorderRadius.circular(10), - padding: EdgeInsets.symmetric( - horizontal: 6, vertical: 3), - elevation: 0, - badgeContent: Text( - 'Nuevo', - style: TextStyle( - color: Colors.white, - fontSize: 10, - fontWeight: FontWeight.bold, - ), - ), - ) - : null, - onTap: () async { - String? route = _getRoute(e["nombre"]); - if (route != null) { - Get.toNamed(route); - ReviewService.checkAndRequestReview(); - } - }, ), Expanded( child: SafeArea( @@ -147,3 +159,51 @@ class CustomDrawer extends StatelessWidget { ); } } + +class CustomDrawerItem extends StatelessWidget { + const CustomDrawerItem({ + Key? key, + required this.item, + required this.currentUserRoles, + }) : super(key: key); + + final IDrawerItem item; + final List currentUserRoles; + + @override + Widget build(BuildContext context) { + final currentUserRolesSet = currentUserRoles.toSet(); + + log("CustomDrawerItem: ${item.title} requiredRoles ${item.requiredRoles} currentUserRoles $currentUserRoles"); + + if (item.requiredRoles.isNotEmpty && + !currentUserRolesSet.containsAll(item.requiredRoles)) { + return Container(); + } + + return ListTile( + leading: Icon(item.icon), + title: Text(item.title), + trailing: item.badge != null + ? badge.Badge( + shape: badge.BadgeShape.square, + borderRadius: BorderRadius.circular(10), + padding: EdgeInsets.symmetric(horizontal: 6, vertical: 3), + elevation: 0, + badgeContent: Text( + item.badge!, + style: TextStyle( + color: Colors.white, + fontSize: 10, + fontWeight: FontWeight.bold, + ), + ), + ) + : null, + onTap: () async { + Get.toNamed(item.route); + ReviewService.checkAndRequestReview(); + }, + ); + } +} From d42bba17ee7db7253ac072351210fca795df20f9 Mon Sep 17 00:00:00 2001 From: Jorge Verdugo Date: Sun, 15 Oct 2023 23:47:31 -0300 Subject: [PATCH 6/8] Se solucionan algunos problemas --- lib/services/remote_config/defaults.dart | 2 +- lib/services/remote_config/remote_config.dart | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/services/remote_config/defaults.dart b/lib/services/remote_config/defaults.dart index 1d3a098..6acee44 100644 --- a/lib/services/remote_config/defaults.dart +++ b/lib/services/remote_config/defaults.dart @@ -221,7 +221,7 @@ final _defaults = { }, "show": true, "route": Routes.credencial, - "requiredRoles": ["hasActiveCareer"], + "requiredRoles": [Role.hasActiveCareer.name], "badge": "Nuevo" }, ]), diff --git a/lib/services/remote_config/remote_config.dart b/lib/services/remote_config/remote_config.dart index d639adc..bb21649 100644 --- a/lib/services/remote_config/remote_config.dart +++ b/lib/services/remote_config/remote_config.dart @@ -5,6 +5,7 @@ import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:mdi/mdi.dart'; import 'package:mi_utem/config/routes.dart'; +import 'package:mi_utem/models/usuario.dart'; import 'package:mi_utem/services/remote_config/keys.dart'; import 'package:mi_utem/widgets/banner.dart'; import 'package:mi_utem/widgets/custom_drawer.dart'; From 775abf8794add2992b3f9aafdbd7345ba1b7225c Mon Sep 17 00:00:00 2001 From: Jorge Verdugo Date: Mon, 16 Oct 2023 00:05:27 -0300 Subject: [PATCH 7/8] Se corrige el logout --- lib/controllers/user_controller.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/controllers/user_controller.dart b/lib/controllers/user_controller.dart index 238acc5..61c4c3c 100644 --- a/lib/controllers/user_controller.dart +++ b/lib/controllers/user_controller.dart @@ -90,6 +90,7 @@ class UserController extends GetxController { try { await PerfilService.deleteFcmToken(); } catch (e) {} + user.value = null; } catch (e) { print(e.toString()); throw e; From d2e61c77998553643573b14f7e2f0998699b697c Mon Sep 17 00:00:00 2001 From: Francisco Solis <30329003+im-fran@users.noreply.github.com> Date: Tue, 17 Oct 2023 17:32:58 -0300 Subject: [PATCH 8/8] patch: ordenado algunos archivos y reparado error con calculadora MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Se han movido algunos archivos a sus carpetas correspondientes para tener un mejor orden. * Se ha reparado un error (por borrar la inicialización del controlador de la calculadora) Signed-off-by: Tomás L <59000698+XhrdTLS@users.noreply.github.com> --- lib/config/{ => routes}/router.dart | 6 +++--- lib/config/{ => routes}/routes.dart | 0 lib/controllers/notification_controller.dart | 2 +- lib/main.dart | 7 +++++-- .../{ => asignatura}/asignatura_detalle_screen.dart | 8 ++++---- .../{ => asignatura}/asignatura_estudiantes_tab.dart | 0 lib/screens/{ => asignatura}/asignatura_notas_tab.dart | 0 lib/screens/{ => asignatura}/asignatura_resumen_tab.dart | 0 .../{ => asignatura}/asignaturas_lista_screen.dart | 2 +- lib/screens/docentes_screen.dart | 2 +- lib/screens/login_screen/login_screen.dart | 2 +- lib/screens/permiso_covid_screen.dart | 2 +- lib/screens/splash_screen.dart | 2 +- lib/screens/usuario_screen.dart | 2 +- lib/services/remote_config/remote_config.dart | 2 +- lib/widgets/acerca_dialog.dart | 2 +- lib/widgets/acerca_screen.dart | 2 +- lib/widgets/bloque_ramo_card.dart | 2 ++ lib/widgets/custom_drawer.dart | 2 +- lib/widgets/default_network_image.dart | 2 +- lib/widgets/dialogs/not_ready_dialog.dart | 2 +- lib/widgets/permiso_card.dart | 2 +- lib/widgets/quick_menu_card.dart | 2 +- lib/widgets/sad_dialog.dart | 2 +- 24 files changed, 30 insertions(+), 25 deletions(-) rename lib/config/{ => routes}/router.dart (93%) rename lib/config/{ => routes}/routes.dart (100%) rename lib/screens/{ => asignatura}/asignatura_detalle_screen.dart (92%) rename lib/screens/{ => asignatura}/asignatura_estudiantes_tab.dart (100%) rename lib/screens/{ => asignatura}/asignatura_notas_tab.dart (100%) rename lib/screens/{ => asignatura}/asignatura_resumen_tab.dart (100%) rename lib/screens/{ => asignatura}/asignaturas_lista_screen.dart (98%) diff --git a/lib/config/router.dart b/lib/config/routes/router.dart similarity index 93% rename from lib/config/router.dart rename to lib/config/routes/router.dart index 8af9e35..52b83c3 100644 --- a/lib/config/router.dart +++ b/lib/config/routes/router.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; import 'package:get/route_manager.dart'; -import 'package:mi_utem/config/routes.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_detalle_screen.dart'; -import 'package:mi_utem/screens/asignaturas_lista_screen.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'; diff --git a/lib/config/routes.dart b/lib/config/routes/routes.dart similarity index 100% rename from lib/config/routes.dart rename to lib/config/routes/routes.dart diff --git a/lib/controllers/notification_controller.dart b/lib/controllers/notification_controller.dart index 7e2950f..b4bc4c1 100644 --- a/lib/controllers/notification_controller.dart +++ b/lib/controllers/notification_controller.dart @@ -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'; diff --git a/lib/main.dart b/lib/main.dart index e5372cd..cceb079 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -9,8 +9,10 @@ import 'package:flutter_uxcam/flutter_uxcam.dart'; import 'package:get/get.dart'; import 'package:get_storage/get_storage.dart'; import 'package:mi_utem/config/constants.dart'; -import 'package:mi_utem/config/router.dart'; -import 'package:mi_utem/config/routes.dart'; +import 'package:mi_utem/config/routes/router.dart'; +import 'package:mi_utem/config/routes/routes.dart'; +import 'package:mi_utem/controllers/asignatura_controller.dart'; +import 'package:mi_utem/controllers/calculator_controller.dart'; import 'package:mi_utem/controllers/carreras_controller.dart'; import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/services/background_service.dart'; @@ -62,6 +64,7 @@ class MiUtem extends StatelessWidget { initialBinding: BindingsBuilder(() { Get.put(UserController(), permanent: true); Get.put(CarrerasController(), permanent: true); + Get.put(CalculatorController(), permanent: true); }), theme: MainTheme.theme, navigatorObservers: [ diff --git a/lib/screens/asignatura_detalle_screen.dart b/lib/screens/asignatura/asignatura_detalle_screen.dart similarity index 92% rename from lib/screens/asignatura_detalle_screen.dart rename to lib/screens/asignatura/asignatura_detalle_screen.dart index 5553079..357047d 100644 --- a/lib/screens/asignatura_detalle_screen.dart +++ b/lib/screens/asignatura/asignatura_detalle_screen.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:mdi/mdi.dart'; -import 'package:mi_utem/config/routes.dart'; +import 'package:mi_utem/config/routes/routes.dart'; import 'package:mi_utem/controllers/asignatura_controller.dart'; import 'package:mi_utem/controllers/calculator_controller.dart'; import 'package:mi_utem/models/asignatura.dart'; -import 'package:mi_utem/screens/asignatura_estudiantes_tab.dart'; -import 'package:mi_utem/screens/asignatura_notas_tab.dart'; -import 'package:mi_utem/screens/asignatura_resumen_tab.dart'; +import 'package:mi_utem/screens/asignatura/asignatura_estudiantes_tab.dart'; +import 'package:mi_utem/screens/asignatura/asignatura_notas_tab.dart'; +import 'package:mi_utem/screens/asignatura/asignatura_resumen_tab.dart'; import 'package:mi_utem/services/remote_config/remote_config.dart'; import 'package:mi_utem/services/review_service.dart'; import 'package:mi_utem/widgets/custom_app_bar.dart'; diff --git a/lib/screens/asignatura_estudiantes_tab.dart b/lib/screens/asignatura/asignatura_estudiantes_tab.dart similarity index 100% rename from lib/screens/asignatura_estudiantes_tab.dart rename to lib/screens/asignatura/asignatura_estudiantes_tab.dart diff --git a/lib/screens/asignatura_notas_tab.dart b/lib/screens/asignatura/asignatura_notas_tab.dart similarity index 100% rename from lib/screens/asignatura_notas_tab.dart rename to lib/screens/asignatura/asignatura_notas_tab.dart diff --git a/lib/screens/asignatura_resumen_tab.dart b/lib/screens/asignatura/asignatura_resumen_tab.dart similarity index 100% rename from lib/screens/asignatura_resumen_tab.dart rename to lib/screens/asignatura/asignatura_resumen_tab.dart diff --git a/lib/screens/asignaturas_lista_screen.dart b/lib/screens/asignatura/asignaturas_lista_screen.dart similarity index 98% rename from lib/screens/asignaturas_lista_screen.dart rename to lib/screens/asignatura/asignaturas_lista_screen.dart index 4ada864..4ad0d1f 100644 --- a/lib/screens/asignaturas_lista_screen.dart +++ b/lib/screens/asignatura/asignaturas_lista_screen.dart @@ -1,7 +1,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:mdi/mdi.dart'; -import 'package:mi_utem/config/routes.dart'; +import 'package:mi_utem/config/routes/routes.dart'; import 'package:mi_utem/controllers/asignaturas_controller.dart'; import 'package:mi_utem/models/asignatura.dart'; import 'package:mi_utem/services/remote_config/remote_config.dart'; diff --git a/lib/screens/docentes_screen.dart b/lib/screens/docentes_screen.dart index 5875a03..6971f07 100644 --- a/lib/screens/docentes_screen.dart +++ b/lib/screens/docentes_screen.dart @@ -1,6 +1,6 @@ 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/usuario.dart'; import 'package:mi_utem/screens/usuario_screen.dart'; import 'package:mi_utem/services/docentes_service.dart'; diff --git a/lib/screens/login_screen/login_screen.dart b/lib/screens/login_screen/login_screen.dart index e610d52..3e917db 100644 --- a/lib/screens/login_screen/login_screen.dart +++ b/lib/screens/login_screen/login_screen.dart @@ -8,7 +8,7 @@ import 'package:flutter/services.dart'; import 'package:flutter_keyboard_visibility/flutter_keyboard_visibility.dart'; import 'package:flutter_markdown/flutter_markdown.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/controllers/user_controller.dart'; import 'package:mi_utem/helpers/snackbars.dart'; import 'package:mi_utem/models/usuario.dart'; diff --git a/lib/screens/permiso_covid_screen.dart b/lib/screens/permiso_covid_screen.dart index ade51a8..d376365 100644 --- a/lib/screens/permiso_covid_screen.dart +++ b/lib/screens/permiso_covid_screen.dart @@ -7,7 +7,7 @@ import 'package:flutter_uxcam/flutter_uxcam.dart'; import 'package:get/get.dart'; import 'package:image/image.dart' as dartImage; import 'package:intl/intl.dart'; -import 'package:mi_utem/config/routes.dart'; +import 'package:mi_utem/config/routes/routes.dart'; import 'package:mi_utem/controllers/qr_pass_controller.dart'; import 'package:mi_utem/models/permiso_covid.dart'; import 'package:mi_utem/models/usuario.dart'; diff --git a/lib/screens/splash_screen.dart b/lib/screens/splash_screen.dart index 7cb983b..8d14d1f 100644 --- a/lib/screens/splash_screen.dart +++ b/lib/screens/splash_screen.dart @@ -2,7 +2,7 @@ import 'package:flare_flutter/flare_actor.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.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/services/notification_service.dart'; import 'package:package_info_plus/package_info_plus.dart'; diff --git a/lib/screens/usuario_screen.dart b/lib/screens/usuario_screen.dart index 7b9b5f7..133fcbf 100644 --- a/lib/screens/usuario_screen.dart +++ b/lib/screens/usuario_screen.dart @@ -3,7 +3,7 @@ import 'dart:core'; import 'package:clipboard/clipboard.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/controllers/user_controller.dart'; import 'package:mi_utem/models/asignatura.dart'; import 'package:mi_utem/models/usuario.dart'; diff --git a/lib/services/remote_config/remote_config.dart b/lib/services/remote_config/remote_config.dart index bb21649..d4a7c72 100644 --- a/lib/services/remote_config/remote_config.dart +++ b/lib/services/remote_config/remote_config.dart @@ -4,7 +4,7 @@ import 'package:firebase_remote_config/firebase_remote_config.dart'; import 'package:flutter/material.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:mdi/mdi.dart'; -import 'package:mi_utem/config/routes.dart'; +import 'package:mi_utem/config/routes/routes.dart'; import 'package:mi_utem/models/usuario.dart'; import 'package:mi_utem/services/remote_config/keys.dart'; import 'package:mi_utem/widgets/banner.dart'; diff --git a/lib/widgets/acerca_dialog.dart b/lib/widgets/acerca_dialog.dart index 9aba895..fdde936 100644 --- a/lib/widgets/acerca_dialog.dart +++ b/lib/widgets/acerca_dialog.dart @@ -2,7 +2,7 @@ import 'dart:async'; 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/widgets/acerca_aplicacion_content.dart'; class AcercaDialog extends StatefulWidget { diff --git a/lib/widgets/acerca_screen.dart b/lib/widgets/acerca_screen.dart index 30a7613..3a6b940 100644 --- a/lib/widgets/acerca_screen.dart +++ b/lib/widgets/acerca_screen.dart @@ -4,7 +4,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_markdown/flutter_markdown.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.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/usuario.dart'; import 'package:mi_utem/services/analytics_service.dart'; import 'package:mi_utem/services/remote_config/remote_config.dart'; diff --git a/lib/widgets/bloque_ramo_card.dart b/lib/widgets/bloque_ramo_card.dart index c69b0b6..c486533 100644 --- a/lib/widgets/bloque_ramo_card.dart +++ b/lib/widgets/bloque_ramo_card.dart @@ -1,5 +1,7 @@ import 'package:dotted_border/dotted_border.dart'; import 'package:flutter/material.dart'; +import 'package:get/get.dart'; +import 'package:mi_utem/config/routes/routes.dart'; import 'package:mi_utem/controllers/horario_controller.dart'; import 'package:mi_utem/models/horario.dart'; import 'package:mi_utem/services/analytics_service.dart'; diff --git a/lib/widgets/custom_drawer.dart b/lib/widgets/custom_drawer.dart index 77000e9..35e4859 100644 --- a/lib/widgets/custom_drawer.dart +++ b/lib/widgets/custom_drawer.dart @@ -4,7 +4,7 @@ import 'package:badges/badges.dart' as badge; import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:mdi/mdi.dart'; -import 'package:mi_utem/config/routes.dart'; +import 'package:mi_utem/config/routes/routes.dart'; import 'package:mi_utem/controllers/user_controller.dart'; import 'package:mi_utem/models/usuario.dart'; import 'package:mi_utem/services/remote_config/remote_config.dart'; diff --git a/lib/widgets/default_network_image.dart b/lib/widgets/default_network_image.dart index b73470a..565b1e1 100644 --- a/lib/widgets/default_network_image.dart +++ b/lib/widgets/default_network_image.dart @@ -1,7 +1,7 @@ import 'package:cached_network_image/cached_network_image.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/widgets/image_view_screen.dart'; class DefaultNetworkImage extends StatelessWidget { diff --git a/lib/widgets/dialogs/not_ready_dialog.dart b/lib/widgets/dialogs/not_ready_dialog.dart index f0818e5..17d0994 100644 --- a/lib/widgets/dialogs/not_ready_dialog.dart +++ b/lib/widgets/dialogs/not_ready_dialog.dart @@ -1,7 +1,7 @@ import 'package:flutter/gestures.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/themes/theme.dart'; import 'package:mi_utem/widgets/error_dialog.dart'; import 'package:url_launcher/url_launcher.dart'; diff --git a/lib/widgets/permiso_card.dart b/lib/widgets/permiso_card.dart index 876207f..c76b4cd 100644 --- a/lib/widgets/permiso_card.dart +++ b/lib/widgets/permiso_card.dart @@ -1,6 +1,6 @@ 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/permiso_covid.dart'; import 'package:mi_utem/themes/theme.dart'; diff --git a/lib/widgets/quick_menu_card.dart b/lib/widgets/quick_menu_card.dart index a333747..4ad32c3 100644 --- a/lib/widgets/quick_menu_card.dart +++ b/lib/widgets/quick_menu_card.dart @@ -2,7 +2,7 @@ import 'package:flutter/material.dart'; import 'package:get/get.dart'; import 'package:gradient_widgets/gradient_widgets.dart'; import 'package:hexcolor/hexcolor.dart'; -import 'package:mi_utem/config/routes.dart'; +import 'package:mi_utem/config/routes/routes.dart'; class QuickMenuCard extends StatelessWidget { const QuickMenuCard({Key? key, required this.card}) : super(key: key); diff --git a/lib/widgets/sad_dialog.dart b/lib/widgets/sad_dialog.dart index cf22aee..8aa10dc 100644 --- a/lib/widgets/sad_dialog.dart +++ b/lib/widgets/sad_dialog.dart @@ -1,7 +1,7 @@ import 'package:flutter/gestures.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'; final _formKey = GlobalKey();