From 2f24dd4ff83821c09334511172dead75bd047730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Antoni=20Nu=C3=B1ez?= Date: Fri, 17 Jul 2026 15:58:46 +0000 Subject: [PATCH] Faro & OSM --- apps/frontend-mobile/.env.example | 5 - apps/frontend-mobile/app/(tabs)/map.tsx | 10 +- apps/frontend-mobile/app/_layout.tsx | 4 - apps/frontend-mobile/app/medicine/[id].tsx | 47 ++++-- apps/frontend-mobile/app/pharmacy/[id].tsx | 10 +- apps/frontend-mobile/package.json | 1 - apps/frontend-mobile/services/faro.ts | 36 ----- package-lock.json | 161 --------------------- 8 files changed, 54 insertions(+), 220 deletions(-) delete mode 100644 apps/frontend-mobile/services/faro.ts diff --git a/apps/frontend-mobile/.env.example b/apps/frontend-mobile/.env.example index 0668dde..b544ae9 100644 --- a/apps/frontend-mobile/.env.example +++ b/apps/frontend-mobile/.env.example @@ -6,8 +6,3 @@ EXPO_PUBLIC_API_URL=http://localhost:3001/api # For production builds, update this to: # EXPO_PUBLIC_API_URL=https://api.yourdomain.com/api - -# Grafana Alloy OTLP/HTTP endpoint for Faro RUM (must be reachable from the -# device — use a LAN IP / public hostname, NOT localhost). -# Open router :4318 → srv84-macos:4318, or proxy /faro via Nginx Proxy Manager. -EXPO_PUBLIC_FARO_URL=http://grafana.hacecalor.net:4318 diff --git a/apps/frontend-mobile/app/(tabs)/map.tsx b/apps/frontend-mobile/app/(tabs)/map.tsx index 6e0d523..aebd46e 100644 --- a/apps/frontend-mobile/app/(tabs)/map.tsx +++ b/apps/frontend-mobile/app/(tabs)/map.tsx @@ -1,6 +1,6 @@ import React, { useEffect, useState } from 'react'; import { View, StyleSheet, Text } from 'react-native'; -import MapView, { Marker } from 'react-native-maps'; +import MapView, { Marker, UrlTile, PROVIDER_DEFAULT } from 'react-native-maps'; import { useRouter } from 'expo-router'; import { getPharmacies } from '../../services/pharmacies'; import { LoadingSpinner } from '../../components/LoadingSpinner'; @@ -54,11 +54,19 @@ export default function MapScreen() { + {pharmacies.map((pharmacy) => ( {locatedPharmacies.length > 0 && ( - - - - {t('medicine.mapSoon')} - + + + + {locatedPharmacies.map((pharm) => { + const lat = getPharmacyLat(pharm); + const lon = getPharmacyLon(pharm); + if (lat == null || lon == null) return null; + return ( + router.push(`/pharmacy/${pharm.pharmacy_id || pharm.id}`)} + /> + ); + })} + )} @@ -362,13 +391,9 @@ const styles = StyleSheet.create({ height: 200, borderRadius: borderRadius.lg, overflow: 'hidden', - alignItems: 'center', - justifyContent: 'center', - gap: spacing.sm, }, - mapPlaceholder: { - fontSize: 14, - fontWeight: '500', + map: { + flex: 1, }, pharmaciesSection: { marginTop: spacing.sm, diff --git a/apps/frontend-mobile/app/pharmacy/[id].tsx b/apps/frontend-mobile/app/pharmacy/[id].tsx index a2165a0..5327cd1 100644 --- a/apps/frontend-mobile/app/pharmacy/[id].tsx +++ b/apps/frontend-mobile/app/pharmacy/[id].tsx @@ -2,7 +2,7 @@ import React, { useEffect, useState } from 'react'; import { View, Text, ScrollView, StyleSheet, TouchableOpacity, Linking } from 'react-native'; import { useLocalSearchParams, useRouter } from 'expo-router'; import { Ionicons } from '@expo/vector-icons'; -import MapView, { Marker } from 'react-native-maps'; +import MapView, { Marker, UrlTile, PROVIDER_DEFAULT } from 'react-native-maps'; import { getPharmacy, getPharmacyMedicines } from '../../services/pharmacies'; import { subscribeToMedicine, unsubscribeFromMedicine } from '../../services/notifications'; import { useAuth } from '../../hooks/useAuth'; @@ -125,6 +125,8 @@ export default function PharmacyDetailScreen() { + =6.0.0", - "react": ">=18.0.0", - "react-native": ">=0.70.0", - "react-native-mmkv": ">=2.0.0" - }, - "peerDependenciesMeta": { - "@react-navigation/native": { - "optional": true - }, - "react-native-mmkv": { - "optional": true - } - } - }, - "apps/frontend-mobile/node_modules/@grafana/faro-react-native/node_modules/@react-native-async-storage/async-storage": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-1.24.0.tgz", - "integrity": "sha512-W4/vbwUOYOjco0x3toB8QCr7EjIP6nE9G7o8PMguvvjYT5Awg09lyV4enACRx4s++PPulBiBSjL0KTFx2u0Z/g==", - "dependencies": { - "merge-options": "^3.0.4" - }, - "peerDependencies": { - "react-native": "^0.0.0-0 || >=0.60 <1.0" - } - }, - "apps/frontend-mobile/node_modules/@opentelemetry/api-logs": { - "version": "0.219.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.219.0.tgz", - "integrity": "sha512-FFx7YnaYJlIjqWW/AG/yAZ0L/NEY724PipXXXQLdtZPbLwBGbUMTGL1i/esI56TWfTUXxhLfpgrnWJCG8aUJyg==", - "dependencies": { - "@opentelemetry/api": "^1.3.0" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "apps/frontend-mobile/node_modules/@opentelemetry/core": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.8.0.tgz", - "integrity": "sha512-hd1Lfh8p545nNz+jq1Ejfz+Mn1hyLuxYn1YzTfFNrxr8urEWMNQLPf1Th8kjOH+HxwawCrtgBp8JpBUR4ZSgww==", - "dependencies": { - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.0.0 <1.10.0" - } - }, - "apps/frontend-mobile/node_modules/@opentelemetry/otlp-transformer": { - "version": "0.219.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.219.0.tgz", - "integrity": "sha512-aaYKAyXhw9VchKZVGOopD3Gw/kPsyrX2c6IQ0AW32mTjqmZOh5Y6Gf5OYqTNqVktAeBjmFinhyFaCwW6GYK9YQ==", - "dependencies": { - "@opentelemetry/api-logs": "0.219.0", - "@opentelemetry/core": "2.8.0", - "@opentelemetry/resources": "2.8.0", - "@opentelemetry/sdk-logs": "0.219.0", - "@opentelemetry/sdk-metrics": "2.8.0", - "@opentelemetry/sdk-trace-base": "2.8.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": "^1.3.0" - } - }, - "apps/frontend-mobile/node_modules/@opentelemetry/resources": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.8.0.tgz", - "integrity": "sha512-qmXQ27ilDbUK/vGMqwL8D4/rhn76C+sherM4wTbjlfknR8Nvfc/hCxjRJPhkzZzUsPiNg16SA31NxMabwttRjg==", - "dependencies": { - "@opentelemetry/core": "2.8.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, - "apps/frontend-mobile/node_modules/@opentelemetry/sdk-logs": { - "version": "0.219.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.219.0.tgz", - "integrity": "sha512-s6lTKRakaPClvKoWHRChxnXjDMkM/TQ30ff78jN6EBGf7MI7VzANE5PU3f4z9qDUudWjvZjOLHG0rBnBKYvoXA==", - "dependencies": { - "@opentelemetry/api-logs": "0.219.0", - "@opentelemetry/core": "2.8.0", - "@opentelemetry/resources": "2.8.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.4.0 <1.10.0" - } - }, - "apps/frontend-mobile/node_modules/@opentelemetry/sdk-metrics": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-2.8.0.tgz", - "integrity": "sha512-UDBGaj6W0Rgy5rTTaoxs8gVGF/aGkAKyjurJv7se6wjRxJu7FoquTLT/vt54DZfo4crbprYfhX/SOK9+BPw1qg==", - "dependencies": { - "@opentelemetry/core": "2.8.0", - "@opentelemetry/resources": "2.8.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.9.0 <1.10.0" - } - }, - "apps/frontend-mobile/node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.8.0.tgz", - "integrity": "sha512-mhU4jp+vW0mGbFRd+GeXHvmfA4aDqWjBjLC3pE5XMpLs0IE2ryYb019Ts2AQrOq67gaTF25D91+fgvEHDZEnuQ==", - "dependencies": { - "@opentelemetry/core": "2.8.0", - "@opentelemetry/resources": "2.8.0", - "@opentelemetry/semantic-conventions": "^1.29.0" - }, - "engines": { - "node": "^18.19.0 || >=20.6.0" - }, - "peerDependencies": { - "@opentelemetry/api": ">=1.3.0 <1.10.0" - } - }, "apps/frontend-mobile/node_modules/@react-native-async-storage/async-storage": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz", @@ -1277,14 +1124,6 @@ } } }, - "apps/frontend-mobile/node_modules/react-native-device-info": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/react-native-device-info/-/react-native-device-info-11.1.0.tgz", - "integrity": "sha512-hzXJSObJdezEz0hF7MAJ3tGeoesuQWenXXt9mrQR9Mjb8kXpZ09rqSsZ/quNpJdZpQ3rYiFa3/0GFG5KNn9PBg==", - "peerDependencies": { - "react-native": "*" - } - }, "apps/frontend-mobile/node_modules/react-native-drawer-layout": { "version": "4.2.7", "resolved": "https://registry.npmjs.org/react-native-drawer-layout/-/react-native-drawer-layout-4.2.7.tgz",