@lugg/maps 0.2.0-alpha.9 → 1.0.0-beta.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 (184) hide show
  1. package/README.md +21 -20
  2. package/android/build.gradle +1 -1
  3. package/android/src/main/java/com/luggmaps/LuggCalloutView.kt +74 -0
  4. package/android/src/main/java/com/luggmaps/LuggCalloutViewManager.kt +38 -0
  5. package/android/src/main/java/com/luggmaps/LuggMapView.kt +290 -0
  6. package/android/src/main/java/com/luggmaps/{LuggGoogleMapViewManager.kt → LuggMapViewManager.kt} +99 -36
  7. package/android/src/main/java/com/luggmaps/LuggMapWrapperView.kt +11 -14
  8. package/android/src/main/java/com/luggmaps/LuggMarkerView.kt +187 -21
  9. package/android/src/main/java/com/luggmaps/LuggMarkerViewManager.kt +28 -0
  10. package/android/src/main/java/com/luggmaps/LuggPackage.kt +8 -4
  11. package/android/src/main/java/com/luggmaps/LuggPolygonView.kt +85 -0
  12. package/android/src/main/java/com/luggmaps/LuggPolygonViewManager.kt +100 -0
  13. package/android/src/main/java/com/luggmaps/LuggPolylineView.kt +16 -0
  14. package/android/src/main/java/com/luggmaps/LuggPolylineViewManager.kt +22 -0
  15. package/android/src/main/java/com/luggmaps/core/GoogleMapProvider.kt +874 -0
  16. package/android/src/main/java/com/luggmaps/core/MapProviderDelegate.kt +60 -0
  17. package/android/src/main/java/com/luggmaps/core/PolylineAnimator.kt +89 -24
  18. package/android/src/main/java/com/luggmaps/events/LongPressEvent.kt +29 -0
  19. package/android/src/main/java/com/luggmaps/events/MarkerDragEvent.kt +41 -0
  20. package/android/src/main/java/com/luggmaps/events/MarkerPressEvent.kt +34 -0
  21. package/android/src/main/java/com/luggmaps/events/PolygonPressEvent.kt +12 -0
  22. package/android/src/main/java/com/luggmaps/events/PressEvent.kt +29 -0
  23. package/ios/LuggCalloutView.h +23 -0
  24. package/ios/LuggCalloutView.mm +145 -0
  25. package/ios/LuggMapView.h +9 -0
  26. package/ios/LuggMapView.mm +343 -0
  27. package/ios/LuggMarkerView.h +15 -0
  28. package/ios/LuggMarkerView.mm +136 -2
  29. package/ios/LuggPolygonView.h +31 -0
  30. package/ios/LuggPolygonView.mm +151 -0
  31. package/ios/LuggPolylineView.h +4 -0
  32. package/ios/LuggPolylineView.mm +23 -0
  33. package/ios/core/AppleMapProvider.h +15 -0
  34. package/ios/core/AppleMapProvider.mm +1173 -0
  35. package/ios/core/GMSPolylineAnimator.h +3 -0
  36. package/ios/core/GMSPolylineAnimator.m +101 -15
  37. package/ios/core/GoogleMapProvider.h +13 -0
  38. package/ios/core/GoogleMapProvider.mm +798 -0
  39. package/ios/core/LuggAnnotationView.h +12 -0
  40. package/ios/core/LuggAnnotationView.mm +55 -0
  41. package/ios/core/MKPolylineAnimator.h +4 -0
  42. package/ios/core/MKPolylineAnimator.m +167 -42
  43. package/ios/core/MapProviderDelegate.h +84 -0
  44. package/ios/core/PolylineAnimatorBase.h +24 -1
  45. package/ios/core/PolylineAnimatorBase.m +82 -19
  46. package/ios/events/LongPressEvent.h +29 -0
  47. package/ios/events/MarkerDragEvent.h +69 -0
  48. package/ios/events/MarkerPressEvent.h +29 -0
  49. package/ios/events/PolygonPressEvent.h +20 -0
  50. package/ios/events/PressEvent.h +29 -0
  51. package/ios/extensions/MKMapView+Zoom.h +2 -0
  52. package/ios/extensions/MKMapView+Zoom.m +14 -4
  53. package/lib/module/MapProvider.js +2 -4
  54. package/lib/module/MapProvider.js.map +1 -1
  55. package/lib/module/MapProvider.web.js +14 -7
  56. package/lib/module/MapProvider.web.js.map +1 -1
  57. package/lib/module/MapView.js +33 -16
  58. package/lib/module/MapView.js.map +1 -1
  59. package/lib/module/MapView.web.js +296 -181
  60. package/lib/module/MapView.web.js.map +1 -1
  61. package/lib/module/components/GeoJson.js +159 -0
  62. package/lib/module/components/GeoJson.js.map +1 -0
  63. package/lib/module/components/GeoJson.types.js +4 -0
  64. package/lib/module/components/GeoJson.types.js.map +1 -0
  65. package/lib/module/components/Marker.js +49 -8
  66. package/lib/module/components/Marker.js.map +1 -1
  67. package/lib/module/components/Marker.types.js +4 -0
  68. package/lib/module/components/Marker.types.js.map +1 -0
  69. package/lib/module/components/Marker.web.js +159 -24
  70. package/lib/module/components/Marker.web.js.map +1 -1
  71. package/lib/module/components/Polygon.js +46 -0
  72. package/lib/module/components/Polygon.js.map +1 -0
  73. package/lib/module/components/Polygon.types.js +4 -0
  74. package/lib/module/components/Polygon.types.js.map +1 -0
  75. package/lib/module/components/Polygon.web.js +87 -0
  76. package/lib/module/components/Polygon.web.js.map +1 -0
  77. package/lib/module/components/Polyline.js +17 -4
  78. package/lib/module/components/Polyline.js.map +1 -1
  79. package/lib/module/components/Polyline.types.js +4 -0
  80. package/lib/module/components/Polyline.types.js.map +1 -0
  81. package/lib/module/components/Polyline.web.js +108 -31
  82. package/lib/module/components/Polyline.web.js.map +1 -1
  83. package/lib/module/components/index.js +4 -2
  84. package/lib/module/components/index.js.map +1 -1
  85. package/lib/module/components/index.web.js +2 -0
  86. package/lib/module/components/index.web.js.map +1 -1
  87. package/lib/module/fabric/LuggCalloutViewNativeComponent.ts +20 -0
  88. package/lib/module/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
  89. package/lib/module/fabric/LuggMarkerViewNativeComponent.ts +49 -1
  90. package/lib/module/fabric/LuggPolygonViewNativeComponent.ts +25 -0
  91. package/lib/module/fabric/LuggPolylineViewNativeComponent.ts +8 -0
  92. package/lib/module/index.js +4 -1
  93. package/lib/module/index.js.map +1 -1
  94. package/lib/module/index.web.js +4 -1
  95. package/lib/module/index.web.js.map +1 -1
  96. package/lib/typescript/src/MapProvider.d.ts +1 -1
  97. package/lib/typescript/src/MapProvider.d.ts.map +1 -1
  98. package/lib/typescript/src/MapProvider.web.d.ts +23 -1
  99. package/lib/typescript/src/MapProvider.web.d.ts.map +1 -1
  100. package/lib/typescript/src/MapView.d.ts +4 -4
  101. package/lib/typescript/src/MapView.d.ts.map +1 -1
  102. package/lib/typescript/src/MapView.types.d.ts +35 -9
  103. package/lib/typescript/src/MapView.types.d.ts.map +1 -1
  104. package/lib/typescript/src/MapView.web.d.ts +2 -11
  105. package/lib/typescript/src/MapView.web.d.ts.map +1 -1
  106. package/lib/typescript/src/components/GeoJson.d.ts +4 -0
  107. package/lib/typescript/src/components/GeoJson.d.ts.map +1 -0
  108. package/lib/typescript/src/components/GeoJson.types.d.ts +89 -0
  109. package/lib/typescript/src/components/GeoJson.types.d.ts.map +1 -0
  110. package/lib/typescript/src/components/Marker.d.ts +6 -33
  111. package/lib/typescript/src/components/Marker.d.ts.map +1 -1
  112. package/lib/typescript/src/components/Marker.types.d.ts +100 -0
  113. package/lib/typescript/src/components/Marker.types.d.ts.map +1 -0
  114. package/lib/typescript/src/components/Marker.web.d.ts +2 -5
  115. package/lib/typescript/src/components/Marker.web.d.ts.map +1 -1
  116. package/lib/typescript/src/components/Polygon.d.ts +10 -0
  117. package/lib/typescript/src/components/Polygon.d.ts.map +1 -0
  118. package/lib/typescript/src/components/Polygon.types.d.ts +33 -0
  119. package/lib/typescript/src/components/Polygon.types.d.ts.map +1 -0
  120. package/lib/typescript/src/components/Polygon.web.d.ts +3 -0
  121. package/lib/typescript/src/components/Polygon.web.d.ts.map +1 -0
  122. package/lib/typescript/src/components/Polyline.d.ts +6 -21
  123. package/lib/typescript/src/components/Polyline.d.ts.map +1 -1
  124. package/lib/typescript/src/components/Polyline.types.d.ts +53 -0
  125. package/lib/typescript/src/components/Polyline.types.d.ts.map +1 -0
  126. package/lib/typescript/src/components/Polyline.web.d.ts +2 -5
  127. package/lib/typescript/src/components/Polyline.web.d.ts.map +1 -1
  128. package/lib/typescript/src/components/index.d.ts +8 -2
  129. package/lib/typescript/src/components/index.d.ts.map +1 -1
  130. package/lib/typescript/src/components/index.web.d.ts +6 -2
  131. package/lib/typescript/src/components/index.web.d.ts.map +1 -1
  132. package/lib/typescript/src/fabric/LuggCalloutViewNativeComponent.d.ts +13 -0
  133. package/lib/typescript/src/fabric/LuggCalloutViewNativeComponent.d.ts.map +1 -0
  134. package/lib/typescript/src/fabric/{LuggGoogleMapViewNativeComponent.d.ts → LuggMapViewNativeComponent.d.ts} +30 -4
  135. package/lib/typescript/src/fabric/LuggMapViewNativeComponent.d.ts.map +1 -0
  136. package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts +45 -1
  137. package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts.map +1 -1
  138. package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts +18 -0
  139. package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts.map +1 -0
  140. package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts +7 -0
  141. package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts.map +1 -1
  142. package/lib/typescript/src/index.d.ts +11 -3
  143. package/lib/typescript/src/index.d.ts.map +1 -1
  144. package/lib/typescript/src/index.web.d.ts +9 -1
  145. package/lib/typescript/src/index.web.d.ts.map +1 -1
  146. package/lib/typescript/src/types.d.ts +11 -0
  147. package/lib/typescript/src/types.d.ts.map +1 -1
  148. package/package.json +11 -9
  149. package/src/MapProvider.tsx +1 -3
  150. package/src/MapProvider.web.tsx +22 -3
  151. package/src/MapView.tsx +32 -26
  152. package/src/MapView.types.ts +43 -9
  153. package/src/MapView.web.tsx +368 -210
  154. package/src/components/GeoJson.tsx +221 -0
  155. package/src/components/GeoJson.types.ts +118 -0
  156. package/src/components/Marker.tsx +75 -38
  157. package/src/components/Marker.types.ts +102 -0
  158. package/src/components/Marker.web.tsx +197 -19
  159. package/src/components/Polygon.tsx +52 -0
  160. package/src/components/Polygon.types.ts +33 -0
  161. package/src/components/Polygon.web.tsx +104 -0
  162. package/src/components/Polyline.tsx +23 -22
  163. package/src/components/Polyline.types.ts +55 -0
  164. package/src/components/Polyline.web.tsx +151 -37
  165. package/src/components/index.ts +17 -2
  166. package/src/components/index.web.ts +6 -2
  167. package/src/fabric/LuggCalloutViewNativeComponent.ts +20 -0
  168. package/src/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
  169. package/src/fabric/LuggMarkerViewNativeComponent.ts +49 -1
  170. package/src/fabric/LuggPolygonViewNativeComponent.ts +25 -0
  171. package/src/fabric/LuggPolylineViewNativeComponent.ts +8 -0
  172. package/src/index.ts +30 -1
  173. package/src/index.web.ts +16 -1
  174. package/src/types.ts +13 -0
  175. package/android/src/main/java/com/luggmaps/LuggGoogleMapView.kt +0 -511
  176. package/ios/LuggAppleMapView.h +0 -16
  177. package/ios/LuggAppleMapView.mm +0 -592
  178. package/ios/LuggGoogleMapView.h +0 -13
  179. package/ios/LuggGoogleMapView.mm +0 -455
  180. package/lib/module/fabric/LuggAppleMapViewNativeComponent.ts +0 -83
  181. package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts +0 -54
  182. package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts.map +0 -1
  183. package/lib/typescript/src/fabric/LuggGoogleMapViewNativeComponent.d.ts.map +0 -1
  184. package/src/fabric/LuggAppleMapViewNativeComponent.ts +0 -83
package/README.md CHANGED
@@ -2,6 +2,11 @@
2
2
 
3
3
  Universal maps for your React Native apps 📍
4
4
 
5
+ <img alt="@lugg/maps" src="docs/preview.gif" width="720" />
6
+
7
+ > [!IMPORTANT]
8
+ > This library is currently under heavy development. APIs may change without notice.
9
+
5
10
  ## Installation
6
11
 
7
12
  ```sh
@@ -72,7 +77,7 @@ function App() {
72
77
  ## Usage
73
78
 
74
79
  ```tsx
75
- import { MapView, Marker, Polyline } from '@lugg/maps';
80
+ import { MapView, Marker, Polyline, Polygon } from '@lugg/maps';
76
81
 
77
82
  <MapView
78
83
  style={{ flex: 1 }}
@@ -91,35 +96,31 @@ import { MapView, Marker, Polyline } from '@lugg/maps';
91
96
  ]}
92
97
  strokeWidth={3}
93
98
  />
99
+ <Polygon
100
+ coordinates={[
101
+ { latitude: 37.784, longitude: -122.428 },
102
+ { latitude: 37.784, longitude: -122.422 },
103
+ { latitude: 37.779, longitude: -122.422 },
104
+ { latitude: 37.779, longitude: -122.428 },
105
+ ]}
106
+ fillColor="rgba(66, 133, 244, 0.3)"
107
+ strokeColor="#4285F4"
108
+ strokeWidth={2}
109
+ />
94
110
  </MapView>
95
111
  ```
96
112
 
97
113
  ## Components
98
114
 
99
115
  - [MapView](docs/MAPVIEW.md) - Main map component
100
- - [Marker](docs/MARKER.md) - Map markers
116
+ - [Marker](docs/MARKER.md) - Map markers with callout support
101
117
  - [Polyline](docs/POLYLINE.md) - Draw lines on the map
118
+ - [Polygon](docs/POLYGON.md) - Draw filled shapes on the map
119
+ - [GeoJson](docs/GEOJSON.md) - Render GeoJSON data on the map
102
120
 
103
121
  ## Types
104
122
 
105
- ```ts
106
- interface Coordinate {
107
- latitude: number;
108
- longitude: number;
109
- }
110
-
111
- interface Point {
112
- x: number;
113
- y: number;
114
- }
115
-
116
- interface EdgeInsets {
117
- top: number;
118
- left: number;
119
- bottom: number;
120
- right: number;
121
- }
122
- ```
123
+ See [Types](docs/TYPES.md) for common type definitions (`Coordinate`, `Point`, `EdgeInsets`).
123
124
 
124
125
  ## Contributing
125
126
 
@@ -74,5 +74,5 @@ def kotlin_version = getExtOrDefault("kotlinVersion")
74
74
  dependencies {
75
75
  implementation "com.facebook.react:react-android"
76
76
  implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
77
- implementation "com.google.android.gms:play-services-maps:19.2.0"
77
+ implementation "com.google.android.gms:play-services-maps:20.0.0"
78
78
  }
@@ -0,0 +1,74 @@
1
+ package com.luggmaps
2
+
3
+ import android.content.Context
4
+ import android.graphics.Bitmap
5
+ import android.graphics.Canvas
6
+ import android.view.View
7
+ import androidx.core.graphics.createBitmap
8
+ import androidx.core.view.isNotEmpty
9
+ import com.facebook.react.views.view.ReactViewGroup
10
+
11
+ class LuggCalloutView(context: Context) : ReactViewGroup(context) {
12
+ val contentView: ReactViewGroup = ReactViewGroup(context)
13
+ var bubbled: Boolean = true
14
+ var anchorX: Float = 0.5f
15
+ set(value) {
16
+ field = value
17
+ onUpdate?.invoke()
18
+ }
19
+ var anchorY: Float = 1.0f
20
+ set(value) {
21
+ field = value
22
+ onUpdate?.invoke()
23
+ }
24
+ var onUpdate: (() -> Unit)? = null
25
+
26
+ val hasCustomContent: Boolean
27
+ get() = contentView.isNotEmpty()
28
+
29
+ init {
30
+ visibility = GONE
31
+ }
32
+
33
+ override fun addView(child: View, index: Int) {
34
+ contentView.addView(child, index)
35
+ child.addOnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
36
+ onUpdate?.invoke()
37
+ }
38
+ }
39
+
40
+ override fun removeView(child: View) {
41
+ contentView.removeView(child)
42
+ }
43
+
44
+ override fun removeViewAt(index: Int) {
45
+ contentView.removeViewAt(index)
46
+ }
47
+
48
+ override fun getChildCount(): Int = contentView.childCount
49
+
50
+ override fun getChildAt(index: Int): View? = contentView.getChildAt(index)
51
+
52
+ fun createContentBitmap(): Bitmap? {
53
+ var maxWidth = 0
54
+ var maxHeight = 0
55
+ for (i in 0 until contentView.childCount) {
56
+ val child = contentView.getChildAt(i)
57
+ val childRight = child.left + child.width
58
+ val childBottom = child.top + child.height
59
+ if (childRight > maxWidth) maxWidth = childRight
60
+ if (childBottom > maxHeight) maxHeight = childBottom
61
+ }
62
+
63
+ if (maxWidth <= 0 || maxHeight <= 0) return null
64
+
65
+ val bitmap = createBitmap(maxWidth, maxHeight)
66
+ val canvas = Canvas(bitmap)
67
+ contentView.draw(canvas)
68
+ return bitmap
69
+ }
70
+
71
+ fun onDropViewInstance() {
72
+ contentView.removeAllViews()
73
+ }
74
+ }
@@ -0,0 +1,38 @@
1
+ package com.luggmaps
2
+
3
+ import com.facebook.react.bridge.ReadableMap
4
+ import com.facebook.react.module.annotations.ReactModule
5
+ import com.facebook.react.uimanager.ThemedReactContext
6
+ import com.facebook.react.uimanager.ViewGroupManager
7
+ import com.facebook.react.uimanager.ViewManagerDelegate
8
+ import com.facebook.react.viewmanagers.LuggCalloutViewManagerDelegate
9
+ import com.facebook.react.viewmanagers.LuggCalloutViewManagerInterface
10
+
11
+ @ReactModule(name = LuggCalloutViewManager.NAME)
12
+ class LuggCalloutViewManager :
13
+ ViewGroupManager<LuggCalloutView>(),
14
+ LuggCalloutViewManagerInterface<LuggCalloutView> {
15
+ private val delegate: ViewManagerDelegate<LuggCalloutView> = LuggCalloutViewManagerDelegate(this)
16
+
17
+ override fun getDelegate(): ViewManagerDelegate<LuggCalloutView> = delegate
18
+ override fun getName(): String = NAME
19
+ override fun createViewInstance(context: ThemedReactContext): LuggCalloutView = LuggCalloutView(context)
20
+
21
+ override fun setBubbled(view: LuggCalloutView, value: Boolean) {
22
+ view.bubbled = value
23
+ }
24
+
25
+ override fun setAnchor(view: LuggCalloutView, value: ReadableMap?) {
26
+ view.anchorX = value?.getDouble("x")?.toFloat() ?: 0.5f
27
+ view.anchorY = value?.getDouble("y")?.toFloat() ?: 1.0f
28
+ }
29
+
30
+ override fun onDropViewInstance(view: LuggCalloutView) {
31
+ super.onDropViewInstance(view)
32
+ view.onDropViewInstance()
33
+ }
34
+
35
+ companion object {
36
+ const val NAME = "LuggCalloutView"
37
+ }
38
+ }
@@ -0,0 +1,290 @@
1
+ package com.luggmaps
2
+
3
+ import android.annotation.SuppressLint
4
+ import android.view.View
5
+ import android.view.View.VISIBLE
6
+ import com.facebook.react.uimanager.ThemedReactContext
7
+ import com.facebook.react.util.RNLog
8
+ import com.facebook.react.views.view.ReactViewGroup
9
+ import com.google.android.gms.maps.model.LatLng
10
+ import com.luggmaps.core.EdgeInsets
11
+ import com.luggmaps.core.GoogleMapProvider
12
+ import com.luggmaps.core.MapProvider
13
+ import com.luggmaps.core.MapProviderDelegate
14
+
15
+ interface LuggMapViewEventDelegate {
16
+ fun onCameraMove(
17
+ view: LuggMapView,
18
+ latitude: Double,
19
+ longitude: Double,
20
+ zoom: Float,
21
+ gesture: Boolean
22
+ )
23
+ fun onCameraIdle(
24
+ view: LuggMapView,
25
+ latitude: Double,
26
+ longitude: Double,
27
+ zoom: Float,
28
+ gesture: Boolean
29
+ )
30
+ fun onReady(view: LuggMapView)
31
+ fun onPress(
32
+ view: LuggMapView,
33
+ latitude: Double,
34
+ longitude: Double,
35
+ x: Float,
36
+ y: Float
37
+ )
38
+ fun onLongPress(
39
+ view: LuggMapView,
40
+ latitude: Double,
41
+ longitude: Double,
42
+ x: Float,
43
+ y: Float
44
+ )
45
+ }
46
+
47
+ @SuppressLint("ViewConstructor")
48
+ class LuggMapView(private val reactContext: ThemedReactContext) :
49
+ ReactViewGroup(reactContext),
50
+ MapProviderDelegate {
51
+
52
+ var eventDelegate: LuggMapViewEventDelegate? = null
53
+ private var provider: MapProvider? = null
54
+ private var mapWrapperView: LuggMapWrapperView? = null
55
+
56
+ // Cached props (applied during initializeProvider)
57
+ private var mapId: String = GoogleMapProvider.DEMO_MAP_ID
58
+ private var initialLatitude: Double = 37.78
59
+ private var initialLongitude: Double = -122.43
60
+ private var initialZoom: Float = 14f
61
+ private var theme: String = "system"
62
+ private var zoomEnabled: Boolean = true
63
+ private var scrollEnabled: Boolean = true
64
+ private var rotateEnabled: Boolean = true
65
+ private var pitchEnabled: Boolean = true
66
+ private var userLocationEnabled: Boolean = false
67
+ private var userLocationButtonEnabled: Boolean = false
68
+ private var minZoom: Double? = null
69
+ private var maxZoom: Double? = null
70
+ private var edgeInsets: EdgeInsets = EdgeInsets()
71
+
72
+ // region View Lifecycle
73
+
74
+ override fun addView(child: View?, index: Int) {
75
+ super.addView(child, index)
76
+ when (child) {
77
+ is LuggMapWrapperView -> mapWrapperView = child
78
+ is LuggMarkerView -> provider?.addMarkerView(child)
79
+ is LuggPolylineView -> provider?.addPolylineView(child)
80
+ is LuggPolygonView -> provider?.addPolygonView(child)
81
+ }
82
+ }
83
+
84
+ override fun removeViewAt(index: Int) {
85
+ val view = getChildAt(index)
86
+ when (view) {
87
+ is LuggMarkerView -> provider?.removeMarkerView(view)
88
+ is LuggPolylineView -> provider?.removePolylineView(view)
89
+ is LuggPolygonView -> provider?.removePolygonView(view)
90
+ }
91
+ super.removeViewAt(index)
92
+ }
93
+
94
+ override fun onAttachedToWindow() {
95
+ super.onAttachedToWindow()
96
+ if (provider == null && mapWrapperView != null) {
97
+ initializeProvider()
98
+ }
99
+ }
100
+
101
+ override fun onWindowVisibilityChanged(visibility: Int) {
102
+ super.onWindowVisibilityChanged(visibility)
103
+ if (visibility == VISIBLE) {
104
+ provider?.resumeAnimations()
105
+ } else {
106
+ provider?.pauseAnimations()
107
+ }
108
+ }
109
+
110
+ fun onDropViewInstance() {
111
+ provider?.destroy()
112
+ provider = null
113
+ mapWrapperView = null
114
+ }
115
+
116
+ // endregion
117
+
118
+ // region Provider Initialization
119
+
120
+ private fun initializeProvider() {
121
+ if (provider != null || mapWrapperView == null) return
122
+
123
+ val google = GoogleMapProvider(context)
124
+ google.mapId = mapId
125
+ google.delegate = this
126
+ provider = google
127
+
128
+ applyProps()
129
+
130
+ google.initializeMap(mapWrapperView!!, initialLatitude, initialLongitude, initialZoom)
131
+
132
+ // Flush children mounted before provider was created
133
+ for (i in 0 until childCount) {
134
+ when (val child = getChildAt(i)) {
135
+ is LuggMarkerView -> google.addMarkerView(child)
136
+ is LuggPolylineView -> google.addPolylineView(child)
137
+ is LuggPolygonView -> google.addPolygonView(child)
138
+ }
139
+ }
140
+ }
141
+
142
+ // endregion
143
+
144
+ // region MapProviderDelegate
145
+
146
+ override fun mapProviderDidReady() {
147
+ eventDelegate?.onReady(this)
148
+ }
149
+
150
+ override fun mapProviderDidMoveCamera(latitude: Double, longitude: Double, zoom: Float, gesture: Boolean) {
151
+ eventDelegate?.onCameraMove(this, latitude, longitude, zoom, gesture)
152
+ }
153
+
154
+ override fun mapProviderDidIdleCamera(latitude: Double, longitude: Double, zoom: Float, gesture: Boolean) {
155
+ eventDelegate?.onCameraIdle(this, latitude, longitude, zoom, gesture)
156
+ }
157
+
158
+ override fun mapProviderDidPress(latitude: Double, longitude: Double, x: Float, y: Float) {
159
+ eventDelegate?.onPress(this, latitude, longitude, x, y)
160
+ }
161
+
162
+ override fun mapProviderDidLongPress(latitude: Double, longitude: Double, x: Float, y: Float) {
163
+ eventDelegate?.onLongPress(this, latitude, longitude, x, y)
164
+ }
165
+
166
+ // endregion
167
+
168
+ // region Property Setters
169
+
170
+ private fun applyProps() {
171
+ provider?.setZoomEnabled(zoomEnabled)
172
+ provider?.setScrollEnabled(scrollEnabled)
173
+ provider?.setRotateEnabled(rotateEnabled)
174
+ provider?.setPitchEnabled(pitchEnabled)
175
+ provider?.setUserLocationEnabled(userLocationEnabled)
176
+ provider?.setUserLocationButtonEnabled(userLocationButtonEnabled)
177
+ provider?.setTheme(theme)
178
+ minZoom?.let { provider?.setMinZoom(it) }
179
+ maxZoom?.let { provider?.setMaxZoom(it) }
180
+ provider?.setEdgeInsets(edgeInsets)
181
+ }
182
+
183
+ fun setProvider(value: String?) {
184
+ if (value != null && value != "google") {
185
+ RNLog.w(reactContext, "LuggMapView: Only Google Maps is supported on Android")
186
+ }
187
+ }
188
+
189
+ fun setMapId(value: String?) {
190
+ if (value.isNullOrEmpty()) return
191
+ mapId = value
192
+ }
193
+
194
+ fun setInitialCoordinate(latitude: Double, longitude: Double) {
195
+ initialLatitude = latitude
196
+ initialLongitude = longitude
197
+ }
198
+
199
+ fun setInitialZoom(zoom: Double) {
200
+ initialZoom = zoom.toFloat()
201
+ }
202
+
203
+ fun setZoomEnabled(enabled: Boolean) {
204
+ if (zoomEnabled == enabled) return
205
+ zoomEnabled = enabled
206
+ provider?.setZoomEnabled(enabled)
207
+ }
208
+
209
+ fun setScrollEnabled(enabled: Boolean) {
210
+ if (scrollEnabled == enabled) return
211
+ scrollEnabled = enabled
212
+ provider?.setScrollEnabled(enabled)
213
+ }
214
+
215
+ fun setRotateEnabled(enabled: Boolean) {
216
+ if (rotateEnabled == enabled) return
217
+ rotateEnabled = enabled
218
+ provider?.setRotateEnabled(enabled)
219
+ }
220
+
221
+ fun setPitchEnabled(enabled: Boolean) {
222
+ if (pitchEnabled == enabled) return
223
+ pitchEnabled = enabled
224
+ provider?.setPitchEnabled(enabled)
225
+ }
226
+
227
+ fun setUserLocationEnabled(enabled: Boolean) {
228
+ if (userLocationEnabled == enabled) return
229
+ userLocationEnabled = enabled
230
+ provider?.setUserLocationEnabled(enabled)
231
+ }
232
+
233
+ fun setUserLocationButtonEnabled(enabled: Boolean) {
234
+ if (userLocationButtonEnabled == enabled) return
235
+ userLocationButtonEnabled = enabled
236
+ provider?.setUserLocationButtonEnabled(enabled)
237
+ }
238
+
239
+ fun setMinZoom(zoom: Double) {
240
+ if (minZoom == zoom) return
241
+ minZoom = zoom
242
+ provider?.setMinZoom(zoom)
243
+ }
244
+
245
+ fun setMaxZoom(zoom: Double) {
246
+ if (maxZoom == zoom) return
247
+ maxZoom = zoom
248
+ provider?.setMaxZoom(zoom)
249
+ }
250
+
251
+ fun setTheme(value: String) {
252
+ if (theme == value) return
253
+ theme = value
254
+ provider?.setTheme(value)
255
+ }
256
+
257
+ fun setEdgeInsets(
258
+ top: Int,
259
+ left: Int,
260
+ bottom: Int,
261
+ right: Int,
262
+ duration: Int = 0
263
+ ) {
264
+ val newEdgeInsets = EdgeInsets(top, left, bottom, right)
265
+ if (edgeInsets == newEdgeInsets) return
266
+ edgeInsets = newEdgeInsets
267
+ provider?.setEdgeInsets(edgeInsets, duration)
268
+ }
269
+
270
+ // endregion
271
+
272
+ // region Commands
273
+
274
+ fun moveCamera(latitude: Double, longitude: Double, zoom: Double, duration: Int) {
275
+ provider?.moveCamera(latitude, longitude, zoom, duration)
276
+ }
277
+
278
+ fun fitCoordinates(
279
+ coordinates: List<LatLng>,
280
+ edgeInsetsTop: Int,
281
+ edgeInsetsLeft: Int,
282
+ edgeInsetsBottom: Int,
283
+ edgeInsetsRight: Int,
284
+ duration: Int
285
+ ) {
286
+ provider?.fitCoordinates(coordinates, edgeInsetsTop, edgeInsetsLeft, edgeInsetsBottom, edgeInsetsRight, duration)
287
+ }
288
+
289
+ // endregion
290
+ }