From e42696e0dd12550fb53e3bd583b0b3ced5b966fa Mon Sep 17 00:00:00 2001 From: Enrique Fernandez Date: Mon, 24 Mar 2025 01:27:59 +0100 Subject: [PATCH 1/4] feat: `travelMode` working on iOS --- ios/MapboxNavigationView.swift | 16 +++++++++++++++- ios/MapboxNavigationViewManager.m | 1 + src/MapboxNavigation.tsx | 2 ++ src/MapboxNavigationViewNativeComponent.ts | 1 + src/types.ts | 13 +++++++++++++ 5 files changed, 32 insertions(+), 1 deletion(-) diff --git a/ios/MapboxNavigationView.swift b/ios/MapboxNavigationView.swift index 05c943f..eb3b253 100644 --- a/ios/MapboxNavigationView.swift +++ b/ios/MapboxNavigationView.swift @@ -62,6 +62,7 @@ public class MapboxNavigationView: UIView, NavigationViewControllerDelegate { @objc var distanceUnit: NSString = "imperial" @objc var language: NSString = "us" @objc var destinationTitle: NSString = "Destination" + @objc var travelMode: NSString = "driving-traffic" @objc var onLocationChange: RCTDirectEventBlock? @objc var onRouteProgressChange: RCTDirectEventBlock? @@ -117,7 +118,20 @@ public class MapboxNavigationView: UIView, NavigationViewControllerDelegate { let destinationWaypoint = Waypoint(coordinate: CLLocationCoordinate2D(latitude: destination[1] as! CLLocationDegrees, longitude: destination[0] as! CLLocationDegrees), name: destinationTitle as String) waypointsArray.append(destinationWaypoint) - let options = NavigationRouteOptions(waypoints: waypointsArray, profileIdentifier: .automobileAvoidingTraffic) + let profile: MBDirectionsProfileIdentifier + + switch travelMode { + case "cycling": + profile = .cycling + case "walking": + profile = .walking + case "driving-traffic": + profile = .automobileAvoidingTraffic + default: + profile = .automobile + } + + let options = NavigationRouteOptions(waypoints: waypointsArray, profileIdentifier: profile) let locale = self.language.replacingOccurrences(of: "-", with: "_") options.locale = Locale(identifier: locale) diff --git a/ios/MapboxNavigationViewManager.m b/ios/MapboxNavigationViewManager.m index 4ea4beb..1e369ca 100644 --- a/ios/MapboxNavigationViewManager.m +++ b/ios/MapboxNavigationViewManager.m @@ -30,5 +30,6 @@ @interface RCT_EXTERN_MODULE(MapboxNavigationViewManager, RCTViewManager) RCT_EXPORT_VIEW_PROPERTY(language, NSString) RCT_EXPORT_VIEW_PROPERTY(distanceUnit, NSString) RCT_EXPORT_VIEW_PROPERTY(mute, BOOL) +RCT_EXPORT_VIEW_PROPERTY(travelMode, NSString) @end diff --git a/src/MapboxNavigation.tsx b/src/MapboxNavigation.tsx index e3d3f19..5332a2d 100644 --- a/src/MapboxNavigation.tsx +++ b/src/MapboxNavigation.tsx @@ -106,6 +106,7 @@ class MapboxNavigation extends React.Component< onRouteProgressChange, onCancelNavigation, onError, + travelMode, ...rest } = this.props; @@ -126,6 +127,7 @@ class MapboxNavigation extends React.Component< onCancelNavigation={(event) => onCancelNavigation?.(event.nativeEvent) } + travelMode={travelMode} {...rest} /> diff --git a/src/MapboxNavigationViewNativeComponent.ts b/src/MapboxNavigationViewNativeComponent.ts index 14196df..b0df355 100644 --- a/src/MapboxNavigationViewNativeComponent.ts +++ b/src/MapboxNavigationViewNativeComponent.ts @@ -23,6 +23,7 @@ interface NativeProps extends ViewProps { shouldSimulateRoute?: boolean; showsEndOfRouteFeedback?: boolean; hideStatusView?: boolean; + travelMode?: string; } export default codegenNativeComponent( diff --git a/src/types.ts b/src/types.ts index fb4a88f..dde4851 100644 --- a/src/types.ts +++ b/src/types.ts @@ -69,6 +69,19 @@ export interface MapboxNavigationProps { destination: Coordinate & { title?: string }; language?: Language; distanceUnit?: 'metric' | 'imperial'; + + /** + * Specifies the mode of travel for navigation. + * + * - 'driving': Standard driving mode that does not take live traffic conditions into account. + * - 'driving-traffic': Driving mode that considers current traffic conditions to avoid congestion. + * - 'walking': Navigation for pedestrians. + * - 'cycling': Navigation optimized for cyclists. + * + * @Default "driving-traffic" + */ + travelMode?: 'driving' | 'driving-traffic' | 'walking' | 'cycling'; + /** * [iOS only] * @Default false From 668efa4469045b7901ba253edf81a5e80f6642af Mon Sep 17 00:00:00 2001 From: Enrique Fernandez Date: Mon, 24 Mar 2025 01:29:18 +0100 Subject: [PATCH 2/4] chore: update `README.md` --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 483ffae..88de8f8 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,12 @@ const styles = StyleSheet.create({ - `onArrive`: Function that is called when you arrive at the provided destination. +- `travelMode` ('driving' | 'driving-traffic' | 'walking' | 'cycling'): Specifies the mode of travel to be used for navigation (default is 'driving-traffic'): + - 'driving': Standard automobile navigation that does not take live traffic conditions into account. + - 'driving-traffic': Automobile navigation that considers current traffic conditions to avoid congestion. + - 'walking': Navigation for pedestrians. + - 'cycling': Navigation optimized for cyclists. + ## Contributing See the [contributing guide](CONTRIBUTING.md) to learn how to contribute to the repository and the development workflow. From af5e6e8b8e7db2bf6526f4404bf66638f07d492c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enrique=20Fern=C3=A1ndez=20Velasco?= Date: Mon, 24 Mar 2025 02:18:02 +0100 Subject: [PATCH 3/4] feat: `travelMode` working on Android --- .../com/mapboxnavigation/MapboxNavigationView.kt | 12 ++++++++++++ .../mapboxnavigation/MapboxNavigationViewManager.kt | 7 +++++++ .../src/oldarch/MapboxNavigationViewManagerSpec.kt | 1 + example/src/App.tsx | 1 + 4 files changed, 21 insertions(+) diff --git a/android/src/main/java/com/mapboxnavigation/MapboxNavigationView.kt b/android/src/main/java/com/mapboxnavigation/MapboxNavigationView.kt index 41a3ba0..fd6e6b8 100644 --- a/android/src/main/java/com/mapboxnavigation/MapboxNavigationView.kt +++ b/android/src/main/java/com/mapboxnavigation/MapboxNavigationView.kt @@ -95,6 +95,7 @@ class MapboxNavigationView(private val context: ThemedReactContext): FrameLayout private var waypointLegs: List = listOf() private var distanceUnit: String = DirectionsCriteria.IMPERIAL private var locale = Locale.getDefault() + private var travelMode: String = DirectionsCriteria.PROFILE_DRIVING /** * Bindings to the example layout. @@ -697,6 +698,7 @@ class MapboxNavigationView(private val context: ThemedReactContext): FrameLayout .steps(true) .voiceInstructions(true) .voiceUnits(distanceUnit) + .profile(travelMode) .build(), object : NavigationRouterCallback { override fun onCanceled(routeOptions: RouteOptions, @RouterOrigin routerOrigin: String) { @@ -820,4 +822,14 @@ class MapboxNavigationView(private val context: ThemedReactContext): FrameLayout fun setShowCancelButton(show: Boolean) { binding.stop.visibility = if (show) View.VISIBLE else View.INVISIBLE } + + fun setTravelMode(mode: String) { + travelMode = when (mode.lowercase()) { + "walking" -> DirectionsCriteria.PROFILE_WALKING + "cycling" -> DirectionsCriteria.PROFILE_CYCLING + "driving" -> DirectionsCriteria.PROFILE_DRIVING + "driving-traffic" -> DirectionsCriteria.PROFILE_DRIVING_TRAFFIC + else -> DirectionsCriteria.PROFILE_DRIVING_TRAFFIC + } + } } diff --git a/android/src/main/java/com/mapboxnavigation/MapboxNavigationViewManager.kt b/android/src/main/java/com/mapboxnavigation/MapboxNavigationViewManager.kt index 03fad26..f1d3fb0 100644 --- a/android/src/main/java/com/mapboxnavigation/MapboxNavigationViewManager.kt +++ b/android/src/main/java/com/mapboxnavigation/MapboxNavigationViewManager.kt @@ -109,6 +109,13 @@ class MapboxNavigationViewManager(private var reactContext: ReactApplicationCont view?.setMute(value) } + @ReactProp(name = "travelMode") + override fun setTravelMode(view: MapboxNavigationView?, value: String?) { + if (value != null) { + view?.setTravelMode(value) + } + } + companion object { const val NAME = "MapboxNavigationView" } diff --git a/android/src/oldarch/MapboxNavigationViewManagerSpec.kt b/android/src/oldarch/MapboxNavigationViewManagerSpec.kt index 256cc74..e6ddfdc 100644 --- a/android/src/oldarch/MapboxNavigationViewManagerSpec.kt +++ b/android/src/oldarch/MapboxNavigationViewManagerSpec.kt @@ -14,4 +14,5 @@ abstract class MapboxNavigationViewManagerSpec : SimpleViewManager( abstract fun setLocal(view: T?, language: String?) abstract fun setMute(view: T?, value: Boolean) abstract fun setShowCancelButton(view: T?, value: Boolean) + abstract fun setTravelMode(view: T?, value: String?) } diff --git a/example/src/App.tsx b/example/src/App.tsx index 692cb52..2d79d7a 100644 --- a/example/src/App.tsx +++ b/example/src/App.tsx @@ -31,6 +31,7 @@ export default function App() { longitude: 76.695669, title: 'Pickup', }} + travelMode="driving-traffic" style={styles.container} shouldSimulateRoute={true} showCancelButton={true} From 20c30937349457dd373037cdb54976cc229980aa Mon Sep 17 00:00:00 2001 From: Enrique Fernandez Velasco Date: Thu, 27 Mar 2025 15:38:25 +0100 Subject: [PATCH 4/4] chore: fix indentation --- ios/MapboxNavigationView.swift | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ios/MapboxNavigationView.swift b/ios/MapboxNavigationView.swift index eb3b253..ef7d9a8 100644 --- a/ios/MapboxNavigationView.swift +++ b/ios/MapboxNavigationView.swift @@ -121,14 +121,14 @@ public class MapboxNavigationView: UIView, NavigationViewControllerDelegate { let profile: MBDirectionsProfileIdentifier switch travelMode { - case "cycling": - profile = .cycling - case "walking": - profile = .walking - case "driving-traffic": - profile = .automobileAvoidingTraffic - default: - profile = .automobile + case "cycling": + profile = .cycling + case "walking": + profile = .walking + case "driving-traffic": + profile = .automobileAvoidingTraffic + default: + profile = .automobile } let options = NavigationRouteOptions(waypoints: waypointsArray, profileIdentifier: profile)