UNPKG

expo-realtime-maps-navigation

Version:

JavaScript-pure React Native navigation package with Google Places + HERE Routing APIs, dual maps support, and complete customization - No native modules required!

178 lines (177 loc) 6.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.calculateBearing = exports.calculateDistance = exports.useLocationHealth = exports.useCurrentHeading = exports.useCurrentPosition = exports.useLocationStatus = exports.useLiveLocation = void 0; const react_1 = require("react"); const HereNavProvider_1 = require("../components/HereNavProvider"); const useLiveLocation = () => { const { location } = (0, HereNavProvider_1.useHereNavContext)(); const locationData = (0, react_1.useMemo)(() => { const hasLocation = !!location.position; const hasHeading = location.heading !== null; const isSimulated = location.source === 'simulated'; let gpsQuality = 'unknown'; if (location.accuracy !== null) { if (location.accuracy <= 5) { gpsQuality = 'excellent'; } else if (location.accuracy <= 10) { gpsQuality = 'good'; } else if (location.accuracy <= 20) { gpsQuality = 'fair'; } else { gpsQuality = 'poor'; } } const isAccurate = location.accuracy !== null && location.accuracy <= 10; const isStale = location.timestamp ? Date.now() - location.timestamp.getTime() > 30000 : true; const formattedAccuracy = location.accuracy !== null ? ${Math.round(location.accuracy)}m` : 'Unknown'; const formattedCoordinates = location.position ? `${location.position.latitude.toFixed(6)}, ${location.position.longitude.toFixed(6)}` : 'No location'; return { position: location.position, heading: location.heading, accuracy: location.accuracy, source: location.source, timestamp: location.timestamp, isAccurate, isStale, formattedAccuracy, formattedCoordinates, gpsQuality, hasLocation, hasHeading, isSimulated, }; }, [location]); return locationData; }; exports.useLiveLocation = useLiveLocation; const useLocationStatus = () => { const location = (0, exports.useLiveLocation)(); return (0, react_1.useMemo)(() => { if (!location.hasLocation) { return { status: 'no_location', message: 'Location not available', color: '#FF3B30', }; } if (location.isStale) { return { status: 'stale', message: 'Location data is stale', color: '#FF9500', }; } if (location.gpsQuality === 'poor') { return { status: 'poor_accuracy', message: `Poor GPS signal (${location.formattedAccuracy})`, color: '#FF9500', }; } if (location.gpsQuality === 'fair') { return { status: 'fair_accuracy', message: `GPS accuracy ${location.formattedAccuracy}`, color: '#FFCC00', }; } return { status: 'good', message: `GPS accuracy ${location.formattedAccuracy}`, color: '#34C759', }; }, [location]); }; exports.useLocationStatus = useLocationStatus; const useCurrentPosition = () => { const { location } = (0, HereNavProvider_1.useHereNavContext)(); return (0, react_1.useMemo)(() => { return location.position; }, [location.position]); }; exports.useCurrentPosition = useCurrentPosition; const useCurrentHeading = () => { const { location } = (0, HereNavProvider_1.useHereNavContext)(); return (0, react_1.useMemo)(() => { return location.heading; }, [location.heading]); }; exports.useCurrentHeading = useCurrentHeading; const useLocationHealth = () => { const location = (0, exports.useLiveLocation)(); const { permissions } = (0, HereNavProvider_1.useHereNavContext)(); return (0, react_1.useMemo)(() => { if (permissions.location !== 'granted') { return { isHealthy: false, issue: 'permission_denied', message: 'Location permission not granted', suggestion: 'Enable location permission in Settings', severity: 'critical', }; } if (!location.hasLocation) { return { isHealthy: false, issue: 'no_location', message: 'No location data available', suggestion: 'Move to an area with clear sky view', severity: 'critical', }; } if (location.isStale) { return { isHealthy: false, issue: 'stale_location', message: 'Location data is outdated', suggestion: 'Check if location services are enabled', severity: 'warning', }; } if (location.gpsQuality === 'poor') { return { isHealthy: false, issue: 'poor_accuracy', message: 'GPS accuracy is poor', suggestion: 'Move away from buildings or tunnels', severity: 'warning', }; } return { isHealthy: true, issue: null, message: 'Location services working properly', suggestion: null, severity: 'info', }; }, [location, permissions.location]); }; exports.useLocationHealth = useLocationHealth; const calculateDistance = (point1, point2) => { const R = 6371e3; const φ1 = (point1.latitude * Math.PI) / 180; const φ2 = (point2.latitude * Math.PI) / 180; const Δφ = ((point2.latitude - point1.latitude) * Math.PI) / 180; const Δλ = ((point2.longitude - point1.longitude) * Math.PI) / 180; const a = Math.sin(Δφ / 2) * Math.sin(Δφ / 2) + Math.cos1) * Math.cos2) * Math.sin(Δλ / 2) * Math.sin(Δλ / 2); const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); return R * c; }; exports.calculateDistance = calculateDistance; const calculateBearing = (point1, point2) => { const φ1 = (point1.latitude * Math.PI) / 180; const φ2 = (point2.latitude * Math.PI) / 180; const Δλ = ((point2.longitude - point1.longitude) * Math.PI) / 180; const y = Math.sin(Δλ) * Math.cos2); const x = Math.cos1) * Math.sin2) - Math.sin1) * Math.cos2) * Math.cos(Δλ); let bearing = (Math.atan2(y, x) * 180) / Math.PI; bearing = (bearing + 360) % 360; return bearing; }; exports.calculateBearing = calculateBearing;