Facultad de Ingeniería de Sistemas e Informática
Universidad Nacional Mayor de San Marcos
El presente informe detalla las mejoras de software, depuración de errores, actualizaciones de infraestructura y optimizaciones de seguridad realizadas sobre el proyecto NaturApp. El objetivo principal de esta intervención fue corregir fallas de estabilidad, eliminar componentes obsoletos del backend Express, migrar el proyecto al SDK más reciente de Expo (SDK 56) y asegurar las credenciales de conexión mediante variables de entorno para su correcto alojamiento en repositorios públicos.
Se identificó un error de consistencia de tipos en el hook personalizado useCart.js que impedía el correcto renderizado del carrito y del proceso de pago (checkout), ocasionando cierres inesperados de la aplicación (crashes).
- Diagnóstico: El método
CartService.get(userId)del archivofirestoreService.jsretorna un objeto estructurado como{ items, total, count }. Sin embargo, en la funciónloadCartdeuseCart.js, se asignaba este objeto completo directamente al estadoitemsmediante la sentenciasetItems(data). Debido a queitemsse inicializa como un arreglo, cualquier posterior llamada a métodos iterativos de arreglos (como.reduce()para calcular totales o el mapeo interno deFlatList) generaba la excepciónTypeError: items.reduce is not a function. - Solución: Se refactorizó la asignación del estado dentro de
loadCartpara extraer únicamente la propiedad que contiene la colección de artículos:const data = await CartService.get(userId); setItems(data.items); // Se corrigió la asignación asignando el arreglo de productos
Siguiendo las directrices de migración hacia un modelo Serverless con Backend-as-a-Service (BaaS) en Firebase:
- Se eliminó de forma permanente la carpeta
backend/de la raíz del proyecto (la cual contenía la estructura de rutas, controladores y modelos escrita en Express.js). - Esta remoción elimina el acoplamiento innecesario y reduce el volumen de archivos residuales del proyecto, puesto que toda la comunicación de datos se realiza de forma directa entre el cliente React Native y los servicios en la nube de Firebase (Firestore, Auth y Storage).
Se realizó la migración del proyecto de Expo SDK 52 a Expo SDK 56 con el fin de incorporar mejoras de rendimiento y garantizar la compatibilidad con las versiones más recientes de Android e iOS:
- Alineación de módulos nativos: Se ejecutaron los comandos de instalación correspondientes, elevando las dependencias clave a sus versiones compatibles:
react-nativese actualizó a0.85.3.reactse actualizó a19.2.3.react-native-screensse actualizó a4.25.2.- Se instaló la dependencia peer
expo-fontpara dar soporte a@expo/vector-icons@15.1.1. - Se incorporó
react-native-worklets@0.8.3para el soporte interno de animaciones nativas enreact-native-reanimated.
- Depuración de configuración:
- Se eliminaron los archivos
babel.config.jsymetro.config.jsdebido a que el nuevo SDK de Expo gestiona los valores predeterminados internamente, reduciendo el número de archivos de configuración requeridos. - Se removió la bandera
"newArchEnabled": trueenapp.jsonporque la Nueva Arquitectura de React Native viene activada por defecto a partir del SDK 53. - Se reestructuró la configuración de la pantalla de inicio (splash screen) en
app.json. En SDK 56, la propiedad raíz"splash"se encuentra obsoleta; por lo tanto, la configuración de color de fondo y redimensionamiento se reubicó de manera correcta dentro de la sección"plugins"bajo el plugin"expo-splash-screen".
- Se eliminaron los archivos
Con el objetivo de agilizar las tareas de construcción del bundle y descarga de paquetes:
- Se adoptó Bun como gestor de paquetes principal del proyecto en reemplazo de npm.
- Se actualizó el archivo de configuración
package.jsonpara que el script de poblado de la base de datos se ejecute directamente a través del motor de Bun ("seed": "bun scripts/seedFirestore.js").
Para evitar la filtración de credenciales sensibles (claves de API y tokens de conexión a Firebase) al subir el proyecto a un repositorio de Git:
- Se implementó el uso de variables de entorno mediante un archivo oculto
.env. Las variables usan el prefijoEXPO_PUBLIC_para ser enlazadas automáticamente por el compilador de Expo en tiempo de ejecución. - Se creó el archivo
.env.examplecomo plantilla de configuración. - Se verificó que el archivo
.gitignorebloquee de forma estricta el rastreo de.env. - Se refactorizaron los archivos de inicialización
firebaseConfig.jsyseedFirestore.jspara consumir los parámetros desdeprocess.env.
Se identificó un fallo que impedía mostrar los productos en la interfaz de la aplicación, a pesar de que la base de datos de Firestore indicaba estar poblada con documentos.
- Diagnóstico: La aplicación filtra los productos activos mediante la propiedad
isActive: trueen las consultas de Firestore. Sin embargo, en el script de siembraseedFirestore.js, los últimos 5 productos se guardaban con la claveactive: trueen lugar deisActive: true. Al no encontrar productos que cumplieran con el filtro, la consulta de Firestore retornaba un conjunto vacío con éxito (sin lanzar excepciones), lo que evitaba que se activara el catálogo de fallback local (LOCAL_PRODUCTS) y dejaba la pantalla de inicio en blanco. - Solución: Se modificó
seedFirestore.jspara homogeneizar el campo aisActive: trueen todos los productos del catálogo inicial y se re-ejecutó el comando de siembra (bun run seed), logrando que la consulta a Firestore recupere y muestre correctamente todo el catálogo en la app.
Se corrigieron dos problemas visuales en el carrusel de categorías horizontal de la pantalla de inicio:
- Alineación vertical (Stretching): Por defecto, los elementos hijos de un
ScrollViewhorizontal en React Native se estiran para ocupar todo el alto disponible (alignItems: 'stretch'). Esto causaba que los botones de categoría (incluido el botón "Todos") se renderizaran como rectángulos verticales muy altos. Se solucionó añadiendoalignItems: 'center'a la propiedadcontentContainerStyle. - Espaciado vertical excesivo: El componente
ScrollViewintentaba expandirse verticalmente dentro del contenedor flexible de la pantalla de inicio, dejando un espacio vacío muy grande por encima y por debajo de las categorías. Se corrigió aplicandoflexGrow: 0en el propstyledelScrollView, forzándolo a ceñirse al tamaño real de su contenido.
- Verificación con Expo Doctor: Se ejecutó la auditoría del proyecto mediante
bun x expo-doctor. El sistema reportó un resultado de 21/21 pruebas superadas con éxito, confirmando la salud general del esquema de configuración y la ausencia de conflictos de dependencias nativas. - Prueba de fallback offline: Se comprobó que el flujo del catálogo de productos y el inicio de sesión sigan siendo operables localmente (a través de datos simulados en memoria) en caso de que no existan variables de entorno configuradas, garantizando una excelente tolerancia a fallos.
Para levantar y validar el correcto funcionamiento del proyecto, se deben ejecutar los siguientes pasos en la consola:
- Se debe crear un archivo con el nombre
.enven la raíz del directorioNaturApp. - Se deben copiar las variables del archivo
.env.exampley sustituir los campos con las credenciales correspondientes al proyecto de Firebase Console:EXPO_PUBLIC_FIREBASE_API_KEY=TU_API_KEY EXPO_PUBLIC_FIREBASE_AUTH_DOMAIN=TU_AUTH_DOMAIN EXPO_PUBLIC_FIREBASE_PROJECT_ID=TU_PROJECT_ID EXPO_PUBLIC_FIREBASE_STORAGE_BUCKET=TU_STORAGE_BUCKET EXPO_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=TU_MESSAGING_SENDER_ID EXPO_PUBLIC_FIREBASE_APP_ID=TU_APP_ID
Estando ubicados en la terminal dentro de NaturApp, se deben ejecutar las siguientes instrucciones:
# 1. Instalar las dependencias del proyecto y generar el archivo bun.lockb
bun install
# 2. Poblar las colecciones de Firestore con los datos iniciales de prueba (Categorías y Productos)
bun run seed
# 3. Levantar el servidor de desarrollo de Expo
bun x expo startUna vez completado el paso 3, se puede escanear el código QR resultante en la terminal con la aplicación de pruebas Expo Go para previsualizar el aplicativo en dispositivos Android o iOS.