Aplicación móvil híbrida para gestión de tareas, construida con Ionic 8 y Angular 20. Incluye un sistema de gamificación (XP y niveles) y usa Firebase Remote Config para habilitar o deshabilitar características, además de ajustar reglas como XP por tarea y límites por nivel sin necesidad de publicar una nueva versión. El proyecto prioriza rendimiento en listas grandes, arquitectura modular y una base mantenible para evolución continua.
- Node.js 18+
- npm 10+
- Ionic CLI 7+
- Cordova CLI 12+
- Android Studio (para Android)
- Xcode (para iOS, en macOS)
- Clona el repositorio:
git clone <URL_DEL_REPOSITORIO>
cd ToDoApp- Instala dependencias:
npm install- Ejecuta en desarrollo (web):
npm startLa app inicializa Firebase al arrancar y consulta Remote Config para controlar comportamientos de gamificación.
- Configura credenciales de Firebase en ambientes:
src/environments/environment.ts(desarrollo base)src/environments/environment.local.ts(configuración local)src/environments/environment.prod.ts(producción)
Debes definir al menos: apiKey, authDomain, projectId, appId (y opcionales como storageBucket, messagingSenderId, measurementId).
- Crea/actualiza parámetros en Firebase Remote Config:
enable_gamification(boolean): habilita/deshabilita UI y lógica de gamificación.xp_per_task(number): XP otorgada al completar tareas.max_xp_per_level(number): XP máxima por nivel.xp_penalty_on_uncheck(boolean): aplica penalización al desmarcar tareas.
-
Publica los cambios en Remote Config desde Firebase Console.
-
Ejecuta la app:
ng serve --configuration localSi no hay configuración válida de Firebase, la app usa valores por defecto para gamificación.
npm run buildSalida: www/
ionic cordova build androidAPK debug esperado en:
platforms/android/app/build/outputs/apk/debug/app-debug.apk
ionic cordova build iosLuego genera el .ipa desde Xcode (Archive/Export) abriendo platforms/ios.
- APK: Descargar APK
- IPA: Descargar IPA
Video local (evidencia): ./evidence/demo.mov
El reto principal fue integrar Remote Config dentro del flujo de arranque/ciclo de vida de Angular sin afectar la experiencia inicial de la app. También fue clave ajustar Virtual Scroll con datos dinámicos (filtros y cambios de estado) para mantener fluidez con volúmenes altos de tareas.
Se aplicó Virtual Scroll para renderizar solo elementos visibles y reducir costo de DOM. Se usó Lazy Loading con loadComponent para disminuir carga inicial. Se configuró OnPush Change Detection para limitar renders innecesarios. Además, se cuidó la gestión de Observables (desuscripción cuando aplica) para evitar fugas de memoria y degradación en sesiones largas.
La arquitectura separa responsabilidades mediante servicios especializados (SRP), modelos tipados con interfaces TypeScript y organización modular por features. Esto facilita pruebas, cambios evolutivos y escalabilidad sin acoplamientos fuertes.



