@lugg/maps 0.2.0-alpha.8 → 1.0.0-beta.0

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 (173) hide show
  1. package/README.md +20 -19
  2. package/android/src/main/java/com/luggmaps/LuggMapView.kt +290 -0
  3. package/android/src/main/java/com/luggmaps/{LuggGoogleMapViewManager.kt → LuggMapViewManager.kt} +99 -36
  4. package/android/src/main/java/com/luggmaps/LuggMapWrapperView.kt +13 -5
  5. package/android/src/main/java/com/luggmaps/LuggMarkerView.kt +157 -13
  6. package/android/src/main/java/com/luggmaps/LuggMarkerViewManager.kt +28 -0
  7. package/android/src/main/java/com/luggmaps/LuggPackage.kt +1 -4
  8. package/android/src/main/java/com/luggmaps/LuggPolygonView.kt +85 -0
  9. package/android/src/main/java/com/luggmaps/LuggPolygonViewManager.kt +100 -0
  10. package/android/src/main/java/com/luggmaps/LuggPolylineView.kt +16 -0
  11. package/android/src/main/java/com/luggmaps/LuggPolylineViewManager.kt +22 -0
  12. package/android/src/main/java/com/luggmaps/core/GoogleMapProvider.kt +698 -0
  13. package/android/src/main/java/com/luggmaps/core/MapProviderDelegate.kt +60 -0
  14. package/android/src/main/java/com/luggmaps/core/PolylineAnimator.kt +89 -24
  15. package/android/src/main/java/com/luggmaps/events/LongPressEvent.kt +29 -0
  16. package/android/src/main/java/com/luggmaps/events/MarkerDragEvent.kt +41 -0
  17. package/android/src/main/java/com/luggmaps/events/MarkerPressEvent.kt +34 -0
  18. package/android/src/main/java/com/luggmaps/events/PolygonPressEvent.kt +12 -0
  19. package/android/src/main/java/com/luggmaps/events/PressEvent.kt +29 -0
  20. package/ios/LuggMapView.h +9 -0
  21. package/ios/LuggMapView.mm +343 -0
  22. package/ios/LuggMarkerView.h +13 -0
  23. package/ios/LuggMarkerView.mm +119 -0
  24. package/ios/LuggPolygonView.h +31 -0
  25. package/ios/LuggPolygonView.mm +151 -0
  26. package/ios/LuggPolylineView.h +4 -0
  27. package/ios/LuggPolylineView.mm +23 -0
  28. package/ios/core/AppleMapProvider.h +15 -0
  29. package/ios/core/AppleMapProvider.mm +1029 -0
  30. package/ios/core/GMSPolylineAnimator.h +3 -0
  31. package/ios/core/GMSPolylineAnimator.m +101 -15
  32. package/ios/core/GoogleMapProvider.h +13 -0
  33. package/ios/core/GoogleMapProvider.mm +689 -0
  34. package/ios/core/MKPolylineAnimator.h +4 -0
  35. package/ios/core/MKPolylineAnimator.m +167 -42
  36. package/ios/core/MapProviderDelegate.h +84 -0
  37. package/ios/core/PolylineAnimatorBase.h +24 -1
  38. package/ios/core/PolylineAnimatorBase.m +82 -19
  39. package/ios/events/LongPressEvent.h +29 -0
  40. package/ios/events/MarkerDragEvent.h +69 -0
  41. package/ios/events/MarkerPressEvent.h +29 -0
  42. package/ios/events/PolygonPressEvent.h +20 -0
  43. package/ios/events/PressEvent.h +29 -0
  44. package/ios/extensions/MKMapView+Zoom.h +2 -0
  45. package/ios/extensions/MKMapView+Zoom.m +14 -4
  46. package/lib/module/MapProvider.js +2 -4
  47. package/lib/module/MapProvider.js.map +1 -1
  48. package/lib/module/MapProvider.web.js +12 -7
  49. package/lib/module/MapProvider.web.js.map +1 -1
  50. package/lib/module/MapView.js +33 -16
  51. package/lib/module/MapView.js.map +1 -1
  52. package/lib/module/MapView.web.js +315 -217
  53. package/lib/module/MapView.web.js.map +1 -1
  54. package/lib/module/components/GeoJson.js +159 -0
  55. package/lib/module/components/GeoJson.js.map +1 -0
  56. package/lib/module/components/GeoJson.types.js +4 -0
  57. package/lib/module/components/GeoJson.types.js.map +1 -0
  58. package/lib/module/components/Marker.js +28 -4
  59. package/lib/module/components/Marker.js.map +1 -1
  60. package/lib/module/components/Marker.types.js +4 -0
  61. package/lib/module/components/Marker.types.js.map +1 -0
  62. package/lib/module/components/Marker.web.js +98 -27
  63. package/lib/module/components/Marker.web.js.map +1 -1
  64. package/lib/module/components/Polygon.js +46 -0
  65. package/lib/module/components/Polygon.js.map +1 -0
  66. package/lib/module/components/Polygon.types.js +4 -0
  67. package/lib/module/components/Polygon.types.js.map +1 -0
  68. package/lib/module/components/Polygon.web.js +87 -0
  69. package/lib/module/components/Polygon.web.js.map +1 -0
  70. package/lib/module/components/Polyline.js +17 -4
  71. package/lib/module/components/Polyline.js.map +1 -1
  72. package/lib/module/components/Polyline.types.js +4 -0
  73. package/lib/module/components/Polyline.types.js.map +1 -0
  74. package/lib/module/components/Polyline.web.js +108 -31
  75. package/lib/module/components/Polyline.web.js.map +1 -1
  76. package/lib/module/components/index.js +4 -2
  77. package/lib/module/components/index.js.map +1 -1
  78. package/lib/module/components/index.web.js +2 -0
  79. package/lib/module/components/index.web.js.map +1 -1
  80. package/lib/module/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
  81. package/lib/module/fabric/LuggMarkerViewNativeComponent.ts +49 -1
  82. package/lib/module/fabric/LuggPolygonViewNativeComponent.ts +25 -0
  83. package/lib/module/fabric/LuggPolylineViewNativeComponent.ts +8 -0
  84. package/lib/module/index.js +4 -1
  85. package/lib/module/index.js.map +1 -1
  86. package/lib/module/index.web.js +4 -1
  87. package/lib/module/index.web.js.map +1 -1
  88. package/lib/typescript/src/MapProvider.d.ts +1 -1
  89. package/lib/typescript/src/MapProvider.d.ts.map +1 -1
  90. package/lib/typescript/src/MapProvider.web.d.ts +17 -1
  91. package/lib/typescript/src/MapProvider.web.d.ts.map +1 -1
  92. package/lib/typescript/src/MapView.d.ts +4 -4
  93. package/lib/typescript/src/MapView.d.ts.map +1 -1
  94. package/lib/typescript/src/MapView.types.d.ts +35 -9
  95. package/lib/typescript/src/MapView.types.d.ts.map +1 -1
  96. package/lib/typescript/src/MapView.web.d.ts +2 -11
  97. package/lib/typescript/src/MapView.web.d.ts.map +1 -1
  98. package/lib/typescript/src/components/GeoJson.d.ts +4 -0
  99. package/lib/typescript/src/components/GeoJson.d.ts.map +1 -0
  100. package/lib/typescript/src/components/GeoJson.types.d.ts +79 -0
  101. package/lib/typescript/src/components/GeoJson.types.d.ts.map +1 -0
  102. package/lib/typescript/src/components/Marker.d.ts +6 -33
  103. package/lib/typescript/src/components/Marker.d.ts.map +1 -1
  104. package/lib/typescript/src/components/Marker.types.d.ts +74 -0
  105. package/lib/typescript/src/components/Marker.types.d.ts.map +1 -0
  106. package/lib/typescript/src/components/Marker.web.d.ts +2 -5
  107. package/lib/typescript/src/components/Marker.web.d.ts.map +1 -1
  108. package/lib/typescript/src/components/Polygon.d.ts +10 -0
  109. package/lib/typescript/src/components/Polygon.d.ts.map +1 -0
  110. package/lib/typescript/src/components/Polygon.types.d.ts +33 -0
  111. package/lib/typescript/src/components/Polygon.types.d.ts.map +1 -0
  112. package/lib/typescript/src/components/Polygon.web.d.ts +3 -0
  113. package/lib/typescript/src/components/Polygon.web.d.ts.map +1 -0
  114. package/lib/typescript/src/components/Polyline.d.ts +6 -21
  115. package/lib/typescript/src/components/Polyline.d.ts.map +1 -1
  116. package/lib/typescript/src/components/Polyline.types.d.ts +53 -0
  117. package/lib/typescript/src/components/Polyline.types.d.ts.map +1 -0
  118. package/lib/typescript/src/components/Polyline.web.d.ts +2 -5
  119. package/lib/typescript/src/components/Polyline.web.d.ts.map +1 -1
  120. package/lib/typescript/src/components/index.d.ts +8 -2
  121. package/lib/typescript/src/components/index.d.ts.map +1 -1
  122. package/lib/typescript/src/components/index.web.d.ts +6 -2
  123. package/lib/typescript/src/components/index.web.d.ts.map +1 -1
  124. package/lib/typescript/src/fabric/{LuggGoogleMapViewNativeComponent.d.ts → LuggMapViewNativeComponent.d.ts} +30 -4
  125. package/lib/typescript/src/fabric/LuggMapViewNativeComponent.d.ts.map +1 -0
  126. package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts +45 -1
  127. package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts.map +1 -1
  128. package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts +18 -0
  129. package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts.map +1 -0
  130. package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts +7 -0
  131. package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts.map +1 -1
  132. package/lib/typescript/src/index.d.ts +11 -3
  133. package/lib/typescript/src/index.d.ts.map +1 -1
  134. package/lib/typescript/src/index.web.d.ts +9 -1
  135. package/lib/typescript/src/index.web.d.ts.map +1 -1
  136. package/lib/typescript/src/types.d.ts +11 -0
  137. package/lib/typescript/src/types.d.ts.map +1 -1
  138. package/package.json +10 -9
  139. package/src/MapProvider.tsx +1 -3
  140. package/src/MapProvider.web.tsx +12 -3
  141. package/src/MapView.tsx +32 -26
  142. package/src/MapView.types.ts +43 -9
  143. package/src/MapView.web.tsx +376 -244
  144. package/src/components/GeoJson.tsx +221 -0
  145. package/src/components/GeoJson.types.ts +107 -0
  146. package/src/components/Marker.tsx +45 -36
  147. package/src/components/Marker.types.ts +75 -0
  148. package/src/components/Marker.web.tsx +116 -28
  149. package/src/components/Polygon.tsx +52 -0
  150. package/src/components/Polygon.types.ts +33 -0
  151. package/src/components/Polygon.web.tsx +104 -0
  152. package/src/components/Polyline.tsx +23 -22
  153. package/src/components/Polyline.types.ts +55 -0
  154. package/src/components/Polyline.web.tsx +151 -37
  155. package/src/components/index.ts +16 -2
  156. package/src/components/index.web.ts +6 -2
  157. package/src/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
  158. package/src/fabric/LuggMarkerViewNativeComponent.ts +49 -1
  159. package/src/fabric/LuggPolygonViewNativeComponent.ts +25 -0
  160. package/src/fabric/LuggPolylineViewNativeComponent.ts +8 -0
  161. package/src/index.ts +28 -1
  162. package/src/index.web.ts +15 -1
  163. package/src/types.ts +13 -0
  164. package/android/src/main/java/com/luggmaps/LuggGoogleMapView.kt +0 -511
  165. package/ios/LuggAppleMapView.h +0 -16
  166. package/ios/LuggAppleMapView.mm +0 -592
  167. package/ios/LuggGoogleMapView.h +0 -13
  168. package/ios/LuggGoogleMapView.mm +0 -455
  169. package/lib/module/fabric/LuggAppleMapViewNativeComponent.ts +0 -83
  170. package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts +0 -54
  171. package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts.map +0 -1
  172. package/lib/typescript/src/fabric/LuggGoogleMapViewNativeComponent.d.ts.map +0 -1
  173. 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,6 +96,17 @@ 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
 
@@ -99,27 +115,12 @@ import { MapView, Marker, Polyline } from '@lugg/maps';
99
115
  - [MapView](docs/MAPVIEW.md) - Main map component
100
116
  - [Marker](docs/MARKER.md) - Map markers
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
 
@@ -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
+ }
@@ -8,40 +8,44 @@ import com.facebook.react.uimanager.ThemedReactContext
8
8
  import com.facebook.react.uimanager.ViewGroupManager
9
9
  import com.facebook.react.uimanager.ViewManagerDelegate
10
10
  import com.facebook.react.uimanager.annotations.ReactProp
11
- import com.facebook.react.viewmanagers.LuggGoogleMapViewManagerDelegate
12
- import com.facebook.react.viewmanagers.LuggGoogleMapViewManagerInterface
11
+ import com.facebook.react.viewmanagers.LuggMapViewManagerDelegate
12
+ import com.facebook.react.viewmanagers.LuggMapViewManagerInterface
13
13
  import com.google.android.gms.maps.model.LatLng
14
14
  import com.luggmaps.events.CameraIdleEvent
15
15
  import com.luggmaps.events.CameraMoveEvent
16
+ import com.luggmaps.events.LongPressEvent
17
+ import com.luggmaps.events.PressEvent
16
18
  import com.luggmaps.events.ReadyEvent
17
19
  import com.luggmaps.extensions.dispatchEvent
18
20
 
19
- @ReactModule(name = LuggGoogleMapViewManager.NAME)
20
- class LuggGoogleMapViewManager :
21
- ViewGroupManager<LuggGoogleMapView>(),
22
- LuggGoogleMapViewManagerInterface<LuggGoogleMapView>,
23
- LuggGoogleMapViewEventDelegate {
24
- private val delegate: ViewManagerDelegate<LuggGoogleMapView> = LuggGoogleMapViewManagerDelegate(this)
21
+ @ReactModule(name = LuggMapViewManager.NAME)
22
+ class LuggMapViewManager :
23
+ ViewGroupManager<LuggMapView>(),
24
+ LuggMapViewManagerInterface<LuggMapView>,
25
+ LuggMapViewEventDelegate {
26
+ private val delegate: ViewManagerDelegate<LuggMapView> = LuggMapViewManagerDelegate(this)
25
27
 
26
- override fun getDelegate(): ViewManagerDelegate<LuggGoogleMapView> = delegate
28
+ override fun getDelegate(): ViewManagerDelegate<LuggMapView> = delegate
27
29
 
28
30
  override fun getName(): String = NAME
29
31
 
30
- override fun createViewInstance(context: ThemedReactContext): LuggGoogleMapView {
31
- val view = LuggGoogleMapView(context)
32
+ override fun createViewInstance(context: ThemedReactContext): LuggMapView {
33
+ val view = LuggMapView(context)
32
34
  view.eventDelegate = this
33
35
  return view
34
36
  }
35
37
 
36
38
  override fun getExportedCustomDirectEventTypeConstants(): Map<String, Any> =
37
39
  mapOf(
40
+ "topMapPress" to mapOf("registrationName" to "onMapPress"),
41
+ "topMapLongPress" to mapOf("registrationName" to "onMapLongPress"),
38
42
  "topCameraMove" to mapOf("registrationName" to "onCameraMove"),
39
43
  "topCameraIdle" to mapOf("registrationName" to "onCameraIdle"),
40
44
  "topReady" to mapOf("registrationName" to "onReady")
41
45
  )
42
46
 
43
47
  override fun onCameraMove(
44
- view: LuggGoogleMapView,
48
+ view: LuggMapView,
45
49
  latitude: Double,
46
50
  longitude: Double,
47
51
  zoom: Float,
@@ -51,7 +55,7 @@ class LuggGoogleMapViewManager :
51
55
  }
52
56
 
53
57
  override fun onCameraIdle(
54
- view: LuggGoogleMapView,
58
+ view: LuggMapView,
55
59
  latitude: Double,
56
60
  longitude: Double,
57
61
  zoom: Float,
@@ -60,17 +64,42 @@ class LuggGoogleMapViewManager :
60
64
  view.dispatchEvent(CameraIdleEvent(view, latitude, longitude, zoom, gesture))
61
65
  }
62
66
 
63
- override fun onReady(view: LuggGoogleMapView) {
67
+ override fun onReady(view: LuggMapView) {
64
68
  view.dispatchEvent(ReadyEvent(view))
65
69
  }
66
70
 
71
+ override fun onPress(
72
+ view: LuggMapView,
73
+ latitude: Double,
74
+ longitude: Double,
75
+ x: Float,
76
+ y: Float
77
+ ) {
78
+ view.dispatchEvent(PressEvent(view, latitude, longitude, x, y))
79
+ }
80
+
81
+ override fun onLongPress(
82
+ view: LuggMapView,
83
+ latitude: Double,
84
+ longitude: Double,
85
+ x: Float,
86
+ y: Float
87
+ ) {
88
+ view.dispatchEvent(LongPressEvent(view, latitude, longitude, x, y))
89
+ }
90
+
91
+ @ReactProp(name = "provider")
92
+ override fun setProvider(view: LuggMapView, value: String?) {
93
+ view.setProvider(value)
94
+ }
95
+
67
96
  @ReactProp(name = "mapId")
68
- override fun setMapId(view: LuggGoogleMapView, value: String?) {
97
+ override fun setMapId(view: LuggMapView, value: String?) {
69
98
  view.setMapId(value)
70
99
  }
71
100
 
72
101
  @ReactProp(name = "initialCoordinate")
73
- override fun setInitialCoordinate(view: LuggGoogleMapView, value: ReadableMap?) {
102
+ override fun setInitialCoordinate(view: LuggMapView, value: ReadableMap?) {
74
103
  value?.let {
75
104
  val latitude = if (it.hasKey("latitude")) it.getDouble("latitude") else 0.0
76
105
  val longitude = if (it.hasKey("longitude")) it.getDouble("longitude") else 0.0
@@ -79,63 +108,73 @@ class LuggGoogleMapViewManager :
79
108
  }
80
109
 
81
110
  @ReactProp(name = "initialZoom", defaultDouble = 10.0)
82
- override fun setInitialZoom(view: LuggGoogleMapView, value: Double) {
111
+ override fun setInitialZoom(view: LuggMapView, value: Double) {
83
112
  view.setInitialZoom(value)
84
113
  }
85
114
 
86
115
  @ReactProp(name = "zoomEnabled", defaultBoolean = true)
87
- override fun setZoomEnabled(view: LuggGoogleMapView, value: Boolean) {
116
+ override fun setZoomEnabled(view: LuggMapView, value: Boolean) {
88
117
  view.setZoomEnabled(value)
89
118
  }
90
119
 
91
120
  @ReactProp(name = "scrollEnabled", defaultBoolean = true)
92
- override fun setScrollEnabled(view: LuggGoogleMapView, value: Boolean) {
121
+ override fun setScrollEnabled(view: LuggMapView, value: Boolean) {
93
122
  view.setScrollEnabled(value)
94
123
  }
95
124
 
96
125
  @ReactProp(name = "rotateEnabled", defaultBoolean = true)
97
- override fun setRotateEnabled(view: LuggGoogleMapView, value: Boolean) {
126
+ override fun setRotateEnabled(view: LuggMapView, value: Boolean) {
98
127
  view.setRotateEnabled(value)
99
128
  }
100
129
 
101
130
  @ReactProp(name = "pitchEnabled", defaultBoolean = true)
102
- override fun setPitchEnabled(view: LuggGoogleMapView, value: Boolean) {
131
+ override fun setPitchEnabled(view: LuggMapView, value: Boolean) {
103
132
  view.setPitchEnabled(value)
104
133
  }
105
134
 
106
135
  @ReactProp(name = "userLocationEnabled", defaultBoolean = false)
107
- override fun setUserLocationEnabled(view: LuggGoogleMapView, value: Boolean) {
136
+ override fun setUserLocationEnabled(view: LuggMapView, value: Boolean) {
108
137
  view.setUserLocationEnabled(value)
109
138
  }
110
139
 
140
+ @ReactProp(name = "userLocationButtonEnabled", defaultBoolean = false)
141
+ override fun setUserLocationButtonEnabled(view: LuggMapView, value: Boolean) {
142
+ view.setUserLocationButtonEnabled(value)
143
+ }
144
+
111
145
  @ReactProp(name = "minZoom")
112
- override fun setMinZoom(view: LuggGoogleMapView, value: Double) {
146
+ override fun setMinZoom(view: LuggMapView, value: Double) {
113
147
  view.setMinZoom(value)
114
148
  }
115
149
 
116
150
  @ReactProp(name = "maxZoom")
117
- override fun setMaxZoom(view: LuggGoogleMapView, value: Double) {
151
+ override fun setMaxZoom(view: LuggMapView, value: Double) {
118
152
  view.setMaxZoom(value)
119
153
  }
120
154
 
121
- @ReactProp(name = "padding")
122
- override fun setPadding(view: LuggGoogleMapView, value: ReadableMap?) {
155
+ @ReactProp(name = "theme")
156
+ override fun setTheme(view: LuggMapView, value: String?) {
157
+ view.setTheme(value ?: "system")
158
+ }
159
+
160
+ @ReactProp(name = "edgeInsets")
161
+ override fun setEdgeInsets(view: LuggMapView, value: ReadableMap?) {
123
162
  value?.let {
124
163
  val top = if (it.hasKey("top")) it.getDouble("top").toFloat().dpToPx().toInt() else 0
125
164
  val left = if (it.hasKey("left")) it.getDouble("left").toFloat().dpToPx().toInt() else 0
126
165
  val bottom = if (it.hasKey("bottom")) it.getDouble("bottom").toFloat().dpToPx().toInt() else 0
127
166
  val right = if (it.hasKey("right")) it.getDouble("right").toFloat().dpToPx().toInt() else 0
128
- view.setMapPadding(top, left, bottom, right)
167
+ view.setEdgeInsets(top, left, bottom, right)
129
168
  }
130
169
  }
131
170
 
132
- override fun onDropViewInstance(view: LuggGoogleMapView) {
171
+ override fun onDropViewInstance(view: LuggMapView) {
133
172
  super.onDropViewInstance(view)
134
173
  view.onDropViewInstance()
135
174
  }
136
175
 
137
176
  override fun moveCamera(
138
- view: LuggGoogleMapView,
177
+ view: LuggMapView,
139
178
  latitude: Double,
140
179
  longitude: Double,
141
180
  zoom: Double,
@@ -144,13 +183,30 @@ class LuggGoogleMapViewManager :
144
183
  view.moveCamera(latitude, longitude, zoom, duration.toInt())
145
184
  }
146
185
 
186
+ override fun setEdgeInsets(
187
+ view: LuggMapView,
188
+ top: Double,
189
+ left: Double,
190
+ bottom: Double,
191
+ right: Double,
192
+ duration: Double
193
+ ) {
194
+ view.setEdgeInsets(
195
+ top.toFloat().dpToPx().toInt(),
196
+ left.toFloat().dpToPx().toInt(),
197
+ bottom.toFloat().dpToPx().toInt(),
198
+ right.toFloat().dpToPx().toInt(),
199
+ duration.toInt()
200
+ )
201
+ }
202
+
147
203
  override fun fitCoordinates(
148
- view: LuggGoogleMapView,
204
+ view: LuggMapView,
149
205
  coordinates: ReadableArray?,
150
- paddingTop: Double,
151
- paddingLeft: Double,
152
- paddingBottom: Double,
153
- paddingRight: Double,
206
+ edgeInsetsTop: Double,
207
+ edgeInsetsLeft: Double,
208
+ edgeInsetsBottom: Double,
209
+ edgeInsetsRight: Double,
154
210
  duration: Double
155
211
  ) {
156
212
  val coords = mutableListOf<LatLng>()
@@ -162,10 +218,17 @@ class LuggGoogleMapViewManager :
162
218
  coords.add(LatLng(lat, lng))
163
219
  }
164
220
  }
165
- view.fitCoordinates(coords, paddingTop.toInt(), paddingLeft.toInt(), paddingBottom.toInt(), paddingRight.toInt(), duration.toInt())
221
+ view.fitCoordinates(
222
+ coords,
223
+ edgeInsetsTop.toInt(),
224
+ edgeInsetsLeft.toInt(),
225
+ edgeInsetsBottom.toInt(),
226
+ edgeInsetsRight.toInt(),
227
+ duration.toInt()
228
+ )
166
229
  }
167
230
 
168
231
  companion object {
169
- const val NAME = "LuggGoogleMapView"
232
+ const val NAME = "LuggMapView"
170
233
  }
171
234
  }
@@ -1,12 +1,20 @@
1
1
  package com.luggmaps
2
2
 
3
3
  import android.annotation.SuppressLint
4
+ import android.view.MotionEvent
4
5
  import com.facebook.react.uimanager.ThemedReactContext
5
6
  import com.facebook.react.views.view.ReactViewGroup
6
7
 
7
8
  @SuppressLint("ViewConstructor")
8
9
  class LuggMapWrapperView(context: ThemedReactContext) : ReactViewGroup(context) {
9
10
 
11
+ var touchEventHandler: ((MotionEvent) -> Unit)? = null
12
+
13
+ override fun dispatchTouchEvent(event: MotionEvent): Boolean {
14
+ touchEventHandler?.invoke(event)
15
+ return super.dispatchTouchEvent(event)
16
+ }
17
+
10
18
  override fun requestLayout() {
11
19
  super.requestLayout()
12
20
  getChildAt(0)?.let {
@@ -26,14 +34,14 @@ class LuggMapWrapperView(context: ThemedReactContext) : ReactViewGroup(context)
26
34
  bottom: Int
27
35
  ) {
28
36
  super.onLayout(changed, left, top, right, bottom)
29
- val width = right - left
30
- val height = bottom - top
37
+ val w = right - left
38
+ val h = bottom - top
31
39
  getChildAt(0)?.let {
32
40
  it.measure(
33
- MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
34
- MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
41
+ MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY),
42
+ MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY)
35
43
  )
36
- it.layout(0, 0, width, height)
44
+ it.layout(0, 0, w, h)
37
45
  }
38
46
  }
39
47
  }