@rnmapbox/maps 10.0.0-beta.70 → 10.0.0-beta.72

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 (244) hide show
  1. package/README.md +1 -0
  2. package/android/rctmgl/build.gradle +1 -1
  3. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/camera/RCTMGLCamera.kt +68 -29
  4. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/camera/RCTMGLCameraManager.kt +16 -13
  5. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/location/UserTrackingMode.kt +42 -0
  6. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/mapview/RCTMGLMapView.kt +49 -13
  7. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/mapview/helpers/CameraChangeTracker.kt +23 -0
  8. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/events/MapUserTrackingModeEvent.kt +21 -0
  9. package/index.d.ts +23 -62
  10. package/ios/RCTMGL-v10/RCMTGLImage.swift +93 -0
  11. package/ios/RCTMGL-v10/RCMTGLImageManager.m +9 -0
  12. package/ios/RCTMGL-v10/RCMTGLImageManager.swift +14 -0
  13. package/ios/RCTMGL-v10/RCTMGLCamera.swift +52 -26
  14. package/ios/RCTMGL-v10/RCTMGLCameraManager.m +5 -2
  15. package/ios/RCTMGL-v10/RCTMGLImages.swift +113 -8
  16. package/ios/install.md +1 -1
  17. package/javascript/components/Camera.tsx +7 -3
  18. package/javascript/components/Image.tsx +55 -0
  19. package/javascript/components/Images.tsx +156 -0
  20. package/javascript/index.js +3 -0
  21. package/javascript/modules/location/{locationManager.js → locationManager.ts} +91 -18
  22. package/javascript/utils/MapboxStyles.d.ts +3 -3
  23. package/javascript/utils/styleMap.ts +2 -2
  24. package/lib/commonjs/classes/AnimatedCoordinatesArray.js.map +1 -1
  25. package/lib/commonjs/classes/AnimatedExtractCoordinateFromArray.js +2 -5
  26. package/lib/commonjs/classes/AnimatedExtractCoordinateFromArray.js.map +1 -1
  27. package/lib/commonjs/classes/AnimatedPoint.js.map +1 -1
  28. package/lib/commonjs/classes/AnimatedRouteCoordinatesArray.js.map +1 -1
  29. package/lib/commonjs/classes/AnimatedShape.js.map +1 -1
  30. package/lib/commonjs/classes/index.d.js.map +1 -1
  31. package/lib/commonjs/classes/index.js.map +1 -1
  32. package/lib/commonjs/components/AbstractLayer.js +6 -10
  33. package/lib/commonjs/components/AbstractLayer.js.map +1 -1
  34. package/lib/commonjs/components/AbstractSource.js +3 -10
  35. package/lib/commonjs/components/AbstractSource.js.map +1 -1
  36. package/lib/commonjs/components/Atmosphere.js.map +1 -1
  37. package/lib/commonjs/components/BackgroundLayer.js +3 -6
  38. package/lib/commonjs/components/BackgroundLayer.js.map +1 -1
  39. package/lib/commonjs/components/Callout.js +27 -30
  40. package/lib/commonjs/components/Callout.js.map +1 -1
  41. package/lib/commonjs/components/Camera.js +3 -1
  42. package/lib/commonjs/components/Camera.js.map +1 -1
  43. package/lib/commonjs/components/CircleLayer.js +3 -6
  44. package/lib/commonjs/components/CircleLayer.js.map +1 -1
  45. package/lib/commonjs/components/FillExtrusionLayer.js +3 -6
  46. package/lib/commonjs/components/FillExtrusionLayer.js.map +1 -1
  47. package/lib/commonjs/components/FillLayer.js +3 -6
  48. package/lib/commonjs/components/FillLayer.js.map +1 -1
  49. package/lib/commonjs/components/HeadingIndicator.js.map +1 -1
  50. package/lib/commonjs/components/HeatmapLayer.js +3 -6
  51. package/lib/commonjs/components/HeatmapLayer.js.map +1 -1
  52. package/lib/commonjs/components/Image.js +34 -0
  53. package/lib/commonjs/components/Image.js.map +1 -0
  54. package/lib/commonjs/components/ImageSource.js +16 -19
  55. package/lib/commonjs/components/ImageSource.js.map +1 -1
  56. package/lib/commonjs/components/Images.js +16 -34
  57. package/lib/commonjs/components/Images.js.map +1 -1
  58. package/lib/commonjs/components/Light.js +7 -10
  59. package/lib/commonjs/components/Light.js.map +1 -1
  60. package/lib/commonjs/components/LineLayer.js +3 -6
  61. package/lib/commonjs/components/LineLayer.js.map +1 -1
  62. package/lib/commonjs/components/MapView.js +227 -230
  63. package/lib/commonjs/components/MapView.js.map +1 -1
  64. package/lib/commonjs/components/MarkerView.js +9 -16
  65. package/lib/commonjs/components/MarkerView.js.map +1 -1
  66. package/lib/commonjs/components/NativeBridgeComponent.js +0 -7
  67. package/lib/commonjs/components/NativeBridgeComponent.js.map +1 -1
  68. package/lib/commonjs/components/NativeUserLocation.js.map +1 -1
  69. package/lib/commonjs/components/PointAnnotation.js +8 -11
  70. package/lib/commonjs/components/PointAnnotation.js.map +1 -1
  71. package/lib/commonjs/components/RasterDemSource.js +36 -39
  72. package/lib/commonjs/components/RasterDemSource.js.map +1 -1
  73. package/lib/commonjs/components/RasterLayer.js +3 -6
  74. package/lib/commonjs/components/RasterLayer.js.map +1 -1
  75. package/lib/commonjs/components/RasterSource.js +45 -48
  76. package/lib/commonjs/components/RasterSource.js.map +1 -1
  77. package/lib/commonjs/components/ShapeSource.js +4 -7
  78. package/lib/commonjs/components/ShapeSource.js.map +1 -1
  79. package/lib/commonjs/components/SkyLayer.js +3 -6
  80. package/lib/commonjs/components/SkyLayer.js.map +1 -1
  81. package/lib/commonjs/components/Style.js.map +1 -1
  82. package/lib/commonjs/components/SymbolLayer.js +3 -6
  83. package/lib/commonjs/components/SymbolLayer.js.map +1 -1
  84. package/lib/commonjs/components/Terrain.js.map +1 -1
  85. package/lib/commonjs/components/UserLocation.js +68 -70
  86. package/lib/commonjs/components/UserLocation.js.map +1 -1
  87. package/lib/commonjs/components/VectorSource.js +63 -66
  88. package/lib/commonjs/components/VectorSource.js.map +1 -1
  89. package/lib/commonjs/components/annotations/Annotation.js +16 -19
  90. package/lib/commonjs/components/annotations/Annotation.js.map +1 -1
  91. package/lib/commonjs/index.js +8 -0
  92. package/lib/commonjs/index.js.map +1 -1
  93. package/lib/commonjs/modules/location/locationManager.js +21 -10
  94. package/lib/commonjs/modules/location/locationManager.js.map +1 -1
  95. package/lib/commonjs/modules/offline/OfflineCreatePackOptions.js.map +1 -1
  96. package/lib/commonjs/modules/offline/OfflinePack.js.map +1 -1
  97. package/lib/commonjs/modules/offline/offlineManager.js.map +1 -1
  98. package/lib/commonjs/modules/snapshot/SnapshotOptions.js.map +1 -1
  99. package/lib/commonjs/modules/snapshot/snapshotManager.js.map +1 -1
  100. package/lib/commonjs/types/index.js.map +1 -1
  101. package/lib/commonjs/utils/BridgeValue.js +0 -4
  102. package/lib/commonjs/utils/BridgeValue.js.map +1 -1
  103. package/lib/commonjs/utils/Logger.js +1 -4
  104. package/lib/commonjs/utils/Logger.js.map +1 -1
  105. package/lib/commonjs/utils/MapboxStyles.d.js.map +1 -1
  106. package/lib/commonjs/utils/StyleValue.js.map +1 -1
  107. package/lib/commonjs/utils/animated/Animated.js.map +1 -1
  108. package/lib/commonjs/utils/deprecation.js.map +1 -1
  109. package/lib/commonjs/utils/filterUtils.js.map +1 -1
  110. package/lib/commonjs/utils/geoUtils.d.js.map +1 -1
  111. package/lib/commonjs/utils/geoUtils.js.map +1 -1
  112. package/lib/commonjs/utils/getAnnotationsLayerID.js.map +1 -1
  113. package/lib/commonjs/utils/index.d.js.map +1 -1
  114. package/lib/commonjs/utils/index.js.map +1 -1
  115. package/lib/commonjs/utils/styleMap.js +2 -2
  116. package/lib/commonjs/utils/styleMap.js.map +1 -1
  117. package/lib/commonjs/web/MapContext.js.map +1 -1
  118. package/lib/commonjs/web/MapboxModule.js.map +1 -1
  119. package/lib/commonjs/web/UnimplementedComponent.js.map +1 -1
  120. package/lib/commonjs/web/components/Camera.js +2 -9
  121. package/lib/commonjs/web/components/Camera.js.map +1 -1
  122. package/lib/commonjs/web/components/MapView.js +5 -11
  123. package/lib/commonjs/web/components/MapView.js.map +1 -1
  124. package/lib/commonjs/web/index.js.map +1 -1
  125. package/lib/commonjs/web/utils/Logger.js +3 -7
  126. package/lib/commonjs/web/utils/Logger.js.map +1 -1
  127. package/lib/module/classes/AnimatedCoordinatesArray.js.map +1 -1
  128. package/lib/module/classes/AnimatedExtractCoordinateFromArray.js +2 -5
  129. package/lib/module/classes/AnimatedExtractCoordinateFromArray.js.map +1 -1
  130. package/lib/module/classes/AnimatedPoint.js.map +1 -1
  131. package/lib/module/classes/AnimatedRouteCoordinatesArray.js.map +1 -1
  132. package/lib/module/classes/AnimatedShape.js.map +1 -1
  133. package/lib/module/classes/index.d.js.map +1 -1
  134. package/lib/module/classes/index.js.map +1 -1
  135. package/lib/module/components/AbstractLayer.js +4 -10
  136. package/lib/module/components/AbstractLayer.js.map +1 -1
  137. package/lib/module/components/AbstractSource.js +3 -10
  138. package/lib/module/components/AbstractSource.js.map +1 -1
  139. package/lib/module/components/Atmosphere.js.map +1 -1
  140. package/lib/module/components/BackgroundLayer.js +3 -6
  141. package/lib/module/components/BackgroundLayer.js.map +1 -1
  142. package/lib/module/components/Callout.js +27 -30
  143. package/lib/module/components/Callout.js.map +1 -1
  144. package/lib/module/components/Camera.js +3 -1
  145. package/lib/module/components/Camera.js.map +1 -1
  146. package/lib/module/components/CircleLayer.js +3 -6
  147. package/lib/module/components/CircleLayer.js.map +1 -1
  148. package/lib/module/components/FillExtrusionLayer.js +3 -6
  149. package/lib/module/components/FillExtrusionLayer.js.map +1 -1
  150. package/lib/module/components/FillLayer.js +3 -6
  151. package/lib/module/components/FillLayer.js.map +1 -1
  152. package/lib/module/components/HeadingIndicator.js.map +1 -1
  153. package/lib/module/components/HeatmapLayer.js +3 -6
  154. package/lib/module/components/HeatmapLayer.js.map +1 -1
  155. package/lib/module/components/Image.js +24 -0
  156. package/lib/module/components/Image.js.map +1 -0
  157. package/lib/module/components/ImageSource.js +16 -19
  158. package/lib/module/components/ImageSource.js.map +1 -1
  159. package/lib/module/components/Images.js +18 -36
  160. package/lib/module/components/Images.js.map +1 -1
  161. package/lib/module/components/Light.js +7 -10
  162. package/lib/module/components/Light.js.map +1 -1
  163. package/lib/module/components/LineLayer.js +3 -6
  164. package/lib/module/components/LineLayer.js.map +1 -1
  165. package/lib/module/components/MapView.js +227 -230
  166. package/lib/module/components/MapView.js.map +1 -1
  167. package/lib/module/components/MarkerView.js +9 -16
  168. package/lib/module/components/MarkerView.js.map +1 -1
  169. package/lib/module/components/NativeBridgeComponent.js +0 -7
  170. package/lib/module/components/NativeBridgeComponent.js.map +1 -1
  171. package/lib/module/components/NativeUserLocation.js.map +1 -1
  172. package/lib/module/components/PointAnnotation.js +8 -11
  173. package/lib/module/components/PointAnnotation.js.map +1 -1
  174. package/lib/module/components/RasterDemSource.js +36 -39
  175. package/lib/module/components/RasterDemSource.js.map +1 -1
  176. package/lib/module/components/RasterLayer.js +3 -6
  177. package/lib/module/components/RasterLayer.js.map +1 -1
  178. package/lib/module/components/RasterSource.js +45 -48
  179. package/lib/module/components/RasterSource.js.map +1 -1
  180. package/lib/module/components/ShapeSource.js +4 -7
  181. package/lib/module/components/ShapeSource.js.map +1 -1
  182. package/lib/module/components/SkyLayer.js +3 -6
  183. package/lib/module/components/SkyLayer.js.map +1 -1
  184. package/lib/module/components/Style.js.map +1 -1
  185. package/lib/module/components/SymbolLayer.js +3 -6
  186. package/lib/module/components/SymbolLayer.js.map +1 -1
  187. package/lib/module/components/Terrain.js.map +1 -1
  188. package/lib/module/components/UserLocation.js +68 -70
  189. package/lib/module/components/UserLocation.js.map +1 -1
  190. package/lib/module/components/VectorSource.js +63 -66
  191. package/lib/module/components/VectorSource.js.map +1 -1
  192. package/lib/module/components/annotations/Annotation.js +16 -19
  193. package/lib/module/components/annotations/Annotation.js.map +1 -1
  194. package/lib/module/index.js +3 -1
  195. package/lib/module/index.js.map +1 -1
  196. package/lib/module/modules/location/locationManager.js +22 -10
  197. package/lib/module/modules/location/locationManager.js.map +1 -1
  198. package/lib/module/modules/offline/OfflineCreatePackOptions.js.map +1 -1
  199. package/lib/module/modules/offline/OfflinePack.js.map +1 -1
  200. package/lib/module/modules/offline/offlineManager.js.map +1 -1
  201. package/lib/module/modules/snapshot/SnapshotOptions.js.map +1 -1
  202. package/lib/module/modules/snapshot/snapshotManager.js.map +1 -1
  203. package/lib/module/types/index.js.map +1 -1
  204. package/lib/module/utils/BridgeValue.js +0 -4
  205. package/lib/module/utils/BridgeValue.js.map +1 -1
  206. package/lib/module/utils/Logger.js +1 -4
  207. package/lib/module/utils/Logger.js.map +1 -1
  208. package/lib/module/utils/MapboxStyles.d.js.map +1 -1
  209. package/lib/module/utils/StyleValue.js.map +1 -1
  210. package/lib/module/utils/animated/Animated.js.map +1 -1
  211. package/lib/module/utils/deprecation.js.map +1 -1
  212. package/lib/module/utils/filterUtils.js.map +1 -1
  213. package/lib/module/utils/geoUtils.d.js.map +1 -1
  214. package/lib/module/utils/geoUtils.js.map +1 -1
  215. package/lib/module/utils/getAnnotationsLayerID.js.map +1 -1
  216. package/lib/module/utils/index.d.js.map +1 -1
  217. package/lib/module/utils/index.js.map +1 -1
  218. package/lib/module/utils/styleMap.js +2 -2
  219. package/lib/module/utils/styleMap.js.map +1 -1
  220. package/lib/module/web/MapContext.js.map +1 -1
  221. package/lib/module/web/MapboxModule.js.map +1 -1
  222. package/lib/module/web/UnimplementedComponent.js.map +1 -1
  223. package/lib/module/web/components/Camera.js +2 -9
  224. package/lib/module/web/components/Camera.js.map +1 -1
  225. package/lib/module/web/components/MapView.js +5 -11
  226. package/lib/module/web/components/MapView.js.map +1 -1
  227. package/lib/module/web/index.js.map +1 -1
  228. package/lib/module/web/utils/Logger.js +3 -7
  229. package/lib/module/web/utils/Logger.js.map +1 -1
  230. package/lib/typescript/components/Camera.d.ts +4 -2
  231. package/lib/typescript/components/Camera.d.ts.map +1 -1
  232. package/lib/typescript/components/Image.d.ts +20 -0
  233. package/lib/typescript/components/Image.d.ts.map +1 -0
  234. package/lib/typescript/components/Images.d.ts +59 -0
  235. package/lib/typescript/components/Images.d.ts.map +1 -0
  236. package/lib/typescript/modules/location/locationManager.d.ts +87 -0
  237. package/lib/typescript/modules/location/locationManager.d.ts.map +1 -0
  238. package/lib/typescript/utils/styleMap.d.ts +2 -2
  239. package/package.json +1 -1
  240. package/rnmapbox-maps.podspec +1 -1
  241. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/location/UserTrackingMode.java +0 -54
  242. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/components/mapview/helpers/CameraChangeTracker.java +0 -37
  243. package/android/rctmgl/src/main/java-v10/com/mapbox/rctmgl/location/UserLocationVerticalAlignment.java +0 -7
  244. package/javascript/components/Images.js +0 -118
@@ -0,0 +1,93 @@
1
+ import MapboxMaps
2
+
3
+ class RCTMGLImage : UIView {
4
+ @objc
5
+ var name: String = ""
6
+
7
+ var image: UIImage? = nil
8
+
9
+ var sdf: Bool? = nil
10
+ var stretchX: [[NSNumber]] = []
11
+ var stretchY: [[NSNumber]] = []
12
+
13
+ weak var images: RCTMGLImageSetter? = nil {
14
+ didSet {
15
+ DispatchQueue.main.async { self.setImage() }
16
+ }
17
+ }
18
+ weak var bridge : RCTBridge! = nil
19
+
20
+ var reactSubviews : [UIView] = []
21
+
22
+ // MARK: - subview management
23
+
24
+ @objc open override func insertReactSubview(_ subview: UIView!, at atIndex: Int) {
25
+ reactSubviews.insert(subview, at: atIndex)
26
+ if reactSubviews.count > 1 {
27
+ Logger.log(level: .error, message: "Image supports max 1 subview")
28
+ }
29
+ if image == nil {
30
+ DispatchQueue.main.asyncAfter(deadline: .now() + .microseconds(10)) {
31
+ self.setImage()
32
+ }
33
+ }
34
+ }
35
+
36
+ @objc
37
+ open override func removeReactSubview(_ subview: UIView!) {
38
+ reactSubviews.removeAll(where: { $0 == subview })
39
+ }
40
+
41
+ // MARK: - view shnapshot
42
+
43
+ func changeImage(_ image: UIImage, name: String) {
44
+ if let images = images {
45
+ let _ = images.addImage(name: name, image: image, sdf: sdf, stretchX:stretchX, stretchY:stretchY, log: "RCTMGLImage.addImage")
46
+ }
47
+ }
48
+
49
+ func setImage() {
50
+ if let image = _createViewSnapshot() {
51
+ changeImage(image, name: name)
52
+ }
53
+ }
54
+
55
+ func _createViewSnapshot() -> UIImage? {
56
+ let useDummyImage = false
57
+ if useDummyImage {
58
+ let size = CGSize(width: 32, height: 32)
59
+ let renderer = UIGraphicsImageRenderer(size: size)
60
+ let image = renderer.image { context in
61
+ UIColor.darkGray.setStroke()
62
+ context.stroke(CGRect(x: 0, y:0, width: 32, height: 32))
63
+ UIColor(red: 158/255, green: 215/255, blue: 245/255, alpha: 1).setFill()
64
+ context.fill(CGRect(x: 2, y: 2, width: 30, height: 30))
65
+ }
66
+ return image
67
+ }
68
+ guard reactSubviews.count > 0 else {
69
+ return nil
70
+ }
71
+ return _createViewSnapshot(view: reactSubviews[0])
72
+ }
73
+
74
+ func _createViewSnapshot(view: UIView) -> UIImage? {
75
+ guard view.bounds.size.width > 0 && view.bounds.size.height > 0 else {
76
+ return nil
77
+ }
78
+
79
+ let roundUp = 4
80
+
81
+ let adjustedSize = CGSize(
82
+ width: ((Int(view.bounds.size.width)+roundUp-1)/roundUp)*roundUp,
83
+ height: ((Int(view.bounds.size.height)+roundUp-1)/roundUp)*roundUp
84
+ )
85
+
86
+ let renderer = UIGraphicsImageRenderer(size: adjustedSize)
87
+ let image = renderer.image { context in
88
+ view.layer.render(in: context.cgContext)
89
+ }
90
+ return image
91
+ }
92
+ }
93
+
@@ -0,0 +1,9 @@
1
+ #import <React/RCTBridgeModule.h>
2
+ #import <React/RCTViewManager.h>
3
+
4
+ @interface RCT_EXTERN_MODULE(RCTMGLImageManager, RCTViewManager)
5
+
6
+ RCT_EXPORT_VIEW_PROPERTY(name, NSString)
7
+
8
+ @end
9
+
@@ -0,0 +1,14 @@
1
+
2
+ @objc(RCTMGLImageManager)
3
+ class RCTMGLImageManager : RCTViewManager {
4
+ @objc
5
+ override static func requiresMainQueueSetup() -> Bool {
6
+ return true
7
+ }
8
+
9
+ override func view() -> UIView! {
10
+ let layer = RCTMGLImage()
11
+ layer.bridge = self.bridge
12
+ return layer
13
+ }
14
+ }
@@ -107,57 +107,67 @@ open class RCTMGLMapComponentBase : UIView, RCTMGLMapComponent {
107
107
  class RCTMGLCamera : RCTMGLMapComponentBase, LocationConsumer {
108
108
  var cameraAnimator: BasicCameraAnimator?
109
109
  let cameraUpdateQueue = CameraUpdateQueue()
110
-
110
+
111
111
  // MARK: React properties
112
112
 
113
113
  @objc var animationDuration: NSNumber?
114
+
114
115
  @objc var animationMode: NSString?
116
+
115
117
  @objc var defaultStop: [String: Any]?
116
- @objc var followHeading: NSNumber? {
118
+
119
+ @objc var followUserLocation : Bool = false {
117
120
  didSet {
118
121
  _updateCameraFromTrackingMode()
119
122
  }
120
123
  }
121
- @objc var followPitch: NSNumber? {
124
+
125
+ @objc var followUserMode: String? {
122
126
  didSet {
123
127
  _updateCameraFromTrackingMode()
124
128
  }
125
129
  }
126
-
127
- @objc var followUserMode: String? {
130
+
131
+ @objc var followZoomLevel: NSNumber? {
128
132
  didSet {
129
133
  _updateCameraFromTrackingMode()
130
134
  }
131
135
  }
132
-
133
- @objc var followUserLocation : Bool = false {
136
+
137
+ @objc var followPitch: NSNumber? {
134
138
  didSet {
135
139
  _updateCameraFromTrackingMode()
136
140
  }
137
141
  }
138
-
139
- @objc var followZoomLevel: NSNumber? {
142
+
143
+ @objc var followHeading: NSNumber? {
140
144
  didSet {
141
145
  _updateCameraFromTrackingMode()
142
146
  }
143
147
  }
144
-
148
+
149
+ @objc var followPadding: NSDictionary? {
150
+ didSet {
151
+ _updateCameraFromTrackingMode()
152
+ }
153
+ }
154
+
145
155
  @objc var maxZoomLevel: NSNumber? {
146
156
  didSet { _updateMaxBounds() }
147
157
  }
148
-
158
+
149
159
  @objc var minZoomLevel: NSNumber? {
150
160
  didSet { _updateMaxBounds() }
151
161
  }
152
-
162
+
153
163
  @objc var onUserTrackingModeChange: RCTBubblingEventBlock? = nil
154
-
164
+
155
165
  @objc var stop: [String: Any]? {
156
166
  didSet {
157
167
  _updateCamera()
158
168
  }
159
169
  }
160
-
170
+
161
171
  @objc var maxBounds: String? {
162
172
  didSet {
163
173
  if let maxBounds = maxBounds {
@@ -288,22 +298,23 @@ class RCTMGLCamera : RCTMGLMapComponentBase, LocationConsumer {
288
298
  followOptions.bearing = nil
289
299
  trackingModeChanged = true
290
300
  }
301
+
291
302
  if let onUserTrackingModeChange = self.onUserTrackingModeChange {
292
303
  if (trackingModeChanged) {
293
304
  let event = RCTMGLEvent(type: .onUserTrackingModeChange, payload: ["followUserMode": self.followUserMode ?? "normal", "followUserLocation": self.followUserLocation])
294
305
  onUserTrackingModeChange(event.toJSON())
295
306
  }
296
307
  }
308
+
297
309
  var _camera = CameraOptions()
298
- if let followHeading = self.followHeading as? CGFloat {
299
- if (followHeading >= 0.0) {
300
- _camera.bearing = followHeading
301
- }
302
- } else if let stopHeading = self.stop?["heading"] as? CGFloat {
303
- if (stopHeading >= 0.0) {
304
- _camera.bearing = stopHeading
310
+
311
+ if let zoom = self.followZoomLevel as? CGFloat {
312
+ if (zoom >= 0.0) {
313
+ _camera.zoom = zoom
314
+ followOptions.zoom = zoom
305
315
  }
306
316
  }
317
+
307
318
  if let followPitch = self.followPitch as? CGFloat {
308
319
  if (followPitch >= 0.0) {
309
320
  _camera.pitch = followPitch
@@ -317,14 +328,29 @@ class RCTMGLCamera : RCTMGLMapComponentBase, LocationConsumer {
317
328
  } else {
318
329
  followOptions.pitch = nil
319
330
  }
320
-
321
- if let zoom = self.followZoomLevel as? CGFloat {
322
- if (zoom >= 0.0) {
323
- _camera.zoom = zoom
324
- followOptions.zoom = zoom
331
+
332
+ if let followHeading = self.followHeading as? CGFloat {
333
+ if (followHeading >= 0.0) {
334
+ _camera.bearing = followHeading
325
335
  }
336
+ } else if let stopHeading = self.stop?["heading"] as? CGFloat {
337
+ if (stopHeading >= 0.0) {
338
+ _camera.bearing = stopHeading
339
+ }
340
+ }
341
+
342
+ if let padding = self.followPadding {
343
+ let edgeInsets = UIEdgeInsets(
344
+ top: padding["paddingTop"] as? Double ?? 0,
345
+ left: padding["paddingLeft"] as? Double ?? 0,
346
+ bottom: padding["paddingBottom"] as? Double ?? 0,
347
+ right: padding["paddingRight"] as? Double ?? 0
348
+ )
349
+ followOptions.padding = edgeInsets
326
350
  }
351
+
327
352
  let followState = map.viewport.makeFollowPuckViewportState(options: followOptions)
353
+
328
354
  map.viewport.transition(to: followState)
329
355
  map.viewport.addStatusObserver(self)
330
356
  map.mapboxMap.setCamera(to: _camera)
@@ -8,11 +8,14 @@ RCT_EXPORT_VIEW_PROPERTY(maxBounds, NSString)
8
8
  RCT_EXPORT_VIEW_PROPERTY(animationDuration, NSNumber)
9
9
  RCT_EXPORT_VIEW_PROPERTY(animationMode, NSString)
10
10
  RCT_EXPORT_VIEW_PROPERTY(defaultStop, NSDictionary)
11
- RCT_EXPORT_VIEW_PROPERTY(followHeading, NSNumber)
12
- RCT_EXPORT_VIEW_PROPERTY(followPitch, NSNumber)
11
+
13
12
  RCT_EXPORT_VIEW_PROPERTY(followUserLocation, BOOL)
14
13
  RCT_EXPORT_VIEW_PROPERTY(followUserMode, NSString)
15
14
  RCT_EXPORT_VIEW_PROPERTY(followZoomLevel, NSNumber)
15
+ RCT_EXPORT_VIEW_PROPERTY(followPitch, NSNumber)
16
+ RCT_EXPORT_VIEW_PROPERTY(followHeading, NSNumber)
17
+ RCT_EXPORT_VIEW_PROPERTY(followPadding, NSDictionary)
18
+
16
19
  RCT_EXPORT_VIEW_PROPERTY(maxZoomLevel, NSNumber)
17
20
  RCT_EXPORT_VIEW_PROPERTY(minZoomLevel, NSNumber)
18
21
  RCT_EXPORT_VIEW_PROPERTY(onUserTrackingModeChange, RCTBubblingEventBlock)
@@ -1,18 +1,50 @@
1
1
  import MapboxMaps
2
2
 
3
+ protocol RCTMGLImageSetter : AnyObject {
4
+ func addImage(name: String, image: UIImage, sdf: Bool?, stretchX: [[NSNumber]], stretchY: [[NSNumber]], log: String) -> Bool
5
+ }
6
+
3
7
  class RCTMGLImages : UIView, RCTMGLMapComponent {
4
8
 
5
9
  weak var bridge : RCTBridge! = nil
6
10
  var remoteImages : [String:String] = [:]
7
11
 
12
+ weak var style: Style? = nil
13
+
8
14
  @objc
9
15
  var onImageMissing: RCTBubblingEventBlock? = nil
10
16
 
11
17
  @objc
12
18
  var images : [String:Any] = [:]
13
19
 
20
+ var imageViews: [RCTMGLImage] = []
21
+
14
22
  @objc
15
- var nativeImages: [String] = []
23
+ var nativeImages: [Any] = [] {
24
+ didSet {
25
+ nativeImageInfos = nativeImages.compactMap { decodeImage($0) }
26
+ }
27
+ };
28
+
29
+ typealias NativeImageInfo = (name:String, sdf: Bool, stretchX:[(from:Float, to:Float)], stretchY:[(from:Float, to:Float)]);
30
+ var nativeImageInfos: [NativeImageInfo] = []
31
+
32
+ @objc open override func insertReactSubview(_ subview: UIView!, at atIndex: Int) {
33
+ if let image = subview as? RCTMGLImage {
34
+ imageViews.insert(image, at: atIndex)
35
+ } else {
36
+ Logger.log(level:.warn, message: "RCTMGLImages children can only be RCTMGLImage, got \(optional: subview)")
37
+ }
38
+ super.insertReactSubview(subview, at: atIndex)
39
+ }
40
+
41
+ @objc open override func removeReactSubview(_ subview: UIView!) {
42
+ if let image = subview as? RCTMGLImage {
43
+ imageViews.removeAll { $0 == image }
44
+ image.images = nil
45
+ }
46
+ super.removeReactSubview(subview)
47
+ }
16
48
 
17
49
  // MARK: - RCTMGLMapComponent
18
50
 
@@ -21,14 +53,17 @@ class RCTMGLImages : UIView, RCTMGLMapComponent {
21
53
  }
22
54
 
23
55
  func addToMap(_ map: RCTMGLMapView, style: Style) {
56
+ self.style = style
24
57
  map.images.append(self)
25
58
  map.setupEvents()
26
59
 
27
- self.addNativeImages(style: style, nativeImages: nativeImages)
60
+ self.addNativeImages(style: style, nativeImages: nativeImageInfos)
28
61
  self.addRemoteImages(style: style, remoteImages: images)
62
+ self.addImageViews(style: style, imageViews: imageViews)
29
63
  }
30
64
 
31
65
  func removeFromMap(_ map: RCTMGLMapView) {
66
+ self.style = nil
32
67
  // v10todo
33
68
  }
34
69
 
@@ -56,9 +91,15 @@ class RCTMGLImages : UIView, RCTMGLMapComponent {
56
91
  }
57
92
  }
58
93
 
94
+ private func addImageViews(style: Style, imageViews: [RCTMGLImage]) {
95
+ imageViews.forEach { imageView in
96
+ imageView.images = self
97
+ }
98
+ }
99
+
59
100
  public func addMissingImageToStyle(style: Style, imageName: String) -> Bool {
60
- if nativeImages.contains(imageName) {
61
- addNativeImages(style: style, nativeImages: [imageName])
101
+ if let nativeImage = nativeImageInfos.first(where: { $0.name == imageName }) {
102
+ addNativeImages(style: style, nativeImages: [nativeImage])
62
103
  return true
63
104
  }
64
105
 
@@ -77,11 +118,57 @@ class RCTMGLImages : UIView, RCTMGLMapComponent {
77
118
  }
78
119
  }
79
120
 
80
- func addNativeImages(style: Style, nativeImages: [String]) {
81
- for imageName in nativeImages {
82
- if style.styleManager.getStyleImage(forImageId: imageName) == nil {
121
+ func convert(stretch: [[NSNumber]]) -> [(from: Float, to: Float)] {
122
+ return stretch.map{ pair in
123
+ return (from: pair[0].floatValue, to: pair[1].floatValue)
124
+ }
125
+ }
126
+
127
+ func convert(stretch: [(from: Float, to: Float)]) -> [ImageStretches] {
128
+ return stretch.map { v in ImageStretches(first: v.from, second: v.to) }
129
+ }
130
+
131
+ func decodeImage(_ imageNameOrInfo: Any) -> NativeImageInfo? {
132
+ if let imageName = imageNameOrInfo as? String {
133
+ return (name: imageName, sdf: false, stretchX:[],stretchY:[])
134
+ } else if let imageInfo = imageNameOrInfo as? [String:Any] {
135
+ guard let name = imageInfo["name"] as? String else {
136
+ Logger.log(level: .warn, message: "NativeImage: \(imageInfo) has no name key")
137
+ return nil
138
+ }
139
+ var sdf = false
140
+ var stretchX : [(from:Float, to:Float)] = []
141
+ var stretchY : [(from:Float, to:Float)] = []
142
+ if let sdfV = imageInfo["sdf"] as? NSNumber {
143
+ sdf = sdfV.boolValue
144
+ }
145
+
146
+ if let stretchXV = imageInfo["stretchX"] as? [[NSNumber]] {
147
+ stretchX = convert(stretch: stretchXV)
148
+ }
149
+
150
+ if let stretchYV = imageInfo["stretchY"] as? [[NSNumber]] {
151
+ stretchY = convert(stretch: stretchYV)
152
+ }
153
+
154
+ return (name: name, sdf: sdf, stretchX: stretchX, stretchY: stretchY)
155
+ } else {
156
+ Logger.log(level: .warn, message: "RCTMGLImage.nativeImage, unexpected image: \(imageNameOrInfo)")
157
+ return nil
158
+ }
159
+ }
160
+
161
+ func addNativeImages(style: Style, nativeImages: [NativeImageInfo]) {
162
+ for imageInfo in nativeImages {
163
+ let imageName = imageInfo.name
164
+ if style.styleManager.getStyleImage(forImageId: imageInfo.name) == nil {
83
165
  if let image = UIImage(named: imageName) {
84
- try! style.addImage(image, id: imageName, stretchX: [], stretchY: [])
166
+ logged("RCTMGLImage.addNativeImage: \(imageName)") {
167
+ try style.addImage(image, id: imageName, sdf: imageInfo.sdf,
168
+ stretchX: convert(stretch: imageInfo.stretchX),
169
+ stretchY: convert(stretch: imageInfo.stretchY)
170
+ )
171
+ }
85
172
  } else {
86
173
  Logger.log(level:.error, message: "Cannot find nativeImage named \(imageName)")
87
174
  }
@@ -95,5 +182,23 @@ class RCTMGLImages : UIView, RCTMGLMapComponent {
95
182
  UIGraphicsEndImageContext()
96
183
  return result
97
184
  }()
185
+ }
98
186
 
187
+ extension RCTMGLImages : RCTMGLImageSetter {
188
+ func addImage(name: String, image: UIImage, sdf: Bool?, stretchX: [[NSNumber]], stretchY: [[NSNumber]], log: String) -> Bool
189
+ {
190
+ return logged("\(log).addImage") {
191
+ if let style = style {
192
+ try style.addImage(image,
193
+ id:name,
194
+ sdf: sdf ?? false,
195
+ stretchX: convert(stretch: convert(stretch: stretchX)),
196
+ stretchY: convert(stretch: convert(stretch: stretchY))
197
+ )
198
+ return true
199
+ } else {
200
+ return false
201
+ }
202
+ } ?? false
203
+ }
99
204
  }
package/ios/install.md CHANGED
@@ -60,7 +60,7 @@ You can also override the version to use. *Warning:* if you set a version, then
60
60
 
61
61
  ```ruby
62
62
  # Warning: only for advanced use cases, only do this if you know what you're doing.
63
- # $RNMapboxMapsVersion = '~> 10.11.0'
63
+ # $RNMapboxMapsVersion = '~> 10.12.0'
64
64
  ```
65
65
 
66
66
  You will need to authorize your download of the Maps SDK with a secret access token with the `DOWNLOADS:READ` scope. This [guide](https://docs.mapbox.com/ios/maps/guides/install/#configure-credentials) explains how to configure the secret token under section `Configure your secret token`.
@@ -122,16 +122,18 @@ export type CameraStop = {
122
122
  };
123
123
 
124
124
  export type CameraFollowConfig = {
125
- /** The mode used to track the user location on the map. */
126
- followUserMode?: UserTrackingMode;
127
125
  /** Whether the map orientation follows the user location. */
128
126
  followUserLocation?: boolean;
127
+ /** The mode used to track the user location on the map. */
128
+ followUserMode?: UserTrackingMode;
129
129
  /** The zoom level used when following the user location. */
130
130
  followZoomLevel?: number;
131
131
  /** The pitch used when following the user location. */
132
132
  followPitch?: number;
133
133
  /** The heading used when following the user location. */
134
134
  followHeading?: number;
135
+ /** The padding used to position the user location when following. */
136
+ followPadding?: Partial<CameraPadding>;
135
137
  };
136
138
 
137
139
  export type CameraMinMaxConfig = {
@@ -232,6 +234,7 @@ export const Camera = memo(
232
234
  followZoomLevel,
233
235
  followPitch,
234
236
  followHeading,
237
+ followPadding,
235
238
  defaultSettings,
236
239
  allowUpdates = true,
237
240
  onUserTrackingModeChange,
@@ -526,9 +529,10 @@ export const Camera = memo(
526
529
  defaultStop={nativeDefaultStop}
527
530
  followUserLocation={followUserLocation}
528
531
  followUserMode={followUserMode}
532
+ followZoomLevel={followZoomLevel}
529
533
  followPitch={followPitch}
530
534
  followHeading={followHeading}
531
- followZoomLevel={followZoomLevel}
535
+ followPadding={followPadding}
532
536
  minZoomLevel={minZoomLevel}
533
537
  maxZoomLevel={maxZoomLevel}
534
538
  maxBounds={nativeMaxBounds}
@@ -0,0 +1,55 @@
1
+ import React, { memo, forwardRef, ReactElement } from 'react';
2
+ import { requireNativeComponent } from 'react-native';
3
+
4
+ interface Props {
5
+ /** Image name */
6
+ name: string;
7
+
8
+ /** Make image an sdf optional - see [SDF icons](https://docs.mapbox.com/help/troubleshooting/using-recolorable-images-in-mapbox-maps/) */
9
+ sdf?: boolean;
10
+
11
+ /** stretch along x axis - optional */
12
+ stretchX?: [number, number][];
13
+
14
+ /** stretch along y axis - optional */
15
+ stretchY?: [number, number][];
16
+
17
+ /** Single react native view generating the image */
18
+ children: ReactElement;
19
+ }
20
+
21
+ interface Ref {
22
+ refresh: () => void;
23
+ }
24
+
25
+ const Image = memo(
26
+ forwardRef<Ref, Props>(function Image(
27
+ { name, sdf, stretchX, stretchY, children }: Props,
28
+ ref: React.ForwardedRef<Ref>,
29
+ ) {
30
+ const nativeProps = {
31
+ name,
32
+ sdf,
33
+ stretchX,
34
+ stretchY,
35
+ children,
36
+ };
37
+ return <RCTMGLImage {...nativeProps} />;
38
+ }),
39
+ );
40
+
41
+ interface NativeProps {
42
+ name: string;
43
+ children: ReactElement;
44
+ sdf?: boolean;
45
+ stretchX?: [number, number][];
46
+ stretchY?: [number, number][];
47
+ }
48
+
49
+ export const NATIVE_MODULE_NAME = 'RCTMGLImage';
50
+
51
+ const RCTMGLImage = requireNativeComponent<NativeProps>(NATIVE_MODULE_NAME);
52
+
53
+ Image.displayName = 'Image';
54
+
55
+ export default Image;