Repository navigation
Expand file tree
/
Copy pathCustomCallout.tsx
More file actions
116 lines (103 loc) · 2.82 KB
/
Copy pathCustomCallout.tsx
File metadata and controls
116 lines (103 loc) · 2.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
import React, {FC, useState} from 'react';
import MapLibreGL, {SymbolLayerStyle} from '@maplibre/maplibre-react-native';
import {Feature} from '@turf/helpers/dist/js';
import {View, Text, ViewStyle, StyleProp, TextStyle} from 'react-native';
import exampleIcon from '../../assets/pin.png';
import sheet from '../../styles/sheet';
import Page from '../common/Page';
const defaultCamera = {
centerCoordinate: [12.338, 45.4385],
zoomLevel: 17.4,
};
const featureCollection = {
type: 'FeatureCollection',
features: [
{
type: 'Feature',
id: '9d10456e-bdda-4aa9-9269-04c1667d4552',
properties: {
icon: 'example',
message: 'Hello!',
},
geometry: {
type: 'Point',
coordinates: [12.338, 45.4385],
},
},
],
};
type CustomCalloutViewProps = {
message: string;
};
const CustomCalloutView: FC<CustomCalloutViewProps> = ({message}) => {
return (
<View style={styles.calloutContainerStyle}>
<Text style={styles.customCalloutText}>{message}</Text>
</View>
);
};
type CustomCalloutProps = {
label: string;
onDismissExample: () => any;
};
const CustomCallout: FC<CustomCalloutProps> = props => {
const [selectedFeature, setSelectedFeature] =
useState<Feature<{type: string; coordinates: number[]}, any>>();
const onPinPress = (e: any): void => {
if (selectedFeature) {
setSelectedFeature(undefined);
return;
}
const feature = e?.features[0];
setSelectedFeature(feature);
};
return (
<Page {...props}>
<MapLibreGL.MapView style={sheet.matchParent}>
<MapLibreGL.Camera defaultSettings={defaultCamera} />
<MapLibreGL.ShapeSource
id="mapPinsSource"
shape={featureCollection}
onPress={onPinPress}>
<MapLibreGL.SymbolLayer
id="mapPinsLayer"
style={styles.mapPinLayer}
/>
</MapLibreGL.ShapeSource>
{selectedFeature && (
<MapLibreGL.MarkerView
id="selectedFeatureMarkerView"
coordinate={selectedFeature.geometry.coordinates}>
<CustomCalloutView message={selectedFeature?.properties?.message} />
</MapLibreGL.MarkerView>
)}
</MapLibreGL.MapView>
</Page>
);
};
interface CustomCalloutStyles {
mapPinLayer: StyleProp<SymbolLayerStyle>;
customCalloutText: StyleProp<TextStyle>;
calloutContainerStyle: StyleProp<ViewStyle>;
}
const styles: CustomCalloutStyles = {
mapPinLayer: {
iconAllowOverlap: true,
iconAnchor: 'bottom',
iconSize: 1.0,
iconImage: exampleIcon,
},
customCalloutText: {
color: 'black',
fontSize: 16,
},
calloutContainerStyle: {
backgroundColor: 'white',
width: 60,
height: 40,
display: 'flex',
justifyContent: 'center',
alignItems: 'center',
},
};
export default CustomCallout;