@rnmapbox/maps 10.2.7 → 10.2.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (125) hide show
  1. package/android/build.gradle +9 -1
  2. package/android/src/main/java/com/rnmapbox/rnmbx/RNMBXPackage.kt +10 -0
  3. package/android/src/main/java/com/rnmapbox/rnmbx/components/location/RNMBXCustomLocationProvider.kt +7 -0
  4. package/android/src/main/java/com/rnmapbox/rnmbx/components/mapview/RNMBXMapView.kt +7 -1
  5. package/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleFactory.kt +180 -0
  6. package/android/src/main/java/com/rnmapbox/rnmbx/components/styles/RNMBXStyleValue.kt +4 -0
  7. package/android/src/main/java/com/rnmapbox/rnmbx/events/MapSteadyEvent.kt +50 -0
  8. package/android/src/main/java/com/rnmapbox/rnmbx/events/RNMBXCameraGestureObserver.kt +296 -0
  9. package/android/src/main/java/com/rnmapbox/rnmbx/events/RNMBXCameraGestureObserverManager.kt +74 -0
  10. package/android/src/main/java/com/rnmapbox/rnmbx/modules/RNMBXModule.kt +2 -2
  11. package/android/src/main/java/com/rnmapbox/rnmbx/modules/RNMBXOfflineModuleLegacy.kt +10 -0
  12. package/android/src/main/mapbox-v11-compat/v10/com/mapbox/maps/extension/style/layers/generated/RasterParticleLayer.kt +58 -0
  13. package/android/src/main/mapbox-v11-compat/v10/com/mapbox/maps/extension/style/sources/generated/RasterArraySource.kt +20 -0
  14. package/android/src/main/mapbox-v11-compat/v10/com/rnmapbox/rnmbx/components/styles/layers/RNMBXRasterParticleLayer.kt +22 -0
  15. package/android/src/main/mapbox-v11-compat/v10/com/rnmapbox/rnmbx/components/styles/layers/RNMBXRasterParticleLayerManager.kt +59 -0
  16. package/android/src/main/mapbox-v11-compat/v10/com/rnmapbox/rnmbx/components/styles/sources/RNMBXRasterArraySource.kt +16 -0
  17. package/android/src/main/mapbox-v11-compat/v10/com/rnmapbox/rnmbx/components/styles/sources/RNMBXRasterArraySourceManager.kt +59 -0
  18. package/android/src/main/mapbox-v11-compat/v10/com/rnmapbox/rnmbx/v11compat/StyleFactory.kt +45 -0
  19. package/android/src/main/mapbox-v11-compat/v11/com/rnmapbox/rnmbx/components/styles/layers/RNMBXRasterParticleLayer.kt +38 -0
  20. package/android/src/main/mapbox-v11-compat/v11/com/rnmapbox/rnmbx/components/styles/layers/RNMBXRasterParticleLayerManager.kt +85 -0
  21. package/android/src/main/mapbox-v11-compat/v11/com/rnmapbox/rnmbx/components/styles/sources/RNMBXRasterArraySource.kt +41 -0
  22. package/android/src/main/mapbox-v11-compat/v11/com/rnmapbox/rnmbx/components/styles/sources/RNMBXRasterArraySourceManager.kt +76 -0
  23. package/android/src/main/old-arch/com/facebook/react/viewmanagers/RNMBXCameraGestureObserverManagerDelegate.java +39 -0
  24. package/android/src/main/old-arch/com/facebook/react/viewmanagers/RNMBXCameraGestureObserverManagerInterface.java +18 -0
  25. package/android/src/main/old-arch/com/facebook/react/viewmanagers/RNMBXRasterArraySourceManagerDelegate.java +54 -0
  26. package/android/src/main/old-arch/com/facebook/react/viewmanagers/RNMBXRasterArraySourceManagerInterface.java +23 -0
  27. package/android/src/main/old-arch/com/facebook/react/viewmanagers/RNMBXRasterParticleLayerManagerDelegate.java +66 -0
  28. package/android/src/main/old-arch/com/facebook/react/viewmanagers/RNMBXRasterParticleLayerManagerInterface.java +27 -0
  29. package/ios/RNMBX/Offline/RNMBXOfflineModuleLegacy.m +2 -0
  30. package/ios/RNMBX/Offline/RNMBXOfflineModuleLegacy.swift +5 -0
  31. package/ios/RNMBX/RNMBXCamera.swift +88 -17
  32. package/ios/RNMBX/RNMBXCameraGestureObserver.swift +218 -0
  33. package/ios/RNMBX/RNMBXCameraGestureObserverComponentView.h +15 -0
  34. package/ios/RNMBX/RNMBXCameraGestureObserverComponentView.mm +119 -0
  35. package/ios/RNMBX/RNMBXCameraModule.h +3 -2
  36. package/ios/RNMBX/RNMBXCameraModule.mm +8 -16
  37. package/ios/RNMBX/RNMBXCustomLocationProvider.swift +22 -24
  38. package/ios/RNMBX/RNMBXImageModule.h +3 -2
  39. package/ios/RNMBX/RNMBXImageModule.mm +8 -16
  40. package/ios/RNMBX/RNMBXImages.swift +1 -4
  41. package/ios/RNMBX/RNMBXInteractiveElement.swift +22 -15
  42. package/ios/RNMBX/RNMBXMapView.swift +118 -12
  43. package/ios/RNMBX/RNMBXNativeUserLocation.swift +6 -6
  44. package/ios/RNMBX/RNMBXPointAnnotation.swift +6 -8
  45. package/ios/RNMBX/RNMBXPointAnnotationModule.h +3 -2
  46. package/ios/RNMBX/RNMBXPointAnnotationModule.mm +8 -16
  47. package/ios/RNMBX/RNMBXRasterArraySource.swift +47 -0
  48. package/ios/RNMBX/RNMBXRasterArraySourceComponentView.h +15 -0
  49. package/ios/RNMBX/RNMBXRasterArraySourceComponentView.mm +161 -0
  50. package/ios/RNMBX/RNMBXRasterArraySourceViewManager.swift +16 -0
  51. package/ios/RNMBX/RNMBXRasterParticleLayer.swift +100 -0
  52. package/ios/RNMBX/RNMBXRasterParticleLayerComponentView.h +15 -0
  53. package/ios/RNMBX/RNMBXRasterParticleLayerComponentView.mm +110 -0
  54. package/ios/RNMBX/RNMBXRasterParticleLayerViewManager.swift +17 -0
  55. package/ios/RNMBX/RNMBXShapeSource.swift +5 -4
  56. package/ios/RNMBX/RNMBXShapeSourceModule.h +3 -2
  57. package/ios/RNMBX/RNMBXShapeSourceModule.mm +8 -16
  58. package/ios/RNMBX/RNMBXSource.swift +51 -21
  59. package/ios/RNMBX/RNMBXStyle.swift +152 -27
  60. package/ios/RNMBX/RNMBXStyleValue.swift +27 -0
  61. package/ios/RNMBX/RNMBXViewport.swift +13 -13
  62. package/ios/RNMBX/RNMBXViewportModule.h +3 -2
  63. package/ios/RNMBX/RNMBXViewportModule.mm +8 -16
  64. package/lib/commonjs/plugin/build/withMapbox.js +1 -1
  65. package/lib/commonjs/plugin/src/withMapbox.ts +13 -3
  66. package/lib/module/Mapbox.native.js +4 -0
  67. package/lib/module/Mapbox.native.js.map +1 -1
  68. package/lib/module/RNMBXModule.js.map +1 -1
  69. package/lib/module/components/CameraGestureObserver.js +17 -0
  70. package/lib/module/components/CameraGestureObserver.js.map +1 -0
  71. package/lib/module/components/PointAnnotation.js.map +1 -1
  72. package/lib/module/components/RasterArraySource.js +67 -0
  73. package/lib/module/components/RasterArraySource.js.map +1 -0
  74. package/lib/module/components/RasterParticleLayer.js +40 -0
  75. package/lib/module/components/RasterParticleLayer.js.map +1 -0
  76. package/lib/module/modules/offline/offlineManagerLegacy.js +14 -0
  77. package/lib/module/modules/offline/offlineManagerLegacy.js.map +1 -1
  78. package/lib/module/specs/RNMBXCameraGestureObserverNativeComponent.ts +28 -0
  79. package/lib/module/specs/RNMBXRasterArraySourceNativeComponent.ts +22 -0
  80. package/lib/module/specs/RNMBXRasterParticleLayerNativeComponent.ts +39 -0
  81. package/lib/module/utils/MapboxStyles.js.map +1 -1
  82. package/lib/module/utils/styleMap.js +9 -0
  83. package/lib/module/utils/styleMap.js.map +1 -1
  84. package/lib/typescript/plugin/src/withMapbox.d.ts.map +1 -1
  85. package/lib/typescript/scripts/autogenHelpers/generateCodeWithEjs.d.mts.map +1 -1
  86. package/lib/typescript/scripts/autogenHelpers/globals.d.mts +1 -1
  87. package/lib/typescript/scripts/autogenHelpers/globals.d.mts.map +1 -1
  88. package/lib/typescript/src/Mapbox.native.d.ts +5 -1
  89. package/lib/typescript/src/Mapbox.native.d.ts.map +1 -1
  90. package/lib/typescript/src/RNMBXModule.d.ts.map +1 -1
  91. package/lib/typescript/src/components/CameraGestureObserver.d.ts +27 -0
  92. package/lib/typescript/src/components/CameraGestureObserver.d.ts.map +1 -0
  93. package/lib/typescript/src/components/PointAnnotation.d.ts +1 -1
  94. package/lib/typescript/src/components/PointAnnotation.d.ts.map +1 -1
  95. package/lib/typescript/src/components/RasterArraySource.d.ts +72 -0
  96. package/lib/typescript/src/components/RasterArraySource.d.ts.map +1 -0
  97. package/lib/typescript/src/components/RasterParticleLayer.d.ts +80 -0
  98. package/lib/typescript/src/components/RasterParticleLayer.d.ts.map +1 -0
  99. package/lib/typescript/src/modules/offline/offlineManagerLegacy.d.ts +11 -0
  100. package/lib/typescript/src/modules/offline/offlineManagerLegacy.d.ts.map +1 -1
  101. package/lib/typescript/src/specs/RNMBXCameraGestureObserverNativeComponent.d.ts +20 -0
  102. package/lib/typescript/src/specs/RNMBXCameraGestureObserverNativeComponent.d.ts.map +1 -0
  103. package/lib/typescript/src/specs/RNMBXRasterArraySourceNativeComponent.d.ts +16 -0
  104. package/lib/typescript/src/specs/RNMBXRasterArraySourceNativeComponent.d.ts.map +1 -0
  105. package/lib/typescript/src/specs/RNMBXRasterParticleLayerNativeComponent.d.ts +25 -0
  106. package/lib/typescript/src/specs/RNMBXRasterParticleLayerNativeComponent.d.ts.map +1 -0
  107. package/lib/typescript/src/utils/MapboxStyles.d.ts +44 -2
  108. package/lib/typescript/src/utils/MapboxStyles.d.ts.map +1 -1
  109. package/lib/typescript/src/utils/styleMap.d.ts.map +1 -1
  110. package/package.json +19 -2
  111. package/plugin/build/withMapbox.js +1 -1
  112. package/plugin/src/withMapbox.ts +13 -3
  113. package/rnmapbox-maps.podspec +1 -1
  114. package/src/Mapbox.native.ts +5 -0
  115. package/src/RNMBXModule.ts +1 -4
  116. package/src/components/CameraGestureObserver.tsx +37 -0
  117. package/src/components/PointAnnotation.tsx +2 -2
  118. package/src/components/RasterArraySource.tsx +134 -0
  119. package/src/components/RasterParticleLayer.tsx +117 -0
  120. package/src/modules/offline/offlineManagerLegacy.ts +14 -0
  121. package/src/specs/RNMBXCameraGestureObserverNativeComponent.ts +28 -0
  122. package/src/specs/RNMBXRasterArraySourceNativeComponent.ts +22 -0
  123. package/src/specs/RNMBXRasterParticleLayerNativeComponent.ts +39 -0
  124. package/src/utils/MapboxStyles.ts +47 -1
  125. package/src/utils/styleMap.ts +10 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaDelegate.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+ import androidx.annotation.Nullable;
14
+ import com.facebook.react.bridge.DynamicFromObject;
15
+ import com.facebook.react.uimanager.BaseViewManager;
16
+ import com.facebook.react.uimanager.BaseViewManagerDelegate;
17
+ import com.facebook.react.uimanager.LayoutShadowNode;
18
+
19
+ public class RNMBXCameraGestureObserverManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNMBXCameraGestureObserverManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
20
+ public RNMBXCameraGestureObserverManagerDelegate(U viewManager) {
21
+ super(viewManager);
22
+ }
23
+ @Override
24
+ public void setProperty(T view, String propName, @Nullable Object value) {
25
+ switch (propName) {
26
+ case "quietPeriodMs":
27
+ mViewManager.setQuietPeriodMs(view, new DynamicFromObject(value));
28
+ break;
29
+ case "maxIntervalMs":
30
+ mViewManager.setMaxIntervalMs(view, new DynamicFromObject(value));
31
+ break;
32
+ case "hasOnMapSteady":
33
+ mViewManager.setHasOnMapSteady(view, new DynamicFromObject(value));
34
+ break;
35
+ default:
36
+ super.setProperty(view, propName, value);
37
+ }
38
+ }
39
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaInterface.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+ import com.facebook.react.bridge.Dynamic;
14
+ public interface RNMBXCameraGestureObserverManagerInterface<T extends View> {
15
+ void setQuietPeriodMs(T view, Dynamic value);
16
+ void setMaxIntervalMs(T view, Dynamic value);
17
+ void setHasOnMapSteady(T view, Dynamic value);
18
+ }
@@ -0,0 +1,54 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaDelegate.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+ import androidx.annotation.Nullable;
14
+ import com.facebook.react.bridge.DynamicFromObject;
15
+ import com.facebook.react.uimanager.BaseViewManager;
16
+ import com.facebook.react.uimanager.BaseViewManagerDelegate;
17
+ import com.facebook.react.uimanager.LayoutShadowNode;
18
+
19
+ public class RNMBXRasterArraySourceManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNMBXRasterArraySourceManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
20
+ public RNMBXRasterArraySourceManagerDelegate(U viewManager) {
21
+ super(viewManager);
22
+ }
23
+ @Override
24
+ public void setProperty(T view, String propName, @Nullable Object value) {
25
+ switch (propName) {
26
+ case "id":
27
+ mViewManager.setId(view, new DynamicFromObject(value));
28
+ break;
29
+ case "existing":
30
+ mViewManager.setExisting(view, new DynamicFromObject(value));
31
+ break;
32
+ case "url":
33
+ mViewManager.setUrl(view, new DynamicFromObject(value));
34
+ break;
35
+ case "tileUrlTemplates":
36
+ mViewManager.setTileUrlTemplates(view, new DynamicFromObject(value));
37
+ break;
38
+ case "minZoomLevel":
39
+ mViewManager.setMinZoomLevel(view, new DynamicFromObject(value));
40
+ break;
41
+ case "maxZoomLevel":
42
+ mViewManager.setMaxZoomLevel(view, new DynamicFromObject(value));
43
+ break;
44
+ case "tileSize":
45
+ mViewManager.setTileSize(view, new DynamicFromObject(value));
46
+ break;
47
+ case "sourceBounds":
48
+ mViewManager.setSourceBounds(view, new DynamicFromObject(value));
49
+ break;
50
+ default:
51
+ super.setProperty(view, propName, value);
52
+ }
53
+ }
54
+ }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaInterface.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+ import com.facebook.react.bridge.Dynamic;
14
+ public interface RNMBXRasterArraySourceManagerInterface<T extends View> {
15
+ void setId(T view, Dynamic value);
16
+ void setExisting(T view, Dynamic value);
17
+ void setUrl(T view, Dynamic value);
18
+ void setTileUrlTemplates(T view, Dynamic value);
19
+ void setMinZoomLevel(T view, Dynamic value);
20
+ void setMaxZoomLevel(T view, Dynamic value);
21
+ void setTileSize(T view, Dynamic value);
22
+ void setSourceBounds(T view, Dynamic value);
23
+ }
@@ -0,0 +1,66 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaDelegate.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+ import androidx.annotation.Nullable;
14
+ import com.facebook.react.bridge.DynamicFromObject;
15
+ import com.facebook.react.uimanager.BaseViewManager;
16
+ import com.facebook.react.uimanager.BaseViewManagerDelegate;
17
+ import com.facebook.react.uimanager.LayoutShadowNode;
18
+
19
+ public class RNMBXRasterParticleLayerManagerDelegate<T extends View, U extends BaseViewManager<T, ? extends LayoutShadowNode> & RNMBXRasterParticleLayerManagerInterface<T>> extends BaseViewManagerDelegate<T, U> {
20
+ public RNMBXRasterParticleLayerManagerDelegate(U viewManager) {
21
+ super(viewManager);
22
+ }
23
+ @Override
24
+ public void setProperty(T view, String propName, @Nullable Object value) {
25
+ switch (propName) {
26
+ case "sourceID":
27
+ mViewManager.setSourceID(view, new DynamicFromObject(value));
28
+ break;
29
+ case "existing":
30
+ mViewManager.setExisting(view, new DynamicFromObject(value));
31
+ break;
32
+ case "filter":
33
+ mViewManager.setFilter(view, new DynamicFromObject(value));
34
+ break;
35
+ case "aboveLayerID":
36
+ mViewManager.setAboveLayerID(view, new DynamicFromObject(value));
37
+ break;
38
+ case "belowLayerID":
39
+ mViewManager.setBelowLayerID(view, new DynamicFromObject(value));
40
+ break;
41
+ case "layerIndex":
42
+ mViewManager.setLayerIndex(view, new DynamicFromObject(value));
43
+ break;
44
+ case "maxZoomLevel":
45
+ mViewManager.setMaxZoomLevel(view, new DynamicFromObject(value));
46
+ break;
47
+ case "minZoomLevel":
48
+ mViewManager.setMinZoomLevel(view, new DynamicFromObject(value));
49
+ break;
50
+ case "sourceLayerID":
51
+ mViewManager.setSourceLayerID(view, new DynamicFromObject(value));
52
+ break;
53
+ case "slot":
54
+ mViewManager.setSlot(view, new DynamicFromObject(value));
55
+ break;
56
+ case "id":
57
+ mViewManager.setId(view, new DynamicFromObject(value));
58
+ break;
59
+ case "reactStyle":
60
+ mViewManager.setReactStyle(view, new DynamicFromObject(value));
61
+ break;
62
+ default:
63
+ super.setProperty(view, propName, value);
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
3
+ *
4
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
5
+ * once the code is regenerated.
6
+ *
7
+ * @generated by codegen project: GeneratePropsJavaInterface.js
8
+ */
9
+
10
+ package com.facebook.react.viewmanagers;
11
+
12
+ import android.view.View;
13
+ import com.facebook.react.bridge.Dynamic;
14
+ public interface RNMBXRasterParticleLayerManagerInterface<T extends View> {
15
+ void setSourceID(T view, Dynamic value);
16
+ void setExisting(T view, Dynamic value);
17
+ void setFilter(T view, Dynamic value);
18
+ void setAboveLayerID(T view, Dynamic value);
19
+ void setBelowLayerID(T view, Dynamic value);
20
+ void setLayerIndex(T view, Dynamic value);
21
+ void setMaxZoomLevel(T view, Dynamic value);
22
+ void setMinZoomLevel(T view, Dynamic value);
23
+ void setSourceLayerID(T view, Dynamic value);
24
+ void setSlot(T view, Dynamic value);
25
+ void setId(T view, Dynamic value);
26
+ void setReactStyle(T view, Dynamic value);
27
+ }
@@ -14,6 +14,8 @@ RCT_EXTERN_METHOD(pausePackDownload:(NSString *)name
14
14
  resolver:(RCTPromiseResolveBlock)resolve
15
15
  rejecter:(RCTPromiseRejectBlock)reject)
16
16
 
17
+ RCT_EXTERN_METHOD(setTileCountLimit:(nonnull NSNumber *)limit)
18
+
17
19
  RCT_EXTERN_METHOD(getPackStatus:(NSString *)name
18
20
  resolver:(RCTPromiseResolveBlock)resolve
19
21
  rejecter:(RCTPromiseRejectBlock)reject)
@@ -363,6 +363,11 @@ func getRegionByName(name: String, offlineRegions: [OfflineRegion]) -> OfflineRe
363
363
  }
364
364
  }
365
365
 
366
+ @objc
367
+ func setTileCountLimit(_ limit: NSNumber) {
368
+ self.offlineRegionManager.setOfflineMapboxTileCountLimitForLimit(limit.uint64Value)
369
+ }
370
+
366
371
  @objc
367
372
  func resetDatabase(_ resolver: @escaping RCTPromiseResolveBlock,
368
373
  rejecter: @escaping RCTPromiseRejectBlock)
@@ -15,11 +15,46 @@ public enum RemovalReason {
15
15
  case ViewRemoval, StyleChange, OnDestroy, ComponentChange, Reorder
16
16
  }
17
17
 
18
- public protocol RNMBXMapComponent: AnyObject {
18
+ /// Base protocol for all map components
19
+ public protocol RNMBXMapComponentProtocol: AnyObject {
20
+ func waitForStyleLoad() -> Bool
21
+ }
22
+
23
+ /// Default implementation: most components don't need to wait for style load
24
+ extension RNMBXMapComponentProtocol {
25
+ public func waitForStyleLoad() -> Bool {
26
+ return false
27
+ }
28
+ }
29
+
30
+ /// Protocol for components that can work without direct MapView access
31
+ public protocol RNMBXMapComponent: RNMBXMapComponentProtocol {
19
32
  func addToMap(_ map: RNMBXMapView, style: Style)
20
33
  func removeFromMap(_ map: RNMBXMapView, reason: RemovalReason) -> Bool
21
-
22
- func waitForStyleLoad() -> Bool
34
+ }
35
+
36
+ /// Protocol for components that require a valid MapView instance for both add and remove operations.
37
+ /// Use this protocol when your component needs to interact with the native MapView directly.
38
+ /// The MapView parameter is guaranteed to be non-nil when these methods are called.
39
+ ///
40
+ /// This protocol inherits from RNMBXMapComponent to ensure compatibility with existing code,
41
+ /// but provides default implementations of the base protocol methods that throw errors,
42
+ /// forcing implementers to use the mapView-aware versions.
43
+ public protocol RNMBXMapAndMapViewComponent: RNMBXMapComponent {
44
+ func addToMap(_ map: RNMBXMapView, mapView: MapView, style: Style)
45
+ func removeFromMap(_ map: RNMBXMapView, mapView: MapView, reason: RemovalReason) -> Bool
46
+ }
47
+
48
+ /// Default implementations for RNMBXMapAndMapViewComponent that prevent accidental use of base protocol methods
49
+ extension RNMBXMapAndMapViewComponent {
50
+ public func addToMap(_ map: RNMBXMapView, style: Style) {
51
+ Logger.error("CRITICAL: addToMap(_:style:) called on RNMBXMapAndMapViewComponent. Use addToMap(_:mapView:style:) instead. Component: \(type(of: self))")
52
+ }
53
+
54
+ public func removeFromMap(_ map: RNMBXMapView, reason: RemovalReason) -> Bool {
55
+ Logger.error("CRITICAL: removeFromMap(_:reason:) called on RNMBXMapAndMapViewComponent. Use removeFromMap(_:mapView:reason:) instead. Component: \(type(of: self))")
56
+ return false
57
+ }
23
58
  }
24
59
 
25
60
  enum CameraMode: Int {
@@ -85,7 +120,7 @@ class CameraUpdateQueue {
85
120
  open class RNMBXMapComponentBase : UIView, RNMBXMapComponent {
86
121
  private weak var _map: RNMBXMapView! = nil
87
122
  private var _mapCallbacks: [(RNMBXMapView) -> Void] = []
88
-
123
+
89
124
  weak var map : RNMBXMapView? {
90
125
  return _map;
91
126
  }
@@ -103,11 +138,7 @@ open class RNMBXMapComponentBase : UIView, RNMBXMapComponent {
103
138
  _mapCallbacks.append(callback)
104
139
  }
105
140
  }
106
-
107
- public func waitForStyleLoad() -> Bool {
108
- return false
109
- }
110
-
141
+
111
142
  public func addToMap(_ map: RNMBXMapView, style: Style) {
112
143
  _mapCallbacks.forEach { callback in
113
144
  callback(map)
@@ -115,7 +146,7 @@ open class RNMBXMapComponentBase : UIView, RNMBXMapComponent {
115
146
  _mapCallbacks = []
116
147
  _map = map
117
148
  }
118
-
149
+
119
150
  public func removeFromMap(_ map: RNMBXMapView, reason: RemovalReason) -> Bool {
120
151
  _mapCallbacks = []
121
152
  _map = nil
@@ -123,8 +154,48 @@ open class RNMBXMapComponentBase : UIView, RNMBXMapComponent {
123
154
  }
124
155
  }
125
156
 
157
+ /// Base class for components that require MapView to be non-nil
158
+ open class RNMBXMapAndMapViewComponentBase : UIView, RNMBXMapAndMapViewComponent {
159
+ private weak var _map: RNMBXMapView! = nil
160
+ private var _mapCallbacks: [(RNMBXMapView) -> Void] = []
161
+
162
+ weak var map : RNMBXMapView? {
163
+ return _map;
164
+ }
165
+
166
+ func withMapView(_ callback: @escaping (_ mapView: MapView) -> Void) {
167
+ withRNMBXMapView { mapView in
168
+ callback(mapView.mapView)
169
+ }
170
+ }
171
+
172
+ func withRNMBXMapView(_ callback: @escaping (_ map: RNMBXMapView) -> Void) {
173
+ if let map = _map {
174
+ callback(map)
175
+ } else {
176
+ _mapCallbacks.append(callback)
177
+ }
178
+ }
179
+
180
+ // Uses default implementation from RNMBXMapComponentProtocol extension
181
+
182
+ public func addToMap(_ map: RNMBXMapView, mapView: MapView, style: Style) {
183
+ _mapCallbacks.forEach { callback in
184
+ callback(map)
185
+ }
186
+ _mapCallbacks = []
187
+ _map = map
188
+ }
189
+
190
+ public func removeFromMap(_ map: RNMBXMapView, mapView: MapView, reason: RemovalReason) -> Bool {
191
+ _mapCallbacks = []
192
+ _map = nil
193
+ return true
194
+ }
195
+ }
196
+
126
197
  @objc(RNMBXCamera)
127
- open class RNMBXCamera : RNMBXMapComponentBase {
198
+ open class RNMBXCamera : RNMBXMapAndMapViewComponentBase {
128
199
  var cameraAnimator: BasicCameraAnimator?
129
200
  let cameraUpdateQueue = CameraUpdateQueue()
130
201
 
@@ -519,18 +590,18 @@ open class RNMBXCamera : RNMBXMapComponentBase {
519
590
  _updateCamera()
520
591
  }
521
592
 
522
- public override func addToMap(_ map: RNMBXMapView, style: Style) {
523
- super.addToMap(map, style: style)
593
+ public override func addToMap(_ map: RNMBXMapView, mapView: MapView, style: Style) {
594
+ super.addToMap(map, mapView: mapView, style: style)
524
595
  map.reactCamera = self
525
596
  }
526
-
527
- public override func removeFromMap(_ map: RNMBXMapView, reason: RemovalReason) -> Bool {
597
+
598
+ public override func removeFromMap(_ map: RNMBXMapView, mapView: MapView, reason: RemovalReason) -> Bool {
528
599
  if (reason == .StyleChange) {
529
600
  return false
530
601
  }
531
602
 
532
- map.mapView.viewport.removeStatusObserver(self)
533
- return super.removeFromMap(map, reason:reason)
603
+ mapView.viewport.removeStatusObserver(self)
604
+ return super.removeFromMap(map, mapView: mapView, reason: reason)
534
605
  }
535
606
 
536
607
  @objc public func moveBy(x: Double, y: Double, animationMode: NSNumber?, animationDuration: NSNumber?, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
@@ -0,0 +1,218 @@
1
+ import MapboxMaps
2
+
3
+ @objc(RNMBXCameraGestureObserver)
4
+ public class RNMBXCameraGestureObserver: RNMBXMapComponentBase, GestureManagerDelegate {
5
+ // MARK: Props from Fabric
6
+ @objc public var quietPeriodMs: NSNumber? = nil
7
+ @objc public var maxIntervalMs: NSNumber? = nil
8
+
9
+ // Event callback set from the ComponentView when JS subscribes
10
+ @objc public var onMapSteady: ((_ reason: String, _ idleDurationMs: NSNumber?, _ lastGestureType: String?, _ timestamp: NSNumber) -> Void)? = nil
11
+
12
+ private var hasOnMapSteady: Bool = false
13
+
14
+ @objc public func setHasOnMapSteady(_ hasOnMapSteady: Bool) {
15
+ self.hasOnMapSteady = hasOnMapSteady
16
+ }
17
+
18
+ // MARK: Internal state
19
+ private var activeAnimations: Int = 0
20
+ private var isGestureActive: Bool = false
21
+ private var lastGestureType: String? = nil
22
+ // Time when the last transition (gesture without follow-up anim or camera animation) ended
23
+ private var lastTransitionEndedAtMs: Double? = nil
24
+ private var quietTimer: DispatchSourceTimer? = nil
25
+ private var timeoutTimer: DispatchSourceTimer? = nil
26
+ private var emittedForCurrentActivity: Bool = false
27
+
28
+ #if RNMBX_11
29
+ private var _cancelables = Set<AnyCancelable>()
30
+ #endif
31
+
32
+ private var quietMs: Double { (quietPeriodMs?.doubleValue) ?? 200.0 }
33
+ private var maxMs: Double? { maxIntervalMs?.doubleValue }
34
+
35
+ private func nowMs() -> Double { Date().timeIntervalSince1970 * 1000.0 }
36
+ private func timestamp() -> NSNumber { NSNumber(value: nowMs()) }
37
+
38
+ private var canEmitSteady: Bool {
39
+ activeAnimations == 0 && !isGestureActive && lastTransitionEndedAtMs != nil
40
+ }
41
+
42
+ private func normalizeGestureType(_ gestureType: MapboxMaps.GestureType) -> String {
43
+ switch gestureType {
44
+ case .pan: return "pan"
45
+ case .pinch: return "pinch"
46
+ #if RNMBX_11
47
+ case .rotation: return "rotate"
48
+ #endif
49
+ case .pitch: return "pitch"
50
+ default: return "\(gestureType)"
51
+ }
52
+ }
53
+
54
+ private func debugLog(_ message: String) {
55
+ #if DEBUG
56
+ print("[RNMBXCameraGestureObserver] \(message); activeAnimations=\(activeAnimations) isGestureActive=\(isGestureActive) lastTransitionEnd=\(lastTransitionEndedAtMs ?? -1)")
57
+ #endif
58
+ }
59
+
60
+ private func scheduleTimer(
61
+ _ timer: inout DispatchSourceTimer?,
62
+ delay: Double,
63
+ handler: @escaping @convention(block) () -> Void
64
+ ) {
65
+ timer?.cancel()
66
+ guard delay > 0 else {
67
+ timer = nil
68
+ return
69
+ }
70
+ let newTimer = DispatchSource.makeTimerSource(queue: .main)
71
+ newTimer.schedule(deadline: .now() + .milliseconds(Int(delay)))
72
+ newTimer.setEventHandler(handler: handler)
73
+ newTimer.resume()
74
+ timer = newTimer
75
+ }
76
+
77
+ private func cancelQuietTimer() {
78
+ quietTimer?.cancel()
79
+ quietTimer = nil
80
+ }
81
+
82
+ private func cancelTimeoutTimer() {
83
+ timeoutTimer?.cancel()
84
+ timeoutTimer = nil
85
+ }
86
+
87
+ private func scheduleQuietCheck() {
88
+ let delay = quietMs
89
+ guard delay > 0 else {
90
+ cancelQuietTimer()
91
+ maybeEmitSteady()
92
+ return
93
+ }
94
+ debugLog("scheduleQuietCheck in \(Int(delay))ms")
95
+ scheduleTimer(&quietTimer, delay: delay) { [weak self] in
96
+ self?.debugLog("quiet timer fired")
97
+ self?.maybeEmitSteady()
98
+ }
99
+ }
100
+
101
+ private func scheduleTimeout() {
102
+ guard let delay = maxMs else { return }
103
+ scheduleTimer(&timeoutTimer, delay: delay) { [weak self] in
104
+ self?.emitTimeout()
105
+ }
106
+ }
107
+
108
+ private func markActivity(gestureType: String? = nil) {
109
+ if let gestureType = gestureType { lastGestureType = gestureType }
110
+ emittedForCurrentActivity = false
111
+ scheduleQuietCheck()
112
+ scheduleTimeout()
113
+ }
114
+
115
+ private func maybeEmitSteady() {
116
+ guard canEmitSteady else { return }
117
+ guard let lastEnd = lastTransitionEndedAtMs else { return }
118
+ let sinceEnd = nowMs() - lastEnd
119
+ guard sinceEnd >= quietMs else { return }
120
+ emitSteady(idleDurationMs: sinceEnd)
121
+ }
122
+
123
+ private func emitSteady(idleDurationMs: Double) {
124
+ if emittedForCurrentActivity { return }
125
+ cancelQuietTimer()
126
+ cancelTimeoutTimer()
127
+ let idleNs = NSNumber(value: idleDurationMs)
128
+ let gesture = lastGestureType
129
+ debugLog("EMIT steady idleDurationMs=\(idleDurationMs) lastGestureType=\(gesture ?? "nil")")
130
+ onMapSteady?("steady", idleNs, gesture, timestamp())
131
+ lastGestureType = nil
132
+ emittedForCurrentActivity = true
133
+ }
134
+
135
+ private func emitTimeout() {
136
+ cancelQuietTimer()
137
+ debugLog("EMIT timeout lastGestureType=\(lastGestureType ?? "nil")")
138
+ onMapSteady?("timeout", nil, lastGestureType, timestamp())
139
+ scheduleTimeout()
140
+ }
141
+
142
+ // MARK: RNMBXMapComponent
143
+ public override func addToMap(_ map: RNMBXMapView, style: Style) {
144
+ super.addToMap(map, style: style)
145
+
146
+ guard hasOnMapSteady else { return }
147
+
148
+ #if RNMBX_11
149
+ let camera = map.mapView.camera!
150
+
151
+ // Camera animator lifecycle
152
+ _cancelables.insert(camera.onCameraAnimatorStarted.observe { [weak self] _ in
153
+ guard let self = self else { return }
154
+ self.activeAnimations += 1
155
+ self.lastTransitionEndedAtMs = nil
156
+ self.markActivity()
157
+ self.debugLog("camera animator started")
158
+ })
159
+ let handleAnimatorEnd: (CameraAnimator) -> Void = { [weak self] _ in
160
+ guard let self = self else { return }
161
+ self.activeAnimations -= 1
162
+ #if DEBUG
163
+ if self.activeAnimations < 0 {
164
+ print("[RNMBXCameraGestureObserver] WARNING: activeAnimations went negative, resetting to 0")
165
+ self.activeAnimations = 0
166
+ }
167
+ #endif
168
+ self.lastTransitionEndedAtMs = self.nowMs()
169
+ self.scheduleQuietCheck()
170
+ self.debugLog("camera animator ended")
171
+ }
172
+ _cancelables.insert(camera.onCameraAnimatorFinished.observe(handleAnimatorEnd))
173
+ _cancelables.insert(camera.onCameraAnimatorCancelled.observe(handleAnimatorEnd))
174
+
175
+ // Subscribe to gestures as a secondary observer (multicast from RNMBXMapView)
176
+ map.addGestureDelegate(self)
177
+ debugLog("addToMap and subscribed to gestures")
178
+ #endif
179
+ }
180
+
181
+ public override func removeFromMap(_ map: RNMBXMapView, reason: RemovalReason) -> Bool {
182
+ #if RNMBX_11
183
+ _cancelables.forEach { $0.cancel() }
184
+ _cancelables.removeAll()
185
+ #endif
186
+ map.removeGestureDelegate(self)
187
+ debugLog("removeFromMap and unsubscribed from gestures")
188
+ cancelQuietTimer()
189
+ cancelTimeoutTimer()
190
+ return super.removeFromMap(map, reason: reason)
191
+ }
192
+
193
+ // MARK: GestureManagerDelegate
194
+ public func gestureManager(_ gestureManager: MapboxMaps.GestureManager, didBegin gestureType: MapboxMaps.GestureType) {
195
+ isGestureActive = true
196
+ lastGestureType = normalizeGestureType(gestureType)
197
+ lastTransitionEndedAtMs = nil
198
+ markActivity(gestureType: lastGestureType)
199
+ debugLog("gesture didBegin type=\(lastGestureType ?? "")")
200
+ }
201
+
202
+ public func gestureManager(_ gestureManager: MapboxMaps.GestureManager, didEnd gestureType: MapboxMaps.GestureType, willAnimate: Bool) {
203
+ lastGestureType = normalizeGestureType(gestureType)
204
+ if !willAnimate {
205
+ isGestureActive = false
206
+ lastTransitionEndedAtMs = nowMs()
207
+ }
208
+ markActivity(gestureType: lastGestureType)
209
+ debugLog("gesture didEnd type=\(lastGestureType ?? "") willAnimate=\(willAnimate) -> isGestureActive=\(isGestureActive)")
210
+ }
211
+
212
+ public func gestureManager(_ gestureManager: MapboxMaps.GestureManager, didEndAnimatingFor gestureType: MapboxMaps.GestureType) {
213
+ isGestureActive = false
214
+ lastTransitionEndedAtMs = nowMs()
215
+ scheduleQuietCheck()
216
+ debugLog("gesture didEndAnimatingFor type=\(gestureType)")
217
+ }
218
+ }
@@ -0,0 +1,15 @@
1
+ #ifdef RCT_NEW_ARCH_ENABLED
2
+
3
+ #import <UIKit/UIKit.h>
4
+
5
+ #import <React/RCTUIManager.h>
6
+ #import <React/RCTViewComponentView.h>
7
+
8
+ NS_ASSUME_NONNULL_BEGIN
9
+
10
+ @interface RNMBXCameraGestureObserverComponentView : RCTViewComponentView
11
+ @end
12
+
13
+ NS_ASSUME_NONNULL_END
14
+
15
+ #endif // RCT_NEW_ARCH_ENABLED