@lugg/maps 0.2.0-alpha.9 → 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.
- package/README.md +20 -19
- package/android/src/main/java/com/luggmaps/LuggMapView.kt +290 -0
- package/android/src/main/java/com/luggmaps/{LuggGoogleMapViewManager.kt → LuggMapViewManager.kt} +99 -36
- package/android/src/main/java/com/luggmaps/LuggMapWrapperView.kt +13 -5
- package/android/src/main/java/com/luggmaps/LuggMarkerView.kt +157 -13
- package/android/src/main/java/com/luggmaps/LuggMarkerViewManager.kt +28 -0
- package/android/src/main/java/com/luggmaps/LuggPackage.kt +1 -4
- package/android/src/main/java/com/luggmaps/LuggPolygonView.kt +85 -0
- package/android/src/main/java/com/luggmaps/LuggPolygonViewManager.kt +100 -0
- package/android/src/main/java/com/luggmaps/LuggPolylineView.kt +16 -0
- package/android/src/main/java/com/luggmaps/LuggPolylineViewManager.kt +22 -0
- package/android/src/main/java/com/luggmaps/core/GoogleMapProvider.kt +698 -0
- package/android/src/main/java/com/luggmaps/core/MapProviderDelegate.kt +60 -0
- package/android/src/main/java/com/luggmaps/core/PolylineAnimator.kt +89 -24
- package/android/src/main/java/com/luggmaps/events/LongPressEvent.kt +29 -0
- package/android/src/main/java/com/luggmaps/events/MarkerDragEvent.kt +41 -0
- package/android/src/main/java/com/luggmaps/events/MarkerPressEvent.kt +34 -0
- package/android/src/main/java/com/luggmaps/events/PolygonPressEvent.kt +12 -0
- package/android/src/main/java/com/luggmaps/events/PressEvent.kt +29 -0
- package/ios/LuggMapView.h +9 -0
- package/ios/LuggMapView.mm +343 -0
- package/ios/LuggMarkerView.h +13 -0
- package/ios/LuggMarkerView.mm +119 -0
- package/ios/LuggPolygonView.h +31 -0
- package/ios/LuggPolygonView.mm +151 -0
- package/ios/LuggPolylineView.h +4 -0
- package/ios/LuggPolylineView.mm +23 -0
- package/ios/core/AppleMapProvider.h +15 -0
- package/ios/core/AppleMapProvider.mm +1029 -0
- package/ios/core/GMSPolylineAnimator.h +3 -0
- package/ios/core/GMSPolylineAnimator.m +101 -15
- package/ios/core/GoogleMapProvider.h +13 -0
- package/ios/core/GoogleMapProvider.mm +689 -0
- package/ios/core/MKPolylineAnimator.h +4 -0
- package/ios/core/MKPolylineAnimator.m +167 -42
- package/ios/core/MapProviderDelegate.h +84 -0
- package/ios/core/PolylineAnimatorBase.h +24 -1
- package/ios/core/PolylineAnimatorBase.m +82 -19
- package/ios/events/LongPressEvent.h +29 -0
- package/ios/events/MarkerDragEvent.h +69 -0
- package/ios/events/MarkerPressEvent.h +29 -0
- package/ios/events/PolygonPressEvent.h +20 -0
- package/ios/events/PressEvent.h +29 -0
- package/ios/extensions/MKMapView+Zoom.h +2 -0
- package/ios/extensions/MKMapView+Zoom.m +14 -4
- package/lib/module/MapProvider.js +2 -4
- package/lib/module/MapProvider.js.map +1 -1
- package/lib/module/MapProvider.web.js +12 -7
- package/lib/module/MapProvider.web.js.map +1 -1
- package/lib/module/MapView.js +33 -16
- package/lib/module/MapView.js.map +1 -1
- package/lib/module/MapView.web.js +283 -181
- package/lib/module/MapView.web.js.map +1 -1
- package/lib/module/components/GeoJson.js +159 -0
- package/lib/module/components/GeoJson.js.map +1 -0
- package/lib/module/components/GeoJson.types.js +4 -0
- package/lib/module/components/GeoJson.types.js.map +1 -0
- package/lib/module/components/Marker.js +28 -4
- package/lib/module/components/Marker.js.map +1 -1
- package/lib/module/components/Marker.types.js +4 -0
- package/lib/module/components/Marker.types.js.map +1 -0
- package/lib/module/components/Marker.web.js +98 -27
- package/lib/module/components/Marker.web.js.map +1 -1
- package/lib/module/components/Polygon.js +46 -0
- package/lib/module/components/Polygon.js.map +1 -0
- package/lib/module/components/Polygon.types.js +4 -0
- package/lib/module/components/Polygon.types.js.map +1 -0
- package/lib/module/components/Polygon.web.js +87 -0
- package/lib/module/components/Polygon.web.js.map +1 -0
- package/lib/module/components/Polyline.js +17 -4
- package/lib/module/components/Polyline.js.map +1 -1
- package/lib/module/components/Polyline.types.js +4 -0
- package/lib/module/components/Polyline.types.js.map +1 -0
- package/lib/module/components/Polyline.web.js +108 -31
- package/lib/module/components/Polyline.web.js.map +1 -1
- package/lib/module/components/index.js +4 -2
- package/lib/module/components/index.js.map +1 -1
- package/lib/module/components/index.web.js +2 -0
- package/lib/module/components/index.web.js.map +1 -1
- package/lib/module/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
- package/lib/module/fabric/LuggMarkerViewNativeComponent.ts +49 -1
- package/lib/module/fabric/LuggPolygonViewNativeComponent.ts +25 -0
- package/lib/module/fabric/LuggPolylineViewNativeComponent.ts +8 -0
- package/lib/module/index.js +4 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js +4 -1
- package/lib/module/index.web.js.map +1 -1
- package/lib/typescript/src/MapProvider.d.ts +1 -1
- package/lib/typescript/src/MapProvider.d.ts.map +1 -1
- package/lib/typescript/src/MapProvider.web.d.ts +17 -1
- package/lib/typescript/src/MapProvider.web.d.ts.map +1 -1
- package/lib/typescript/src/MapView.d.ts +4 -4
- package/lib/typescript/src/MapView.d.ts.map +1 -1
- package/lib/typescript/src/MapView.types.d.ts +35 -9
- package/lib/typescript/src/MapView.types.d.ts.map +1 -1
- package/lib/typescript/src/MapView.web.d.ts +2 -11
- package/lib/typescript/src/MapView.web.d.ts.map +1 -1
- package/lib/typescript/src/components/GeoJson.d.ts +4 -0
- package/lib/typescript/src/components/GeoJson.d.ts.map +1 -0
- package/lib/typescript/src/components/GeoJson.types.d.ts +79 -0
- package/lib/typescript/src/components/GeoJson.types.d.ts.map +1 -0
- package/lib/typescript/src/components/Marker.d.ts +6 -33
- package/lib/typescript/src/components/Marker.d.ts.map +1 -1
- package/lib/typescript/src/components/Marker.types.d.ts +74 -0
- package/lib/typescript/src/components/Marker.types.d.ts.map +1 -0
- package/lib/typescript/src/components/Marker.web.d.ts +2 -5
- package/lib/typescript/src/components/Marker.web.d.ts.map +1 -1
- package/lib/typescript/src/components/Polygon.d.ts +10 -0
- package/lib/typescript/src/components/Polygon.d.ts.map +1 -0
- package/lib/typescript/src/components/Polygon.types.d.ts +33 -0
- package/lib/typescript/src/components/Polygon.types.d.ts.map +1 -0
- package/lib/typescript/src/components/Polygon.web.d.ts +3 -0
- package/lib/typescript/src/components/Polygon.web.d.ts.map +1 -0
- package/lib/typescript/src/components/Polyline.d.ts +6 -21
- package/lib/typescript/src/components/Polyline.d.ts.map +1 -1
- package/lib/typescript/src/components/Polyline.types.d.ts +53 -0
- package/lib/typescript/src/components/Polyline.types.d.ts.map +1 -0
- package/lib/typescript/src/components/Polyline.web.d.ts +2 -5
- package/lib/typescript/src/components/Polyline.web.d.ts.map +1 -1
- package/lib/typescript/src/components/index.d.ts +8 -2
- package/lib/typescript/src/components/index.d.ts.map +1 -1
- package/lib/typescript/src/components/index.web.d.ts +6 -2
- package/lib/typescript/src/components/index.web.d.ts.map +1 -1
- package/lib/typescript/src/fabric/{LuggGoogleMapViewNativeComponent.d.ts → LuggMapViewNativeComponent.d.ts} +30 -4
- package/lib/typescript/src/fabric/LuggMapViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts +45 -1
- package/lib/typescript/src/fabric/LuggMarkerViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts +18 -0
- package/lib/typescript/src/fabric/LuggPolygonViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts +7 -0
- package/lib/typescript/src/fabric/LuggPolylineViewNativeComponent.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +11 -3
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/index.web.d.ts +9 -1
- package/lib/typescript/src/index.web.d.ts.map +1 -1
- package/lib/typescript/src/types.d.ts +11 -0
- package/lib/typescript/src/types.d.ts.map +1 -1
- package/package.json +10 -9
- package/src/MapProvider.tsx +1 -3
- package/src/MapProvider.web.tsx +12 -3
- package/src/MapView.tsx +32 -26
- package/src/MapView.types.ts +43 -9
- package/src/MapView.web.tsx +345 -211
- package/src/components/GeoJson.tsx +221 -0
- package/src/components/GeoJson.types.ts +107 -0
- package/src/components/Marker.tsx +45 -36
- package/src/components/Marker.types.ts +75 -0
- package/src/components/Marker.web.tsx +116 -28
- package/src/components/Polygon.tsx +52 -0
- package/src/components/Polygon.types.ts +33 -0
- package/src/components/Polygon.web.tsx +104 -0
- package/src/components/Polyline.tsx +23 -22
- package/src/components/Polyline.types.ts +55 -0
- package/src/components/Polyline.web.tsx +151 -37
- package/src/components/index.ts +16 -2
- package/src/components/index.web.ts +6 -2
- package/src/fabric/{LuggGoogleMapViewNativeComponent.ts → LuggMapViewNativeComponent.ts} +43 -7
- package/src/fabric/LuggMarkerViewNativeComponent.ts +49 -1
- package/src/fabric/LuggPolygonViewNativeComponent.ts +25 -0
- package/src/fabric/LuggPolylineViewNativeComponent.ts +8 -0
- package/src/index.ts +28 -1
- package/src/index.web.ts +15 -1
- package/src/types.ts +13 -0
- package/android/src/main/java/com/luggmaps/LuggGoogleMapView.kt +0 -511
- package/ios/LuggAppleMapView.h +0 -16
- package/ios/LuggAppleMapView.mm +0 -592
- package/ios/LuggGoogleMapView.h +0 -13
- package/ios/LuggGoogleMapView.mm +0 -455
- package/lib/module/fabric/LuggAppleMapViewNativeComponent.ts +0 -83
- package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts +0 -54
- package/lib/typescript/src/fabric/LuggAppleMapViewNativeComponent.d.ts.map +0 -1
- package/lib/typescript/src/fabric/LuggGoogleMapViewNativeComponent.d.ts.map +0 -1
- 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
|
-
|
|
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
|
+
}
|
package/android/src/main/java/com/luggmaps/{LuggGoogleMapViewManager.kt → LuggMapViewManager.kt}
RENAMED
|
@@ -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.
|
|
12
|
-
import com.facebook.react.viewmanagers.
|
|
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 =
|
|
20
|
-
class
|
|
21
|
-
ViewGroupManager<
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
private val delegate: ViewManagerDelegate<
|
|
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<
|
|
28
|
+
override fun getDelegate(): ViewManagerDelegate<LuggMapView> = delegate
|
|
27
29
|
|
|
28
30
|
override fun getName(): String = NAME
|
|
29
31
|
|
|
30
|
-
override fun createViewInstance(context: ThemedReactContext):
|
|
31
|
-
val view =
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
151
|
+
override fun setMaxZoom(view: LuggMapView, value: Double) {
|
|
118
152
|
view.setMaxZoom(value)
|
|
119
153
|
}
|
|
120
154
|
|
|
121
|
-
@ReactProp(name = "
|
|
122
|
-
override fun
|
|
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.
|
|
167
|
+
view.setEdgeInsets(top, left, bottom, right)
|
|
129
168
|
}
|
|
130
169
|
}
|
|
131
170
|
|
|
132
|
-
override fun onDropViewInstance(view:
|
|
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:
|
|
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:
|
|
204
|
+
view: LuggMapView,
|
|
149
205
|
coordinates: ReadableArray?,
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
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(
|
|
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 = "
|
|
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
|
|
30
|
-
val
|
|
37
|
+
val w = right - left
|
|
38
|
+
val h = bottom - top
|
|
31
39
|
getChildAt(0)?.let {
|
|
32
40
|
it.measure(
|
|
33
|
-
MeasureSpec.makeMeasureSpec(
|
|
34
|
-
MeasureSpec.makeMeasureSpec(
|
|
41
|
+
MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY),
|
|
42
|
+
MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY)
|
|
35
43
|
)
|
|
36
|
-
it.layout(0, 0,
|
|
44
|
+
it.layout(0, 0, w, h)
|
|
37
45
|
}
|
|
38
46
|
}
|
|
39
47
|
}
|