Ritmo Fit es una aplicación móvil desarrollada con React Native y Expo que permite a los usuarios gestionar sus reservas de clases de gimnasio, realizar check-in mediante códigos QR, y recibir notificaciones push sobre sus clases programadas.
- Autenticación Segura: Login con email/contraseña y autenticación biométrica (huella digital/Face ID/PIN)
- Gestión de Reservas: Reserva y cancela clases de diferentes disciplinas
- Check-in con QR: Escaneo de códigos QR para registrar asistencia
- Notificaciones Push: Recordatorios automáticos 1 hora antes de cada clase
- Long Polling: Sistema de notificaciones en tiempo real para actualizaciones de clases
- Perfil de Usuario: Gestión de datos personales y foto de perfil
- Historial: Registro completo de asistencias y calificaciones
- Recuperación de Contraseña: Sistema completo de restablecimiento de contraseña
- React Native (Expo)
- Redux Toolkit + Redux Persist (Gestión de estado)
- Expo Router (Navegación)
- React Native Paper (UI Components)
- Expo Camera (Escaneo QR)
- Expo Notifications (Notificaciones Push)
- Expo Local Authentication (Biometría)
- Expo Secure Store (Almacenamiento seguro)
- React Native Maps (Mapas)
-
Node.js (v16 o superior)
node --version
-
npm o yarn
npm --version # o yarn --version -
Expo CLI
npm install -g expo-cli
-
Android Studio (para development builds)
- Descargar desde: https://developer.android.com/studio
- Instalar Android SDK Platform 33 (Android 13)
- Configurar variable de entorno
ANDROID_HOME
-
EAS CLI (Expo Application Services)
npm install -g eas-cli
- Android 8.0 (API 26) o superior
- Modo de desarrollador activado
- Depuración USB habilitada
- Cable USB para conexión
git clone <url-del-repositorio>
cd ritmo-fit-appnpm install
# o
yarn installCrear un archivo .env en la raíz del proyecto:
EXPO_PUBLIC_API_URL=http://TU_IP_LOCAL:8080TU_IP_LOCAL con tu IP local real. Ejemplo:
EXPO_PUBLIC_API_URL=http://192.168.1.100:8080Para encontrar tu IP local:
Windows:
ipconfig
# Buscar "Dirección IPv4"Linux/Mac:
ifconfig
# o
ip addr showAsegúrate de que el backend esté corriendo en:
http://TU_IP_LOCAL:8080
El backend debe estar accesible desde tu red local.
-
Iniciar sesión en Expo
eas login
-
Configurar el proyecto
eas build:configure
-
Crear Development Build
eas build --profile development --platform android
Opciones durante el build:
- Generate a new keystore: Yes
- What would you like your Android application id to be?:
com.tuempresa.ritmofit
-
Descargar e instalar el APK
- Una vez completado el build, recibirás un link
- Descarga el APK en tu dispositivo Android
- Instala el APK (permitir instalación de fuentes desconocidas)
-
Conectar dispositivo por USB
adb devices # Debes ver tu dispositivo listado -
Iniciar el servidor de desarrollo
npx expo start --dev-client
-
Abrir en el dispositivo
- Presiona
aen la terminal para abrir en Android - O escanea el QR con la app de Expo Go
- Presiona
- Notificaciones en background
- Autenticación biométrica avanzada
- Canales personalizados de Android
# Instalar Expo Go desde Play Store
# Luego ejecutar:
npx expo start
# Escanear QR con Expo GoLa app requiere los siguientes permisos:
- Notificaciones: Para recordatorios de clases
- Cámara: Para escaneo de códigos QR
- Biometría/PIN: Para login rápido y seguro
Si los permisos no funcionan:
- Ir a Configuración > Aplicaciones
- Buscar Ritmo Fit
- Permisos > Activar:
- Cámara
- Notificaciones (permitir todas)
- Notificaciones > Configurar:
- "Notificaciones Principales": Prioridad Alta
- "Notificaciones Urgentes": Prioridad Urgente
- Abrir la app
- Tocar "Regístrate"
- Ingresar email y contraseña
- Tocar "Enviar Código"
- Revisar email y copiar el código de 4 dígitos
- Ingresar código en la pantalla de verificación
- Tocar "Verificar Código"
⏱️ Importante:
- El código expira en 10 minutos
- Puedes reenviar el código después de 2 minutos
- Ingresar email y contraseña
- Tocar "Iniciar Sesión"
- Se mostrará un modal para activar biometría (opcional)
- En la pantalla de Login, tocar "Olvidé mi Contraseña"
- Ingresar tu email
- Tocar "Enviar Código"
- Revisar email y copiar el código
- Ingresar el código de verificación
- Crear nueva contraseña
- Confirmar nueva contraseña
- Tocar "Actualizar Contraseña"
Si iniciaste un registro pero no lo completaste:
- En la pantalla de Login, tocar "Recuperar Acceso"
- Ingresar tu email
- Tocar "Verificar Email"
- Si hay un registro pendiente, tocar "Enviar código"
- Completar la verificación como en el registro normal
Después del primer login:
- Aparecerá un banner en la parte inferior solicitando permisos
- Tocar "Aceptar"
- Permitir acceso a Notificaciones (sistema)
- Permitir acceso a Cámara (sistema)
- Recibirás una notificación de prueba confirmando la activación
Si pospusiste los permisos:
- Aparecerá un botón flotante "Activar Permisos"
- Puedes activarlos en cualquier momento desde la tab "Notificaciones"
La biometría es opcional y solo funciona durante la sesión actual.
- Después del login, aparecerá un modal
- Tocar "Activar Ahora" o "Ahora no"
- Si aceptas:
- Se abrirá el scanner biométrico/PIN
- Autenticar con huella/Face ID/PIN
- Se activará la biometría para esta sesión
- Ir a la tab "Perfil"
- Tocar el card "Activar Huella Digital" (o PIN del Dispositivo)
- Ingresar tu contraseña actual
- Tocar "Confirmar"
- Autenticar con biometría/PIN
- Ir a la tab "Perfil"
- En el card verde "Autenticación Segura: Activa"
- Tocar el ícono X rojo
- Confirmar la desactivación
- La biometría se desactiva automáticamente al cerrar sesión
- Si la app va a segundo plano, pedirá autenticación al volver
- No se guarda tu contraseña, solo funciona mientras estés logueado
- En la tab "Home" verás todas las clases disponibles
- Usa los filtros superiores para buscar:
- Sede: Ubicación del gimnasio
- Sport: Tipo de disciplina (Pilates, Yoga, etc.)
- Hora: Horario de la clase
- Tocar una clase de la lista
- Revisar los detalles:
- Nombre del curso
- Fecha y horario
- Ubicación (mapa)
- Profesor
- Precio
- Tocar el botón "Cómo llegar a la sede" para ver direcciones
- Tocar "Reservar"
- Confirmar la reserva
📱 Notificación Automática:
- Al reservar, se programa automáticamente un recordatorio
- Recibirás una notificación 1 hora antes de la clase
- Ir a la tab "Mis Reservas"
- Verás todas tus reservas activas con:
- Nombre de la clase
- Turno y horario
- Estado (Confirmada, Pendiente, etc.)
- En "Mis Reservas", localizar la clase
- Tocar el botón rojo "Cancelar Reserva"
- Confirmar la cancelación
- La notificación programada se cancelará automáticamente
- Solo puedes cancelar si el botón está habilitado
- Algunas reservas tienen política de cancelación
- Desliza hacia abajo (pull to refresh) para actualizar
El check-in se realiza escaneando un código QR proporcionado por el gimnasio.
- Ir a la tab "Check-in"
- Apuntar la cámara al código QR de la clase
- La app leerá automáticamente el código
- Aparecerá una pantalla de confirmación mostrando:
- Número de turno
- Detalles de la clase
- Tocar "Confirmar check-in"
- Recibirás confirmación de asistencia registrada
🚫 Errores Comunes:
- "QR inválido": El código no corresponde a ninguna clase
- "No se encontró token": Debes iniciar sesión nuevamente
💡 Tip: Puedes tocar "Volver a escanear" si escaneaste el código equivocado.
- Ir a la tab "Historial"
- Verás todas las clases a las que asististe
- Desliza hacia abajo para refrescar
- Localizar la clase que quieres calificar
- Tocar el botón "Calificar"
- Seleccionar número de estrellas (1-5)
- (Opcional) Agregar un comentario
- Tocar "Calificar"
✅ Estado: Las clases ya calificadas mostrarán "Tu calificación: X"
- Ir a la tab "Perfil"
- Tocar "Elegir imagen"
- Seleccionar una foto de tu galería
- La foto se actualizará inmediatamente
- Editar el campo de nombre
- Tocar "Guardar cambios"
- Recibirás confirmación de actualización
🔒 Email: El email no se puede editar después del registro.
- Ir a la tab "Notificaciones"
- Verás:
- Estado de permisos (Otorgados/No otorgados)
- Tarea en background (Activa/Inactiva)
- Notificaciones sin leer
- Notificaciones programadas
En la sección "Pruebas":
-
Enviar Notificaciones de Prueba
- Envía 3 notificaciones de prueba
- Una inmediata, una en 10 segundos, otra en 1 minuto
-
Ver Notificaciones Programadas
- Muestra lista completa con fechas/horas
- Útil para verificar recordatorios de clases
-
Probar Long Polling
- Verifica conexión con el backend
- Muestra eventos pendientes
-
Actualizar Estado
- Refresca toda la información
-
Cancelar Todas
- Cancela todas las notificaciones programadas
⚠️ Cuidado: Incluye recordatorios de clases
La app envía estos tipos de notificaciones:
-
🔔 Recordatorios de Clase
- 1 hora antes de cada clase reservada
- Se programan automáticamente al reservar
- Se cancelan si cancelas la reserva
-
❌ Clases Canceladas
- Notificación inmediata si el gimnasio cancela una clase
- Se cancela el recordatorio automáticamente
-
📅 Clases Reprogramadas
- Aviso si cambia el horario de tu clase
- Se programa nuevo recordatorio
-
⏰ Reservas por Expirar
- Aviso antes de que expire tu reserva
- Ir a la tab "Perfil"
- Scroll hasta el final
- Tocar el botón rojo "Cerrar Sesión"
- Confirmar en el modal
- Se limpiarán:
- Token de autenticación
- Configuración de biometría
- Datos de sesión (no el historial)
📝 Nota: Los datos básicos (email, nombre) se mantienen en caché para el próximo login.
Verificar:
- Ve a "Notificaciones" tab
- Verifica que Permisos esté en "Otorgados"
- Toca "Enviar Notificaciones de Prueba"
- Si no aparecen:
- Ve a Configuración Android > Apps > Ritmo Fit > Notificaciones
- Activa todas las notificaciones
- Configura "Notificaciones Principales" en prioridad Alta
- Ve a Configuración Android > Apps > Ritmo Fit > Permisos
- Activa Cámara
- Reinicia la app
Verificar:
- Tu dispositivo tiene huella/Face ID/PIN configurado
- Ve a Configuración Android > Seguridad > Desbloqueo de pantalla
- Configura al menos un método de desbloqueo
Solución:
- Cerrar sesión completamente
- Limpiar caché de la app (opcional)
- Iniciar sesión nuevamente
Verificar:
- El backend está corriendo en
http://TU_IP:8080 - Tu dispositivo está en la misma red WiFi que tu PC
- El archivo
.envtiene la IP correcta:EXPO_PUBLIC_API_URL=http://192.168.X.X:8080
- Reinicia el servidor de desarrollo:
npx expo start --dev-client --clear
Solución:
-
Limpiar caché:
npx expo start --clear
-
Reinstalar dependencias:
rm -rf node_modules npm install
-
Rebuild:
eas build --profile development --platform android --clear-cache
ritmo-fit-app/
├── App.js # Punto de entrada principal
├── app.json # Configuración de Expo
├── package.json # Dependencias
├── .env # Variables de entorno (NO COMMITEAR)
├── assets/ # Imágenes, logos, iconos
├── config/
│ ├── constants.js # Constantes globales
│ └── toastConfig.js # Configuración de notificaciones toast
├── gymApp/
│ ├── components/ # Componentes reutilizables
│ │ ├── ErrorBoundary.js # Manejo de errores
│ │ ├── BiometricSetupManager.js
│ │ ├── ConfirmModal.js
│ │ └── ...
│ └── screens/ # Pantallas de la app
│ ├── auth/ # Autenticación
│ │ ├── LoginScreen.js
│ │ ├── RegisterScreen.js
│ │ ├── VerificationScreen.js
│ │ ├── ForgotPasswordScreen.js
│ │ ├── ResetPassVerifScreen.js
│ │ └── NewPasswordScreen.js
│ ├── HomeScreen.js
│ ├── PerfilScreen.js
│ ├── MisReservasScreen.js
│ ├── CheckinScreen.js
│ ├── HistorialScreen.js
│ ├── DetalleCursoScreen.js
│ └── NotificationSettingsScreen.js
├── navigation/
│ ├── RootNavigator.js # Navegación raíz
│ ├── AuthStack.js # Stack de autenticación
│ └── AppStack.js # Stack principal de la app
├── services/
│ ├── authAPI.js # API de autenticación
│ ├── longPollService.js # Servicio de notificaciones
│ └── reservas.js # API de reservas
├── store/
│ ├── store.js # Configuración de Redux
│ └── slices/
│ ├── authSlice.js # Estado de autenticación
│ ├── userSlice.js # Estado de usuario
│ ├── biometricSlice.js # Estado de biometría
│ └── errorSlice.js # Manejo de errores
└── utils/
├── biometricUtils.js # Utilidades de biometría
├── biometricStorageUtils.js # Almacenamiento seguro
├── toastUtils.js # Utilidades de toast
├── errorUtils.js # Manejo de errores
└── validationUtils.js # Validaciones de formularios
- Reserva una clase
- En la tab "Notificaciones", toca "Ver Notificaciones Programadas"
- Debes ver tu recordatorio programado para 1 hora antes
- O usa "Enviar Notificaciones de Prueba" para testing inmediato
- Activa biometría desde Perfil
- Cierra la app completamente
- Ábrela de nuevo
- Debe pedirte autenticación biométrica
Generar QR de prueba:
- Usa cualquier generador de QR online
- Texto del QR: el ID numérico de un shift existente (ej:
123) - Escanea con la app
# Iniciar servidor de desarrollo
npx expo start --dev-client
# Limpiar caché
npx expo start --clear
# Ver logs de Android
npx react-native log-android
# o
adb logcat
# Reinstalar en dispositivo
npx expo run:android# Development build
eas build --profile development --platform android
# Preview build (APK)
eas build --profile preview --platform android
# Production build
eas build --profile production --platform android# Inspeccionar elemento (React DevTools)
npx react-devtools
# Ver logs del dispositivo
adb logcat | grep -i ReactNative
# Limpiar completamente
rm -rf node_modules
npm install
npx expo start --clear- Las contraseñas se almacenan encriptadas en el backend
- Los tokens de autenticación usan JWT con expiración
- La información biométrica NUNCA se almacena en el dispositivo
- Credenciales guardadas con
expo-secure-store(cifrado por hardware) - Comunicación con backend a través de HTTPS (producción)
Este proyecto es privado y confidencial.
Para reportar bugs o solicitar features:
- Crear un issue en el repositorio
- Contactar al equipo de desarrollo
Desarrollado con ❤️ por el equipo de Ritmo Fit