Aplicación móvil en React Native + TypeScript para la gestión integral de compañías, tareas personales y recordatorios fiscales. Gesaccol centraliza la información crítica, sincroniza notificaciones locales y ofrece herramientas visuales para priorizar vencimientos y compromisos.
- Paneles de compañías con métricas clave (pendientes, vencidas, próximas) y filtros avanzados.
- Gestión de recordatorios con integración a canales de notificaciones locales usando
@notifee/react-native. - Calendarios empresariales configurables y sincronización automática de eventos.
- Módulo de tareas personales con recurrencias, prioridades, estados y alertas minuto a minuto.
- Experiencia adaptativa gracias al hook
useResponsivey soporte total para modo claro/oscuro. - Flujo de autenticación listo para Google Sign-In mediante
GOOGLE_WEB_CLIENT_ID.
- React Native 0.82 · React 19 usando componentes funcionales y hooks.
- TypeScript con tipados compartidos en
src/types. - React Navigation (stack + bottom tabs) para flujos multi-módulo.
- NativeWind/TailwindCSS para estilos responsivos declarativos.
- Context API (
AuthContext,ThemeContext) para estado global. - Servicios HTTP organizados en
src/servicespara empresas, recordatorios, tareas y paneles.
- Node.js >= 20 y npm actualizados (el proyecto usa
package-lock.json). - JDK 17, Android Studio + Android SDK Platform 34.
- Xcode 15.4+ y CocoaPods (solo macOS/iOS).
- Dispositivo o emulador configurado, así como Watchman y Ruby Bundler opcionalmente.
- Instala dependencias
npm install
- Revisa la configuración
- El Client ID de Google Sign-In está en
src/config/env.tsy la URL de la API ensrc/config/api.ts.
- El Client ID de Google Sign-In está en
- Inicia Metro
npm start
- Ejecuta la app
npm run android npm run ios # recuerda `bundle install && bundle exec pod install` la primera vez
npm start· Inicia Metro.npm run android/npm run ios· Compila y despliega en el emulador/dispositivo.npm run lint· Ejecuta ESLint.npm test· Corre Jest.npm run typecheck· Comprueba los tipos con TypeScript (también se ejecuta en la CI).npm run generate-icons· Genera íconos adaptativos desdescripts/generate-icons.js.npm run build:apk· Empaqueta y copia unGesaccol-debug.apkdentro dereleases/.
src/
├─ components/ # Animaciones, botones y modales reutilizables
├─ config/ # Env vars, tipos de calendario
├─ context/ # Tema y autenticación
├─ hooks/ # Hook de diseño responsivo
├─ navigation/ # Stack + tabs
├─ screens/ # Companies, Reminders, PersonalTasks, Dashboard…
├─ services/ # Llamadas HTTP y lógica de sincronización
└─ types/ # Tipados compartidos
NotificationSync(src/components/NotificationSync.tsx) es el único punto que programa las notificaciones: observa los recordatorios y tareas de la caché y llama anotificationsService.syncReminders/syncPersonalTasks, que no reprograman nada si los datos no cambiaron.- Los permisos solo se piden ante una acción del usuario (bienvenida, "Probar notificación", diagnóstico). Sin permiso, las notificaciones se programan igualmente y empiezan a mostrarse al concederlo.
- Al tocar una notificación se abre el recordatorio o la tarea correspondiente (
src/navigation/notificationNavigation.ts). Los botones "Completar" y "Posponer 1 h" funcionan sin abrir la app (src/services/notificationActions.ts). - Ajusta los tiempos y textos de las notificaciones directamente en
src/services/notificationsService.ts.
npm testLas pruebas actuales utilizan Jest y @testing-library/react-native. Agrega specs en __tests__/ o co-localizados según el módulo.
- Android (pruebas):
npm run build:apkproducereleases/Gesaccol-debug.apk. - Android (Play Store):
cd android && ./gradlew bundleReleaseproduce.build/app/outputs/bundle/release/app-release.aab, firmado con la clave de subida (ver abajo). Sin ella se firma con la clave de debug y Play Store lo rechaza. - iOS: abre
ios/AppRecordatoriosMobile.xcworkspacey genera el esquemaAppRecordatoriosMobiledesde Xcode (usar el mismoGOOGLE_WEB_CLIENT_IDen los entitlements correspondientes).
La firma se lee de cuatro variables, desde ~/.gradle/gradle.properties (nunca en el repo) o desde el entorno:
GESACCOL_UPLOAD_STORE_FILE, GESACCOL_UPLOAD_STORE_PASSWORD, GESACCOL_UPLOAD_KEY_ALIAS y GESACCOL_UPLOAD_KEY_PASSWORD.
-
Crea la clave de subida (una sola vez):
keytool -genkeypair -v -keystore gesaccol-upload.keystore -alias gesaccol -keyalg RSA -keysize 2048 -validity 10000
Guárdala fuera del repositorio, con copia de seguridad y sus contraseñas en un gestor de contraseñas. Si se pierde, no podrás publicar actualizaciones (salvo pidiendo a Google que la restablezca con Play App Signing).
-
Compilación local: añade las cuatro variables a
~/.gradle/gradle.propertiescon la ruta absoluta del.keystore. -
CI: en GitHub → Settings → Secrets and variables → Actions, crea estos secrets:
GESACCOL_UPLOAD_KEYSTORE_BASE64: el archivo en base64 (base64 -w0 gesaccol-upload.keystore; en PowerShell,[Convert]::ToBase64String([IO.File]::ReadAllBytes("gesaccol-upload.keystore"))).GESACCOL_UPLOAD_STORE_PASSWORD,GESACCOL_UPLOAD_KEY_ALIAS,GESACCOL_UPLOAD_KEY_PASSWORD.
Con ellos, el workflow genera además el AAB firmado y lo deja como artefacto (
Gesaccol-android-aab-<tag>) para subirlo a Play Console. Sin ellos, ese paso se omite.
Seguimos SemVer (MAJOR.MINOR.PATCH):
package.jsonmarca la versión vigente; Android toma de ahíversionNamey calculaversionCode(MAJOR*10000 + MINOR*100 + PATCH). ManténVERSIONigual.- Documenta cambios en
CHANGELOG.mdbajo el bloqueUnreleasedy muévelos al crear una etiqueta. - Flujo sugerido:
- Actualiza código y documentación.
- Edita
CHANGELOG.mdyVERSION/package.json. - Commit
release: vX.Y.Zy crea el taggit tag vX.Y.Z. - Ejecuta los scripts de build (
npm run build:apk, archivado iOS) y adjunta binarios en GitHub Releases.
- Reserva incrementos
MAJORpara cambios incompatibles,MINORpara features visibles yPATCHpara fixes sin breaking changes. - El workflow
Mobile Releaseen.github/workflows/release.ymlse ejecuta al crear tagsv*.*.*: corre lint, tipos y tests, genera el APK debug (y el AAB firmado si hay secrets), el build iOS para simulador, y adjunta el APK y el build iOS en GitHub Releases automáticamente.
¿Preguntas o nuevas ideas? Abre un issue o empieza un PR. 👋