react-native-google-maps-plus 1.7.0-dev.9 → 1.8.0-dev.1

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 (88) hide show
  1. package/android/build.gradle +1 -1
  2. package/android/gradle.properties +2 -1
  3. package/android/src/main/java/com/rngooglemapsplus/GoogleMapsViewImpl.kt +124 -128
  4. package/android/src/main/java/com/rngooglemapsplus/MapCircleBuilder.kt +2 -3
  5. package/android/src/main/java/com/rngooglemapsplus/MapMarkerBuilder.kt +83 -53
  6. package/android/src/main/java/com/rngooglemapsplus/MapPolygonBuilder.kt +6 -23
  7. package/android/src/main/java/com/rngooglemapsplus/MapPolylineBuilder.kt.kt +12 -39
  8. package/android/src/main/java/com/rngooglemapsplus/RNGoogleMapsPlusView.kt +34 -16
  9. package/android/src/main/java/com/rngooglemapsplus/extensions/BitmapExtension.kt +35 -0
  10. package/android/src/main/java/com/rngooglemapsplus/extensions/CameraPositionExtension.kt +3 -2
  11. package/android/src/main/java/com/rngooglemapsplus/extensions/LatLngBoundsExtension.kt +31 -0
  12. package/android/src/main/java/com/rngooglemapsplus/extensions/MapObjectTagExtensions.kt +84 -0
  13. package/android/src/main/java/com/rngooglemapsplus/extensions/RNLineCapTypeExtension.kt +14 -0
  14. package/android/src/main/java/com/rngooglemapsplus/extensions/RNLineJoinTypeExtension.kt +12 -0
  15. package/android/src/main/java/com/rngooglemapsplus/extensions/RNMapCircleExtension.kt +7 -1
  16. package/android/src/main/java/com/rngooglemapsplus/extensions/RNMarkerExtension.kt +54 -17
  17. package/android/src/main/java/com/rngooglemapsplus/extensions/RNPolygonExtension.kt +31 -1
  18. package/android/src/main/java/com/rngooglemapsplus/extensions/RNPolylineExtension.kt +6 -1
  19. package/ios/GoogleMapViewImpl.swift +89 -69
  20. package/ios/LocationHandler.swift +3 -1
  21. package/ios/MapCircleBuilder.swift +2 -3
  22. package/ios/MapHelper.swift +3 -5
  23. package/ios/MapMarkerBuilder.swift +147 -91
  24. package/ios/MapPolygonBuilder.swift +6 -41
  25. package/ios/MapPolylineBuilder.swift +2 -10
  26. package/ios/RNGoogleMapsPlusView.swift +49 -33
  27. package/ios/extensions/GMSCameraPosition+Extension.swift +2 -2
  28. package/ios/extensions/MapObjectTag+Extension.swift +93 -0
  29. package/ios/extensions/RNCircle+Extension.swift +14 -5
  30. package/ios/extensions/RNLatLng+Extension.swift +11 -0
  31. package/ios/extensions/RNLineCapType+Extension.swift +10 -0
  32. package/ios/extensions/RNLineJoinType+Extension.swift +11 -0
  33. package/ios/extensions/RNMarker+Extension.swift +43 -12
  34. package/ios/extensions/RNPolygon+Extension.swift.swift +50 -21
  35. package/ios/extensions/RNPolyline+Extension.swift.swift +15 -26
  36. package/ios/extensions/SVGKImage+Extension.swift +22 -0
  37. package/ios/extensions/UIImage+Extension.swift +45 -0
  38. package/lib/module/types.js.map +1 -1
  39. package/lib/typescript/src/RNGoogleMapsPlusView.nitro.d.ts +17 -15
  40. package/lib/typescript/src/RNGoogleMapsPlusView.nitro.d.ts.map +1 -1
  41. package/lib/typescript/src/types.d.ts +8 -1
  42. package/lib/typescript/src/types.d.ts.map +1 -1
  43. package/nitrogen/generated/android/RNGoogleMapsPlusOnLoad.cpp +8 -8
  44. package/nitrogen/generated/android/c++/{JFunc_void_RNRegion_RNCamera.hpp → JFunc_void_RNRegion_RNCameraChange.hpp} +21 -22
  45. package/nitrogen/generated/android/c++/JFunc_void_RNRegion_RNCameraChange_bool.hpp +82 -0
  46. package/nitrogen/generated/android/c++/JFunc_void_std__string.hpp +75 -0
  47. package/nitrogen/generated/android/c++/JFunc_void_std__string_RNLatLng.hpp +77 -0
  48. package/nitrogen/generated/android/c++/JHybridRNGoogleMapsPlusViewSpec.cpp +142 -130
  49. package/nitrogen/generated/android/c++/JHybridRNGoogleMapsPlusViewSpec.hpp +30 -28
  50. package/nitrogen/generated/android/c++/JRNCameraChange.hpp +70 -0
  51. package/nitrogen/generated/android/c++/JRNInitialProps.hpp +7 -3
  52. package/nitrogen/generated/android/c++/JRNMarker.hpp +7 -7
  53. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngooglemapsplus/{Func_void_RNRegion_RNCamera.kt → Func_void_RNRegion_RNCameraChange.kt} +9 -9
  54. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngooglemapsplus/{Func_void_RNRegion_RNCamera_bool.kt → Func_void_RNRegion_RNCameraChange_bool.kt} +9 -9
  55. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngooglemapsplus/{Func_void_std__optional_std__string_.kt → Func_void_std__string.kt} +12 -12
  56. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngooglemapsplus/{Func_void_std__optional_std__string__RNLatLng.kt → Func_void_std__string_RNLatLng.kt} +12 -12
  57. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngooglemapsplus/HybridRNGoogleMapsPlusViewSpec.kt +50 -42
  58. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngooglemapsplus/RNCameraChange.kt +46 -0
  59. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngooglemapsplus/RNInitialProps.kt +6 -3
  60. package/nitrogen/generated/android/kotlin/com/margelo/nitro/rngooglemapsplus/RNMarker.kt +6 -6
  61. package/nitrogen/generated/ios/RNGoogleMapsPlus-Swift-Cxx-Bridge.cpp +24 -16
  62. package/nitrogen/generated/ios/RNGoogleMapsPlus-Swift-Cxx-Bridge.hpp +97 -72
  63. package/nitrogen/generated/ios/RNGoogleMapsPlus-Swift-Cxx-Umbrella.hpp +3 -0
  64. package/nitrogen/generated/ios/c++/HybridRNGoogleMapsPlusViewSpecSwift.hpp +43 -28
  65. package/nitrogen/generated/ios/swift/{Func_void_RNRegion_RNCamera.swift → Func_void_RNRegion_RNCameraChange.swift} +10 -10
  66. package/nitrogen/generated/ios/swift/{Func_void_RNRegion_RNCamera_bool.swift → Func_void_RNRegion_RNCameraChange_bool.swift} +10 -10
  67. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__string_.swift +6 -6
  68. package/nitrogen/generated/ios/swift/Func_void_std__string.swift +47 -0
  69. package/nitrogen/generated/ios/swift/Func_void_std__string_RNLatLng.swift +47 -0
  70. package/nitrogen/generated/ios/swift/HybridRNGoogleMapsPlusViewSpec.swift +16 -14
  71. package/nitrogen/generated/ios/swift/HybridRNGoogleMapsPlusViewSpec_cxx.swift +186 -224
  72. package/nitrogen/generated/ios/swift/RNCameraChange.swift +68 -0
  73. package/nitrogen/generated/ios/swift/RNInitialProps.swift +31 -1
  74. package/nitrogen/generated/ios/swift/RNMarker.swift +24 -31
  75. package/nitrogen/generated/shared/c++/HybridRNGoogleMapsPlusViewSpec.cpp +2 -0
  76. package/nitrogen/generated/shared/c++/HybridRNGoogleMapsPlusViewSpec.hpp +36 -31
  77. package/nitrogen/generated/shared/c++/RNCameraChange.hpp +88 -0
  78. package/nitrogen/generated/shared/c++/RNInitialProps.hpp +6 -2
  79. package/nitrogen/generated/shared/c++/RNMarker.hpp +6 -6
  80. package/nitrogen/generated/shared/c++/views/HybridRNGoogleMapsPlusViewComponent.cpp +28 -28
  81. package/nitrogen/generated/shared/c++/views/HybridRNGoogleMapsPlusViewComponent.hpp +15 -15
  82. package/package.json +1 -1
  83. package/src/RNGoogleMapsPlusView.nitro.ts +19 -14
  84. package/src/types.ts +9 -1
  85. package/nitrogen/generated/android/c++/JFunc_void_RNRegion_RNCamera_bool.hpp +0 -83
  86. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__string_.hpp +0 -76
  87. package/nitrogen/generated/android/c++/JFunc_void_std__optional_std__string__RNLatLng.hpp +0 -78
  88. package/nitrogen/generated/ios/swift/Func_void_std__optional_std__string__RNLatLng.swift +0 -54
@@ -0,0 +1,14 @@
1
+ package com.rngooglemapsplus.extensions
2
+
3
+ import com.google.android.gms.maps.model.ButtCap
4
+ import com.google.android.gms.maps.model.Cap
5
+ import com.google.android.gms.maps.model.RoundCap
6
+ import com.google.android.gms.maps.model.SquareCap
7
+ import com.rngooglemapsplus.RNLineCapType
8
+
9
+ fun RNLineCapType?.toMapLineCap(): Cap =
10
+ when (this) {
11
+ RNLineCapType.ROUND -> RoundCap()
12
+ RNLineCapType.SQUARE -> SquareCap()
13
+ else -> ButtCap()
14
+ }
@@ -0,0 +1,12 @@
1
+ package com.rngooglemapsplus.extensions
2
+
3
+ import com.google.android.gms.maps.model.JointType
4
+ import com.rngooglemapsplus.RNLineJoinType
5
+
6
+ fun RNLineJoinType?.toMapJointType(): Int =
7
+ when (this) {
8
+ RNLineJoinType.ROUND -> JointType.ROUND
9
+ RNLineJoinType.BEVEL -> JointType.BEVEL
10
+ RNLineJoinType.MITER -> JointType.DEFAULT
11
+ null -> JointType.DEFAULT
12
+ }
@@ -3,12 +3,18 @@ package com.rngooglemapsplus.extensions
3
3
  import com.rngooglemapsplus.RNCircle
4
4
 
5
5
  fun RNCircle.circleEquals(b: RNCircle): Boolean {
6
+ if (!centerEquals(b)) return false
6
7
  if (zIndex != b.zIndex) return false
7
8
  if (pressable != b.pressable) return false
8
- if (center != b.center) return false
9
9
  if (radius != b.radius) return false
10
10
  if (strokeWidth != b.strokeWidth) return false
11
11
  if (strokeColor != b.strokeColor) return false
12
12
  if (fillColor != b.fillColor) return false
13
13
  return true
14
14
  }
15
+
16
+ fun RNCircle.centerEquals(b: RNCircle): Boolean {
17
+ if (center.latitude != b.center.latitude) return false
18
+ if (center.longitude != b.center.longitude) return false
19
+ return true
20
+ }
@@ -2,24 +2,61 @@ package com.rngooglemapsplus.extensions
2
2
 
3
3
  import com.rngooglemapsplus.RNMarker
4
4
 
5
- fun RNMarker.markerEquals(b: RNMarker): Boolean =
6
- id == b.id &&
7
- zIndex == b.zIndex &&
8
- coordinate == b.coordinate &&
9
- anchor == b.anchor &&
10
- showInfoWindow == b.showInfoWindow &&
11
- title == b.title &&
12
- snippet == b.snippet &&
13
- opacity == b.opacity &&
14
- flat == b.flat &&
15
- draggable == b.draggable &&
16
- rotation == b.rotation &&
17
- infoWindowAnchor == b.infoWindowAnchor &&
18
- markerStyleEquals(b)
19
-
20
- fun RNMarker.markerStyleEquals(b: RNMarker): Boolean = iconSvg == b.iconSvg
5
+ fun RNMarker.markerEquals(b: RNMarker): Boolean {
6
+ if (id != b.id) return false
7
+ if (zIndex != b.zIndex) return false
8
+ if (!coordinatesEquals(b)) return false
9
+ if (!anchorEquals(b)) return false
10
+ if (!infoWindowAnchorEquals(b)) return false
11
+ if (title != b.title) return false
12
+ if (snippet != b.snippet) return false
13
+ if (opacity != b.opacity) return false
14
+ if (flat != b.flat) return false
15
+ if (draggable != b.draggable) return false
16
+ if (rotation != b.rotation) return false
17
+ if (!markerInfoWindowStyleEquals(b)) return false
18
+ if (!markerStyleEquals(b)) return false
19
+
20
+ return true
21
+ }
22
+
23
+ fun RNMarker.coordinatesEquals(b: RNMarker): Boolean {
24
+ if (coordinate.latitude != b.coordinate.latitude) return false
25
+ if (coordinate.longitude != b.coordinate.longitude) return false
26
+ return true
27
+ }
28
+
29
+ fun RNMarker.anchorEquals(b: RNMarker): Boolean {
30
+ if (anchor?.x != b.anchor?.x) return false
31
+ if (anchor?.y != b.anchor?.y) return false
32
+ return true
33
+ }
34
+
35
+ fun RNMarker.infoWindowAnchorEquals(b: RNMarker): Boolean {
36
+ if (infoWindowAnchor?.x != b.infoWindowAnchor?.x) return false
37
+ if (infoWindowAnchor?.y != b.infoWindowAnchor?.y) return false
38
+ return true
39
+ }
40
+
41
+ fun RNMarker.markerInfoWindowStyleEquals(b: RNMarker): Boolean {
42
+ if (infoWindowIconSvg?.width != b.infoWindowIconSvg?.width) return false
43
+ if (infoWindowIconSvg?.height != b.infoWindowIconSvg?.height) return false
44
+ if (infoWindowIconSvg?.svgString != b.infoWindowIconSvg?.svgString) return false
45
+
46
+ return true
47
+ }
48
+
49
+ fun RNMarker.markerStyleEquals(b: RNMarker): Boolean {
50
+ if (iconSvg?.width != b.iconSvg?.width) return false
51
+ if (iconSvg?.height != b.iconSvg?.height) return false
52
+ if (iconSvg?.svgString != b.iconSvg?.svgString) return false
53
+
54
+ return true
55
+ }
21
56
 
22
57
  fun RNMarker.styleHash(): Int =
23
58
  arrayOf<Any?>(
24
- iconSvg,
59
+ iconSvg?.width,
60
+ iconSvg?.height,
61
+ iconSvg?.svgString,
25
62
  ).contentHashCode()
@@ -1,6 +1,8 @@
1
1
  package com.rngooglemapsplus.extensions
2
2
 
3
+ import com.google.android.gms.maps.model.LatLng
3
4
  import com.rngooglemapsplus.RNPolygon
5
+ import com.rngooglemapsplus.RNPolygonHole
4
6
 
5
7
  fun RNPolygon.polygonEquals(b: RNPolygon): Boolean {
6
8
  if (zIndex != b.zIndex) return false
@@ -9,7 +11,12 @@ fun RNPolygon.polygonEquals(b: RNPolygon): Boolean {
9
11
  if (fillColor != b.fillColor) return false
10
12
  if (strokeColor != b.strokeColor) return false
11
13
  if (geodesic != b.geodesic) return false
12
- if (!holes.contentEquals(b.holes)) return false
14
+ if (!coordinatesEquals(b)) return false
15
+ if (!holesEquals(b)) return false
16
+ return true
17
+ }
18
+
19
+ fun RNPolygon.coordinatesEquals(b: RNPolygon): Boolean {
13
20
  val ac = coordinates
14
21
  val bc = b.coordinates
15
22
  if (ac.size != bc.size) return false
@@ -20,3 +27,26 @@ fun RNPolygon.polygonEquals(b: RNPolygon): Boolean {
20
27
  }
21
28
  return true
22
29
  }
30
+
31
+ fun RNPolygon.holesEquals(b: RNPolygon): Boolean {
32
+ if (holes?.size != b.holes?.size) return false
33
+ if (holes != null && b.holes != null) {
34
+ for (i in holes.indices) {
35
+ val ah = holes[i]
36
+ val bh = b.holes[i]
37
+
38
+ if (ah.coordinates.size != bh.coordinates.size) return false
39
+ for (j in ah.coordinates.indices) {
40
+ val p = ah.coordinates[j]
41
+ val q = bh.coordinates[j]
42
+ if (p.latitude != q.latitude || p.longitude != q.longitude) return false
43
+ }
44
+ }
45
+ }
46
+ return true
47
+ }
48
+
49
+ fun Array<RNPolygonHole>.toMapsPolygonHoles(): List<List<LatLng>> =
50
+ this.map { hole ->
51
+ hole.coordinates.map { it.toLatLng() }
52
+ }
@@ -5,11 +5,16 @@ import com.rngooglemapsplus.RNPolyline
5
5
  fun RNPolyline.polylineEquals(b: RNPolyline): Boolean {
6
6
  if (zIndex != b.zIndex) return false
7
7
  if (pressable != b.pressable) return false
8
- if ((width ?: 0.0) != (b.width ?: 0.0)) return false
8
+ if (width != b.width) return false
9
9
  if (lineCap != b.lineCap) return false
10
10
  if (lineJoin != b.lineJoin) return false
11
11
  if (geodesic != b.geodesic) return false
12
12
  if (color != b.color) return false
13
+ if (!coordinatesEquals(b)) return false
14
+ return true
15
+ }
16
+
17
+ fun RNPolyline.coordinatesEquals(b: RNPolyline): Boolean {
13
18
  val ac = coordinates
14
19
  val bc = b.coordinates
15
20
  if (ac.size != bc.size) return false
@@ -261,29 +261,48 @@ GMSIndoorDisplayDelegate {
261
261
 
262
262
  var onMapError: ((RNMapErrorCode) -> Void)?
263
263
  var onMapReady: ((Bool) -> Void)?
264
- var onMapLoaded: ((RNRegion, RNCamera) -> Void)?
264
+ var onMapLoaded: ((RNRegion, RNCameraChange) -> Void)?
265
265
  var onLocationUpdate: ((RNLocation) -> Void)?
266
266
  var onLocationError: ((_ error: RNLocationErrorCode) -> Void)?
267
267
  var onMapPress: ((RNLatLng) -> Void)?
268
268
  var onMapLongPress: ((RNLatLng) -> Void)?
269
269
  var onPoiPress: ((String, String, RNLatLng) -> Void)?
270
- var onMarkerPress: ((String?) -> Void)?
271
- var onPolylinePress: ((String?) -> Void)?
272
- var onPolygonPress: ((String?) -> Void)?
273
- var onCirclePress: ((String?) -> Void)?
274
- var onMarkerDragStart: ((String?, RNLatLng) -> Void)?
275
- var onMarkerDrag: ((String?, RNLatLng) -> Void)?
276
- var onMarkerDragEnd: ((String?, RNLatLng) -> Void)?
270
+ var onMarkerPress: ((String) -> Void)?
271
+ var onPolylinePress: ((String) -> Void)?
272
+ var onPolygonPress: ((String) -> Void)?
273
+ var onCirclePress: ((String) -> Void)?
274
+ var onMarkerDragStart: ((String, RNLatLng) -> Void)?
275
+ var onMarkerDrag: ((String, RNLatLng) -> Void)?
276
+ var onMarkerDragEnd: ((String, RNLatLng) -> Void)?
277
277
  var onIndoorBuildingFocused: ((RNIndoorBuilding) -> Void)?
278
278
  var onIndoorLevelActivated: ((RNIndoorLevel) -> Void)?
279
- var onInfoWindowPress: ((String?) -> Void)?
280
- var onInfoWindowClose: ((String?) -> Void)?
281
- var onInfoWindowLongPress: ((String?) -> Void)?
279
+ var onInfoWindowPress: ((String) -> Void)?
280
+ var onInfoWindowClose: ((String) -> Void)?
281
+ var onInfoWindowLongPress: ((String) -> Void)?
282
282
  var onMyLocationPress: ((RNLocation) -> Void)?
283
283
  var onMyLocationButtonPress: ((Bool) -> Void)?
284
- var onCameraChangeStart: ((RNRegion, RNCamera, Bool) -> Void)?
285
- var onCameraChange: ((RNRegion, RNCamera, Bool) -> Void)?
286
- var onCameraChangeComplete: ((RNRegion, RNCamera, Bool) -> Void)?
284
+ var onCameraChangeStart: ((RNRegion, RNCameraChange, Bool) -> Void)?
285
+ var onCameraChange: ((RNRegion, RNCameraChange, Bool) -> Void)?
286
+ var onCameraChangeComplete: ((RNRegion, RNCameraChange, Bool) -> Void)?
287
+
288
+ @MainActor
289
+ func showMarkerInfoWindow(id: String) {
290
+ onMain {
291
+ guard let marker = self.markersById[id] else { return }
292
+ self.mapView?.selectedMarker = nil
293
+ self.mapView?.selectedMarker = marker
294
+ }
295
+ }
296
+
297
+ @MainActor
298
+ func hideMarkerInfoWindow(id: String) {
299
+ onMain {
300
+ guard let marker = self.markersById[id] else { return }
301
+ if self.mapView?.selectedMarker == marker {
302
+ self.mapView?.selectedMarker = nil
303
+ }
304
+ }
305
+ }
287
306
 
288
307
  @MainActor
289
308
  func setCamera(camera: GMSCameraPosition, animated: Bool, durationMs: Double) {
@@ -380,42 +399,16 @@ GMSIndoorDisplayDelegate {
380
399
  mapView.layer.render(in: ctx.cgContext)
381
400
  }
382
401
 
383
- var finalImage = image
384
-
385
- size.map {
386
- UIGraphicsBeginImageContextWithOptions($0, false, 0.0)
387
- image.draw(in: CGRect(origin: .zero, size: $0))
388
- finalImage = UIGraphicsGetImageFromCurrentImageContext() ?? image
389
- UIGraphicsEndImageContext()
390
- }
391
-
392
- let data: Data?
393
- switch imageFormat {
394
- case .jpeg:
395
- data = finalImage.jpegData(compressionQuality: quality)
396
- case .png:
397
- data = finalImage.pngData()
398
- }
399
-
400
- guard let imageData = data else {
401
- promise.resolve(withResult: nil)
402
- return
403
- }
404
-
405
- if resultIsFile {
406
- let filename =
407
- "map_snapshot_\(Int(Date().timeIntervalSince1970)).\(format)"
408
- let fileURL = URL(fileURLWithPath: NSTemporaryDirectory())
409
- .appendingPathComponent(filename)
410
- do {
411
- try imageData.write(to: fileURL)
412
- promise.resolve(withResult: fileURL.path)
413
- } catch {
414
- promise.resolve(withResult: nil)
415
- }
402
+ if let result = image.encode(
403
+ targetSize: size,
404
+ format: format,
405
+ imageFormat: imageFormat,
406
+ quality: quality,
407
+ resultIsFile: resultIsFile
408
+ ) {
409
+ promise.resolve(withResult: result)
416
410
  } else {
417
- let base64 = imageData.base64EncodedString()
418
- promise.resolve(withResult: "data:image/\(format);base64,\(base64)")
411
+ promise.resolve(withResult: nil)
419
412
  }
420
413
  }
421
414
 
@@ -434,19 +427,27 @@ GMSIndoorDisplayDelegate {
434
427
 
435
428
  @MainActor
436
429
  private func addMarkerInternal(id: String, marker: GMSMarker) {
437
- marker.userData = id
438
430
  marker.map = mapView
439
431
  markersById[id] = marker
440
432
  }
441
433
 
442
434
  @MainActor
443
435
  func updateMarker(id: String, block: @escaping (GMSMarker) -> Void) {
444
- markersById[id].map { block($0) }
436
+ markersById[id].map {
437
+ block($0)
438
+ if let mapView, mapView.selectedMarker == $0 {
439
+ mapView.selectedMarker = nil
440
+ mapView.selectedMarker = $0
441
+ }
442
+ }
445
443
  }
446
444
 
447
445
  @MainActor
448
446
  func removeMarker(id: String) {
449
- markersById.removeValue(forKey: id).map { $0.map = nil }
447
+ markersById.removeValue(forKey: id).map {
448
+ $0.icon = nil
449
+ $0.map = nil
450
+ }
450
451
  }
451
452
 
452
453
  @MainActor
@@ -468,8 +469,8 @@ GMSIndoorDisplayDelegate {
468
469
 
469
470
  @MainActor
470
471
  private func addPolylineInternal(id: String, polyline: GMSPolyline) {
472
+ polyline.tagData = PolylineTag(id: id)
471
473
  polyline.map = mapView
472
- polyline.userData = id
473
474
  polylinesById[id] = polyline
474
475
  }
475
476
 
@@ -502,8 +503,8 @@ GMSIndoorDisplayDelegate {
502
503
 
503
504
  @MainActor
504
505
  private func addPolygonInternal(id: String, polygon: GMSPolygon) {
506
+ polygon.tagData = PolygonTag(id: id)
505
507
  polygon.map = mapView
506
- polygon.userData = id
507
508
  polygonsById[id] = polygon
508
509
  }
509
510
 
@@ -536,8 +537,8 @@ GMSIndoorDisplayDelegate {
536
537
 
537
538
  @MainActor
538
539
  private func addCircleInternal(id: String, circle: GMSCircle) {
540
+ circle.tagData = CircleTag(id: id)
539
541
  circle.map = mapView
540
- circle.userData = id
541
542
  circlesById[id] = circle
542
543
  }
543
544
 
@@ -576,7 +577,10 @@ GMSIndoorDisplayDelegate {
576
577
 
577
578
  @MainActor
578
579
  func removeHeatmap(id: String) {
579
- heatmapsById.removeValue(forKey: id).map { $0.map = nil }
580
+ heatmapsById.removeValue(forKey: id).map {
581
+ $0.clearTileCache()
582
+ $0.map = nil
583
+ }
580
584
  }
581
585
 
582
586
  @MainActor
@@ -610,6 +614,7 @@ GMSIndoorDisplayDelegate {
610
614
  geometries: parser.placemarks
611
615
  )
612
616
  renderer.render()
617
+ kmlLayerById[id] = renderer
613
618
  }
614
619
  }
615
620
 
@@ -641,16 +646,23 @@ GMSIndoorDisplayDelegate {
641
646
  urlTileOverlay: GMSURLTileLayer
642
647
  ) {
643
648
  urlTileOverlay.map = mapView
649
+ urlTileOverlays[id] = urlTileOverlay
644
650
  }
645
651
 
646
652
  @MainActor
647
653
  func removeUrlTileOverlay(id: String) {
648
- urlTileOverlays.removeValue(forKey: id).map { $0.map = nil }
654
+ urlTileOverlays.removeValue(forKey: id).map {
655
+ $0.clearTileCache()
656
+ $0.map = nil
657
+ }
649
658
  }
650
659
 
651
660
  @MainActor
652
661
  func clearUrlTileOverlay() {
653
- urlTileOverlays.values.forEach { $0.map = nil }
662
+ urlTileOverlays.values.forEach {
663
+ $0.clearTileCache()
664
+ $0.map = nil
665
+ }
654
666
  urlTileOverlays.removeAll()
655
667
  pendingUrlTileOverlays.removeAll()
656
668
  }
@@ -778,8 +790,7 @@ GMSIndoorDisplayDelegate {
778
790
 
779
791
  func mapView(_ mapView: GMSMapView, didTap marker: GMSMarker) -> Bool {
780
792
  onMain {
781
- mapView.selectedMarker = marker
782
- self.onMarkerPress?(marker.userData as? String, )
793
+ self.onMarkerPress?(marker.idTag)
783
794
  }
784
795
  return uiSettings?.consumeOnMarkerPress ?? false
785
796
  }
@@ -788,13 +799,13 @@ GMSIndoorDisplayDelegate {
788
799
  onMain {
789
800
  switch overlay {
790
801
  case let circle as GMSCircle:
791
- self.onCirclePress?(circle.userData as? String, )
802
+ self.onCirclePress?(circle.idTag)
792
803
 
793
804
  case let polygon as GMSPolygon:
794
- self.onPolygonPress?(polygon.userData as? String, )
805
+ self.onPolygonPress?(polygon.idTag)
795
806
 
796
807
  case let polyline as GMSPolyline:
797
- self.onPolylinePress?(polyline.userData as? String, )
808
+ self.onPolylinePress?(polyline.idTag)
798
809
 
799
810
  default:
800
811
  break
@@ -805,7 +816,7 @@ GMSIndoorDisplayDelegate {
805
816
  func mapView(_ mapView: GMSMapView, didBeginDragging marker: GMSMarker) {
806
817
  onMain {
807
818
  self.onMarkerDragStart?(
808
- marker.userData as? String,
819
+ marker.idTag,
809
820
  marker.position.toRNLatLng()
810
821
  )
811
822
  }
@@ -814,7 +825,7 @@ GMSIndoorDisplayDelegate {
814
825
  func mapView(_ mapView: GMSMapView, didDrag marker: GMSMarker) {
815
826
  onMain {
816
827
  self.onMarkerDrag?(
817
- marker.userData as? String,
828
+ marker.idTag,
818
829
  marker.position.toRNLatLng()
819
830
  )
820
831
  }
@@ -823,7 +834,7 @@ GMSIndoorDisplayDelegate {
823
834
  func mapView(_ mapView: GMSMapView, didEndDragging marker: GMSMarker) {
824
835
  onMain {
825
836
  self.onMarkerDragEnd?(
826
- marker.userData as? String,
837
+ marker.idTag,
827
838
  marker.position.toRNLatLng()
828
839
  )
829
840
  }
@@ -857,13 +868,13 @@ GMSIndoorDisplayDelegate {
857
868
 
858
869
  func mapView(_ mapView: GMSMapView, didTapInfoWindowOf marker: GMSMarker) {
859
870
  onMain {
860
- self.onInfoWindowPress?(marker.userData as? String)
871
+ self.onInfoWindowPress?(marker.idTag)
861
872
  }
862
873
  }
863
874
 
864
875
  func mapView(_ mapView: GMSMapView, didCloseInfoWindowOf marker: GMSMarker) {
865
876
  onMain {
866
- self.onInfoWindowClose?(marker.userData as? String)
877
+ self.onInfoWindowClose?(marker.idTag)
867
878
  }
868
879
  }
869
880
 
@@ -872,7 +883,7 @@ GMSIndoorDisplayDelegate {
872
883
  didLongPressInfoWindowOf marker: GMSMarker
873
884
  ) {
874
885
  onMain {
875
- self.onInfoWindowLongPress?(marker.userData as? String)
886
+ self.onInfoWindowLongPress?(marker.idTag)
876
887
  }
877
888
  }
878
889
 
@@ -893,4 +904,13 @@ GMSIndoorDisplayDelegate {
893
904
  }
894
905
  return uiSettings?.consumeOnMyLocationButtonPress ?? false
895
906
  }
907
+
908
+ func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {
909
+ return markerBuilder.buildInfoWindow(iconSvg: marker.tagData.iconSvg)
910
+ }
911
+
912
+ func mapView(_ mapView: GMSMapView, markerInfoContents marker: GMSMarker)
913
+ -> UIView? {
914
+ return nil
915
+ }
896
916
  }
@@ -35,6 +35,8 @@ final class LocationHandler: NSObject, CLLocationManagerDelegate {
35
35
 
36
36
  func showLocationDialog() {
37
37
  onMainAsync { [weak self] in
38
+ guard let self = self else { return }
39
+
38
40
  guard let vc = Self.topMostViewController() else { return }
39
41
  let title =
40
42
  Bundle.main.object(forInfoDictionaryKey: "LocationNotAvailableTitle")
@@ -61,7 +63,7 @@ final class LocationHandler: NSObject, CLLocationManagerDelegate {
61
63
  title: openLocationSettingsButton ?? "Open settings",
62
64
  style: .default
63
65
  ) { _ in
64
- self?.openLocationSettings()
66
+ self.openLocationSettings()
65
67
  }
66
68
  )
67
69
  vc.present(alert, animated: true, completion: nil)
@@ -17,13 +17,12 @@ final class MapCircleBuilder {
17
17
 
18
18
  @MainActor
19
19
  func update(_ prev: RNCircle, _ next: RNCircle, _ c: GMSCircle) {
20
- if prev.center.latitude != next.center.latitude
21
- || prev.center.longitude != next.center.longitude {
20
+ if !prev.centerEquals(next) {
22
21
  c.position = next.center.toCLLocationCoordinate2D()
23
22
  }
24
23
 
25
24
  if prev.radius != next.radius {
26
- c.radius = next.radius ?? 0
25
+ c.radius = next.radius
27
26
  }
28
27
 
29
28
  if prev.fillColor != next.fillColor {
@@ -32,11 +32,9 @@ func onMain(_ block: @escaping @MainActor () -> Void) {
32
32
 
33
33
  @inline(__always)
34
34
  func onMainAsync(
35
- _ block: @MainActor @escaping () async -> Void
35
+ _ block: @escaping @MainActor () async -> Void
36
36
  ) {
37
- if Thread.isMainThread {
38
- Task { @MainActor in await block() }
39
- } else {
40
- Task { @MainActor in await block() }
37
+ Task { @MainActor in
38
+ await block()
41
39
  }
42
40
  }