@lugg/maps 0.2.0-alpha.7 → 0.2.0-alpha.8
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.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import { Children, Component, isValidElement, useEffect, useRef } from 'react';
|
|
4
4
|
import { View } from 'react-native';
|
|
5
5
|
import { Map, useMap } from '@vis.gl/react-google-maps';
|
|
6
6
|
import { Marker } from "./components/Marker.web.js";
|
|
@@ -30,11 +30,13 @@ function MapController({
|
|
|
30
30
|
onMapReady,
|
|
31
31
|
onCameraMove,
|
|
32
32
|
onCameraIdle,
|
|
33
|
-
onReady
|
|
33
|
+
onReady,
|
|
34
|
+
userLocationEnabled
|
|
34
35
|
}) {
|
|
35
36
|
const map = useMap();
|
|
36
|
-
const readyFired =
|
|
37
|
-
|
|
37
|
+
const readyFired = useRef(false);
|
|
38
|
+
const userLocationMarker = useRef(null);
|
|
39
|
+
useEffect(() => {
|
|
38
40
|
if (!map) return;
|
|
39
41
|
onMapReady(map);
|
|
40
42
|
if (!readyFired.current) {
|
|
@@ -42,7 +44,54 @@ function MapController({
|
|
|
42
44
|
onReady?.();
|
|
43
45
|
}
|
|
44
46
|
}, [map, onMapReady, onReady]);
|
|
45
|
-
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (!map || !userLocationEnabled) {
|
|
49
|
+
if (userLocationMarker.current) {
|
|
50
|
+
userLocationMarker.current.map = null;
|
|
51
|
+
userLocationMarker.current = null;
|
|
52
|
+
}
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
let watchId = null;
|
|
56
|
+
const updateLocation = position => {
|
|
57
|
+
const {
|
|
58
|
+
latitude,
|
|
59
|
+
longitude
|
|
60
|
+
} = position.coords;
|
|
61
|
+
const pos = {
|
|
62
|
+
lat: latitude,
|
|
63
|
+
lng: longitude
|
|
64
|
+
};
|
|
65
|
+
if (!userLocationMarker.current) {
|
|
66
|
+
const dot = document.createElement('div');
|
|
67
|
+
dot.style.width = '16px';
|
|
68
|
+
dot.style.height = '16px';
|
|
69
|
+
dot.style.backgroundColor = '#4285F4';
|
|
70
|
+
dot.style.border = '2px solid white';
|
|
71
|
+
dot.style.borderRadius = '50%';
|
|
72
|
+
dot.style.boxShadow = '0 1px 4px rgba(0,0,0,0.3)';
|
|
73
|
+
userLocationMarker.current = new google.maps.marker.AdvancedMarkerElement({
|
|
74
|
+
map,
|
|
75
|
+
position: pos,
|
|
76
|
+
content: dot
|
|
77
|
+
});
|
|
78
|
+
} else {
|
|
79
|
+
userLocationMarker.current.position = pos;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
navigator.geolocation.getCurrentPosition(updateLocation, () => {});
|
|
83
|
+
watchId = navigator.geolocation.watchPosition(updateLocation, () => {});
|
|
84
|
+
return () => {
|
|
85
|
+
if (watchId !== null) {
|
|
86
|
+
navigator.geolocation.clearWatch(watchId);
|
|
87
|
+
}
|
|
88
|
+
if (userLocationMarker.current) {
|
|
89
|
+
userLocationMarker.current.map = null;
|
|
90
|
+
userLocationMarker.current = null;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
}, [map, userLocationEnabled]);
|
|
94
|
+
useEffect(() => {
|
|
46
95
|
if (!map) return;
|
|
47
96
|
const createPayload = gesture => {
|
|
48
97
|
const center = map.getCenter();
|
|
@@ -77,9 +126,10 @@ function MapController({
|
|
|
77
126
|
}, [map, onCameraMove, onCameraIdle]);
|
|
78
127
|
return null;
|
|
79
128
|
}
|
|
80
|
-
export class MapView extends
|
|
129
|
+
export class MapView extends Component {
|
|
81
130
|
static defaultProps = {
|
|
82
131
|
provider: 'google',
|
|
132
|
+
mapId: 'DEMO_MAP_ID',
|
|
83
133
|
initialZoom: 10,
|
|
84
134
|
zoomEnabled: true,
|
|
85
135
|
scrollEnabled: true,
|
|
@@ -150,6 +200,7 @@ export class MapView extends React.Component {
|
|
|
150
200
|
scrollEnabled,
|
|
151
201
|
pitchEnabled,
|
|
152
202
|
padding,
|
|
203
|
+
userLocationEnabled,
|
|
153
204
|
onCameraMove,
|
|
154
205
|
onCameraIdle,
|
|
155
206
|
onReady,
|
|
@@ -165,8 +216,8 @@ export class MapView extends React.Component {
|
|
|
165
216
|
// Separate map children (Marker, Polyline) from overlay children (regular Views)
|
|
166
217
|
const mapChildren = [];
|
|
167
218
|
const overlayChildren = [];
|
|
168
|
-
|
|
169
|
-
if (! /*#__PURE__*/
|
|
219
|
+
Children.forEach(children, child => {
|
|
220
|
+
if (! /*#__PURE__*/isValidElement(child)) return;
|
|
170
221
|
if (isMapComponent(child)) {
|
|
171
222
|
mapChildren.push(child);
|
|
172
223
|
} else {
|
|
@@ -202,7 +253,8 @@ export class MapView extends React.Component {
|
|
|
202
253
|
onMapReady: this.handleMapReady,
|
|
203
254
|
onCameraMove: onCameraMove,
|
|
204
255
|
onCameraIdle: onCameraIdle,
|
|
205
|
-
onReady: onReady
|
|
256
|
+
onReady: onReady,
|
|
257
|
+
userLocationEnabled: userLocationEnabled
|
|
206
258
|
}), mapChildren]
|
|
207
259
|
})
|
|
208
260
|
}), overlayChildren]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["Children","Component","isValidElement","useEffect","useRef","View","Map","useMap","Marker","Polyline","jsx","_jsx","jsxs","_jsxs","MAP_COMPONENT_TYPES","Set","isMapComponent","child","has","type","createSyntheticEvent","nativeEvent","currentTarget","target","bubbles","cancelable","defaultPrevented","eventPhase","isTrusted","preventDefault","stopPropagation","isDefaultPrevented","isPropagationStopped","persist","timeStamp","Date","now","MapController","onMapReady","onCameraMove","onCameraIdle","onReady","userLocationEnabled","map","readyFired","userLocationMarker","current","watchId","updateLocation","position","latitude","longitude","coords","pos","lat","lng","dot","document","createElement","style","width","height","backgroundColor","border","borderRadius","boxShadow","google","maps","marker","AdvancedMarkerElement","content","navigator","geolocation","getCurrentPosition","watchPosition","clearWatch","createPayload","gesture","center","getCenter","coordinate","zoom","getZoom","isDragging","dragStartListener","addListener","dragEndListener","centerListener","idleListener","event","removeListener","MapView","defaultProps","provider","mapId","initialZoom","zoomEnabled","scrollEnabled","rotateEnabled","pitchEnabled","mapInstance","handleMapReady","moveCamera","options","duration","panTo","setZoom","setCenter","fitCoordinates","coordinates","first","padding","length","props","bounds","LatLngBounds","forEach","coord","extend","fitBounds","top","left","bottom","right","render","initialCoordinate","minZoom","maxZoom","children","gestureHandling","defaultCenter","undefined","mapChildren","overlayChildren","push","mapContainerStyle","mapStyle","defaultZoom","disableDefaultUI","tilt"],"sourceRoot":"../../src","sources":["MapView.web.tsx"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { Component } from 'react';
|
|
2
2
|
import type { MapViewProps, MapViewRef, MoveCameraOptions, FitCoordinatesOptions } from './MapView.types';
|
|
3
3
|
import type { Coordinate } from './types';
|
|
4
|
-
export declare class MapView extends
|
|
4
|
+
export declare class MapView extends Component<MapViewProps> implements MapViewRef {
|
|
5
5
|
static defaultProps: Partial<MapViewProps>;
|
|
6
6
|
private mapInstance;
|
|
7
7
|
private handleMapReady;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapView.web.d.ts","sourceRoot":"","sources":["../../../src/MapView.web.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"MapView.web.d.ts","sourceRoot":"","sources":["../../../src/MapView.web.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAOV,MAAM,OAAO,CAAC;AAOf,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,qBAAqB,EAEtB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAsJ1C,qBAAa,OAAQ,SAAQ,SAAS,CAAC,YAAY,CAAE,YAAW,UAAU;IACxE,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,YAAY,CAAC,CAQxC;IAEF,OAAO,CAAC,WAAW,CAAgC;IAEnD,OAAO,CAAC,cAAc,CAEpB;IAEF,UAAU,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB;IAgB7D,cAAc,CAAC,WAAW,EAAE,UAAU,EAAE,EAAE,OAAO,CAAC,EAAE,qBAAqB;IA0BzE,MAAM;CAoFP"}
|
package/package.json
CHANGED
package/src/MapView.web.tsx
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
|
-
import
|
|
1
|
+
import {
|
|
2
|
+
Children,
|
|
3
|
+
Component,
|
|
4
|
+
isValidElement,
|
|
5
|
+
useEffect,
|
|
6
|
+
useRef,
|
|
7
|
+
type CSSProperties,
|
|
8
|
+
type ReactElement,
|
|
9
|
+
type ReactNode,
|
|
10
|
+
} from 'react';
|
|
2
11
|
import type { NativeSyntheticEvent, ViewStyle } from 'react-native';
|
|
3
12
|
import { View } from 'react-native';
|
|
4
13
|
import { Map, useMap } from '@vis.gl/react-google-maps';
|
|
@@ -17,7 +26,7 @@ import type { Coordinate } from './types';
|
|
|
17
26
|
// Map-specific component types that render inside the Google Map
|
|
18
27
|
const MAP_COMPONENT_TYPES = new Set([Marker, Polyline]);
|
|
19
28
|
|
|
20
|
-
const isMapComponent = (child:
|
|
29
|
+
const isMapComponent = (child: ReactElement): boolean =>
|
|
21
30
|
MAP_COMPONENT_TYPES.has(child.type as typeof Marker | typeof Polyline);
|
|
22
31
|
|
|
23
32
|
const createSyntheticEvent = <T,>(nativeEvent: T): NativeSyntheticEvent<T> =>
|
|
@@ -44,6 +53,7 @@ interface MapControllerProps {
|
|
|
44
53
|
onCameraMove?: (event: NativeSyntheticEvent<CameraEventPayload>) => void;
|
|
45
54
|
onCameraIdle?: (event: NativeSyntheticEvent<CameraEventPayload>) => void;
|
|
46
55
|
onReady?: () => void;
|
|
56
|
+
userLocationEnabled?: boolean;
|
|
47
57
|
}
|
|
48
58
|
|
|
49
59
|
function MapController({
|
|
@@ -51,11 +61,14 @@ function MapController({
|
|
|
51
61
|
onCameraMove,
|
|
52
62
|
onCameraIdle,
|
|
53
63
|
onReady,
|
|
64
|
+
userLocationEnabled,
|
|
54
65
|
}: MapControllerProps) {
|
|
55
66
|
const map = useMap();
|
|
56
|
-
const readyFired =
|
|
67
|
+
const readyFired = useRef(false);
|
|
68
|
+
const userLocationMarker =
|
|
69
|
+
useRef<google.maps.marker.AdvancedMarkerElement | null>(null);
|
|
57
70
|
|
|
58
|
-
|
|
71
|
+
useEffect(() => {
|
|
59
72
|
if (!map) return;
|
|
60
73
|
onMapReady(map);
|
|
61
74
|
|
|
@@ -65,7 +78,56 @@ function MapController({
|
|
|
65
78
|
}
|
|
66
79
|
}, [map, onMapReady, onReady]);
|
|
67
80
|
|
|
68
|
-
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
if (!map || !userLocationEnabled) {
|
|
83
|
+
if (userLocationMarker.current) {
|
|
84
|
+
userLocationMarker.current.map = null;
|
|
85
|
+
userLocationMarker.current = null;
|
|
86
|
+
}
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let watchId: number | null = null;
|
|
91
|
+
|
|
92
|
+
const updateLocation = (position: GeolocationPosition) => {
|
|
93
|
+
const { latitude, longitude } = position.coords;
|
|
94
|
+
const pos = { lat: latitude, lng: longitude };
|
|
95
|
+
|
|
96
|
+
if (!userLocationMarker.current) {
|
|
97
|
+
const dot = document.createElement('div');
|
|
98
|
+
dot.style.width = '16px';
|
|
99
|
+
dot.style.height = '16px';
|
|
100
|
+
dot.style.backgroundColor = '#4285F4';
|
|
101
|
+
dot.style.border = '2px solid white';
|
|
102
|
+
dot.style.borderRadius = '50%';
|
|
103
|
+
dot.style.boxShadow = '0 1px 4px rgba(0,0,0,0.3)';
|
|
104
|
+
|
|
105
|
+
userLocationMarker.current =
|
|
106
|
+
new google.maps.marker.AdvancedMarkerElement({
|
|
107
|
+
map,
|
|
108
|
+
position: pos,
|
|
109
|
+
content: dot,
|
|
110
|
+
});
|
|
111
|
+
} else {
|
|
112
|
+
userLocationMarker.current.position = pos;
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
navigator.geolocation.getCurrentPosition(updateLocation, () => {});
|
|
117
|
+
watchId = navigator.geolocation.watchPosition(updateLocation, () => {});
|
|
118
|
+
|
|
119
|
+
return () => {
|
|
120
|
+
if (watchId !== null) {
|
|
121
|
+
navigator.geolocation.clearWatch(watchId);
|
|
122
|
+
}
|
|
123
|
+
if (userLocationMarker.current) {
|
|
124
|
+
userLocationMarker.current.map = null;
|
|
125
|
+
userLocationMarker.current = null;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
}, [map, userLocationEnabled]);
|
|
129
|
+
|
|
130
|
+
useEffect(() => {
|
|
69
131
|
if (!map) return;
|
|
70
132
|
|
|
71
133
|
const createPayload = (gesture: boolean): CameraEventPayload => {
|
|
@@ -109,12 +171,10 @@ function MapController({
|
|
|
109
171
|
return null;
|
|
110
172
|
}
|
|
111
173
|
|
|
112
|
-
export class MapView
|
|
113
|
-
extends React.Component<MapViewProps>
|
|
114
|
-
implements MapViewRef
|
|
115
|
-
{
|
|
174
|
+
export class MapView extends Component<MapViewProps> implements MapViewRef {
|
|
116
175
|
static defaultProps: Partial<MapViewProps> = {
|
|
117
176
|
provider: 'google',
|
|
177
|
+
mapId: 'DEMO_MAP_ID',
|
|
118
178
|
initialZoom: 10,
|
|
119
179
|
zoomEnabled: true,
|
|
120
180
|
scrollEnabled: true,
|
|
@@ -181,6 +241,7 @@ export class MapView
|
|
|
181
241
|
scrollEnabled,
|
|
182
242
|
pitchEnabled,
|
|
183
243
|
padding,
|
|
244
|
+
userLocationEnabled,
|
|
184
245
|
onCameraMove,
|
|
185
246
|
onCameraIdle,
|
|
186
247
|
onReady,
|
|
@@ -200,11 +261,11 @@ export class MapView
|
|
|
200
261
|
: undefined;
|
|
201
262
|
|
|
202
263
|
// Separate map children (Marker, Polyline) from overlay children (regular Views)
|
|
203
|
-
const mapChildren:
|
|
204
|
-
const overlayChildren:
|
|
264
|
+
const mapChildren: ReactNode[] = [];
|
|
265
|
+
const overlayChildren: ReactNode[] = [];
|
|
205
266
|
|
|
206
|
-
|
|
207
|
-
if (!
|
|
267
|
+
Children.forEach(children, (child) => {
|
|
268
|
+
if (!isValidElement(child)) return;
|
|
208
269
|
if (isMapComponent(child)) {
|
|
209
270
|
mapChildren.push(child);
|
|
210
271
|
} else {
|
|
@@ -220,7 +281,7 @@ export class MapView
|
|
|
220
281
|
bottom: padding?.bottom ?? 0,
|
|
221
282
|
};
|
|
222
283
|
|
|
223
|
-
const mapStyle:
|
|
284
|
+
const mapStyle: CSSProperties = {
|
|
224
285
|
width: '100%',
|
|
225
286
|
height: '100%',
|
|
226
287
|
};
|
|
@@ -244,6 +305,7 @@ export class MapView
|
|
|
244
305
|
onCameraMove={onCameraMove}
|
|
245
306
|
onCameraIdle={onCameraIdle}
|
|
246
307
|
onReady={onReady}
|
|
308
|
+
userLocationEnabled={userLocationEnabled}
|
|
247
309
|
/>
|
|
248
310
|
{mapChildren}
|
|
249
311
|
</Map>
|