Aplicación móvil desarrollada con Expo/React Native para explorar lugares emblemáticos de Nicaragua en un mapa interactivo, descubrir sitios cercanos a tu ubicación, marcar favoritos, agregar tus propios puntos de interés y acceder a un modo educativo con línea de tiempo y quiz.
- Mapa interactivo con Leaflet embebido en
WebView. - Búsqueda y filtros por categoría y departamento.
- Vista "Cerca de mí" con cálculo de distancia y trazado de rutas simples (polilínea) desde tu ubicación.
- Detalle del sitio con galería de imágenes, video (si está disponible), y acciones del modo educativo.
- Favoritos persistentes con
AsyncStorage. - Agregar sitio propio (con uso opcional de ubicación actual vía GPS).
- Modo educativo: progreso de quizzes por sitio con persistencia local.
- Navegación por pestañas y stacks:
Mapa,Favoritos,Explorar,Educativo.
- Expo SDK ~53 (
expo,expo-status-bar) - React Native 0.79, React 19
- Navegación:
@react-navigation/native,@react-navigation/bottom-tabs,@react-navigation/native-stack react-native-webviewpara renderizar Leaflet en HTMLexpo-locationpara permisos y ubicación del usuario@react-native-async-storage/async-storagepara persistencia local- Estilos: estilos en línea/StyleSheet;
nativewindestá instalado pero no se requiere para ejecutar
Revisa package.json para la lista completa de dependencias y scripts.
.
├─ App.tsx # Tabs principales y providers
├─ index.ts # Entry point
├─ app.json # Configuración de app Expo (iconos, permisos Android)
├─ eas.json # Perfiles de build con EAS
├─ src/
│ ├─ screen/
│ │ ├─ MapScreen.tsx # Mapa Leaflet con búsqueda/filtros y botón "Agregar sitio"
│ │ ├─ ExploreScreen.tsx # "Cerca de mí": ubicación, radio, lista y trazo de ruta (polilínea)
│ │ ├─ FavoritesScreen.tsx # Lista de favoritos
│ │ ├─ SiteDetailScreen.tsx # Detalle del sitio, galería, video, acceso al modo educativo
│ │ ├─ AddSiteScreen.tsx # Formulario para crear sitios del usuario
│ │ ├─ MapStack.tsx # Stack de Mapa (Mapa, Detalle, Agregar)
│ │ └─ ExploreStack.tsx # Stack de Explorar (Explorar, Detalle)
│ ├─ favorites/
│ │ └─ FavoritesContext.tsx # Contexto de favoritos con AsyncStorage
│ ├─ education/
│ │ ├─ EduStack.tsx # Stack educativo (Home, Site, Timeline, Quiz)
│ │ ├─ EduContext.tsx # Contexto y persistencia de progreso de quiz
│ │ ├─ screens/ # Pantallas educativas (no listadas aquí)
│ │ └─ data/ # Datos de soporte educativo (si aplica)
│ └─ data/
│ ├─ lugares.json # Dataset base de lugares (id, nombre, categoría, etc.)
│ ├─ image_overrides.json # URLs prioritarias de imágenes por id (ej. Wikimedia)
│ └─ userSites.ts # Utilidades para sitios creados por el usuario
└─ assets/ # Iconos, splash, etc.
npm start/pnpm start/yarn start: inicia el servidor de desarrollo de Expo.npm run android: abre el proyecto en un emulador/dispositivo Android con Expo Go.npm run ios: abre en iOS (requiere macOS y Xcode).npm run web: arranca la versión web (limitaciones: el mapa con Leaflet en WebView está pensado para móvil; en web se renderiza el HTML igualmente pero la experiencia puede variar).
Requisitos:
- Node.js LTS recomendado.
- Expo CLI (se instalará al usar los scripts de
expo). - Para Android: Android Studio + SDKs.
- Para iOS: Xcode (solo macOS).
- Android (
app.json):ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION
Los permisos se solicitan en tiempo de ejecución en ExploreScreen.tsx y en AddSiteScreen.tsx (cuando se usa la ubicación actual).
-
Mapa (
src/screen/MapScreen.tsx)- Renderiza Leaflet dentro de un
WebViewcon tiles de OpenStreetMap. - Filtros por
categoríaydepartamentoy búsqueda por nombre. - Markers dinámicos desde
src/data/lugares.jsoncombinados con sitios del usuario (userSites). - Popup con botón "Ver detalles" (navega a
SiteDetailScreen). - Botón flotante para navegar a "Agregar sitio".
- Renderiza Leaflet dentro de un
-
Explorar (
src/screen/ExploreScreen.tsx)- Solicita permisos de ubicación y obtiene tu posición actual.
- Calcula distancia Haversine y muestra sitios dentro de un radio seleccionable (5/10/25/50 km).
- Lista horizontal de sitios cercanos y botón por pastillas de radio.
- Permite trazar una ruta simple (polilínea) desde tu ubicación hasta el sitio seleccionado dentro del WebView.
-
Favoritos (
src/screen/FavoritesScreen.tsx,src/favorites/FavoritesContext.tsx)- Persistencia en
AsyncStoragebajo la clave@mapa_nicaragua_favorites. - Desde el detalle se puede alternar favorito (ícono corazón).
- Persistencia en
-
Detalle (
src/screen/SiteDetailScreen.tsx)- Muestra título, metadatos y descripción.
- Galería de imágenes (prioriza
image_overrides.jsonpor id si existe). - Reproducción de videos si
site.videoosite.videosestá presente (usaexpo-av). - Accesos al modo educativo: "Línea de tiempo" y "Quiz".
-
Agregar sitio (
src/screen/AddSiteScreen.tsx)- Formulario para crear un
UserSiteconidgenerado (slugify simplificado). - Opción "Usar mi ubicación" para autocompletar lat/lng.
- Guarda el sitio vía utilidades en
src/data/userSites.ts.
- Formulario para crear un
-
Modo educativo (
src/education/)EduContext.tsxpersiste progreso de quizzes enAsyncStoragebajo@mapa_nicaragua_edu_progress.EduStack.tsxdefine pantallas: Home, Site,Timeline,Quiz.- Desde el Detalle del sitio se navega directamente a
TimelineoQuizcon elsiteIdactual.
src/data/lugares.json: lista principal de lugares conid,nombre,categoría,departamento,lat,lng,descripcioneimágenes.src/data/image_overrides.json: asigna una URL principal poridpara asegurar imágenes confiables (por ejemplo, desde Wikimedia Commons).src/data/userSites.ts: proveegetUserSites()yaddUserSite()para leer/escribir sitios personalizados (persistencia local).
El proyecto incluye perfiles en eas.json:
build.preview.android.buildType: apkpara generar APK de pruebas.build.production.android.buildType: app-bundlepara generar AAB de producción.
Comandos típicos (requiere eas-cli logueado con tu cuenta y el projectId ya configurado en app.json → extra.eas.projectId):
# Previsualización (APK)
eas build -p android --profile preview
# Producción (AAB)
eas build -p android --profile production
# Envío a tiendas (opcional)
eas submit -p android --profile production
- Los mapas usan Leaflet en HTML a través de
WebView, por lo que no depende dereact-native-mapsen estas pantallas. - Verifica conectividad a Internet para cargar tiles de OpenStreetMap e imágenes remotas.
- En producción, considera políticas de caché y gestión de permisos para mejorar la experiencia.
- Si agregas muchos puntos, podrías considerar clustering de marcadores en el HTML de Leaflet.
- Instalar dependencias
npm install
# o
pnpm install
- Ejecutar en desarrollo
npm start
# luego presiona a para Android, i para iOS, w para web
- Ejecutar directamente en Android
npm run android
- Icono y splash:
assets/Logo.pngyassets/Logo.svg(app.json). - Nombre de app y paquete Android:
app.json(expo.name,android.package). - Tabs y rutas:
App.tsx,src/screen/*Stack.tsx. - Dataset de lugares: edita
src/data/lugares.jsono añade lógica para cargar desde una API.
No se ha especificado una licencia. Añade una sección de licencia si corresponde.