master
gman 2 years ago
parent 8297f17d8b
commit 48541489e7

@ -5,8 +5,9 @@ import Map, {
Layer, Layer,
ScaleControl, ScaleControl,
GeolocateControl, GeolocateControl,
Popup,
} from "react-map-gl/maplibre"; } from "react-map-gl/maplibre";
import 'maplibre-gl/dist/maplibre-gl.css'; import "maplibre-gl/dist/maplibre-gl.css";
import { useState, useEffect, useRef } from "react"; import { useState, useEffect, useRef } from "react";
import Fuse from "fuse.js"; import Fuse from "fuse.js";
@ -27,6 +28,7 @@ export function KartaPage() {
const [search, setSearch] = useState(""); const [search, setSearch] = useState("");
const [selected, setSelected] = useState(-1); const [selected, setSelected] = useState(-1);
const [cursor, setCursor] = useState("grab"); const [cursor, setCursor] = useState("grab");
const [popupInfo, setPopupInfo] = useState(null);
const host = "https://strapi.litmusmap.ru"; const host = "https://strapi.litmusmap.ru";
@ -147,7 +149,7 @@ export function KartaPage() {
<Map <Map
ref={mapRef} ref={mapRef}
initialViewState={{ initialViewState={{
longitude: 30, longitude: 35,
latitude: 60, latitude: 60,
zoom: 4, zoom: 4,
}} }}
@ -165,13 +167,23 @@ export function KartaPage() {
interactiveLayerIds={["points-layer"]} interactiveLayerIds={["points-layer"]}
onClick={(e) => { onClick={(e) => {
// console.log(e.features); // console.log(e.features);
e.features[0] if (e.features[0]) {
? (setSelected(e.features[0].properties.id), setSelected(e.features[0].properties.id);
if (mapRef.current.getZoom() < 14) {
mapRef.current.flyTo({ mapRef.current.flyTo({
center: e.features[0].geometry.coordinates, center: e.features[0].geometry.coordinates,
zoom: mapRef.current.getZoom() + 6, zoom: mapRef.current.getZoom() + 6,
})) });
: setSelected(-1); } else {
setPopupInfo({
longitude: e.features[0].geometry.coordinates[0],
latitude: e.features[0].geometry.coordinates[1],
id: e.features[0].properties.id,
});
}
} else {
setSelected(-1);
}
}} }}
onMouseEnter={() => setCursor("pointer")} onMouseEnter={() => setCursor("pointer")}
onMouseLeave={() => setCursor("grab")} onMouseLeave={() => setCursor("grab")}
@ -183,6 +195,18 @@ export function KartaPage() {
tiles={[`${host}/tiles/{z}/{x}/{y}.pbf`]} tiles={[`${host}/tiles/{z}/{x}/{y}.pbf`]}
maxzoom={10} maxzoom={10}
> >
{popupInfo && (
<Popup
key={popupInfo.id}
longitude={popupInfo.longitude}
latitude={popupInfo.latitude}
anchor="top"
closeButton={false}
onClose={() => setPopupInfo(null)}
>
<a href={`/article/${popupInfo.id}`}>подробнее</a>
</Popup>
)}
<Layer <Layer
id="points-layer" id="points-layer"
type="circle" type="circle"
@ -200,7 +224,7 @@ export function KartaPage() {
"#e66a5a", "#e66a5a",
"#F2994A", "#F2994A",
], ],
"circle-radius": 8, "circle-radius": ["step", ["zoom"], 8, 7, 20, 12, 40, 14, 60],
"circle-opacity": ["step", ["zoom"], 0.8, 7, 0], "circle-opacity": ["step", ["zoom"], 0.8, 7, 0],
}} }}
/> />
@ -215,7 +239,7 @@ export function KartaPage() {
} }
layout={{ layout={{
"icon-image": "pin-marker", "icon-image": "pin-marker",
"icon-size": ['interpolate', ['linear'], ['zoom'], 7, 0.5, 12, 1], "icon-size": ["interpolate", ["linear"], ["zoom"], 7, 0.5, 12, 1],
}} }}
minzoom={7} minzoom={7}
maxzoom={12} maxzoom={12}
@ -241,7 +265,15 @@ export function KartaPage() {
"prishvin-marker", "prishvin-marker",
"pin-marker", "pin-marker",
], ],
"icon-size": ['interpolate', ['linear'], ['zoom'], 12, 0.05, 14, 0.1], "icon-size": [
"interpolate",
["linear"],
["zoom"],
12,
0.05,
14,
0.1,
],
}} }}
minzoom={12} minzoom={12}
/> />
@ -272,6 +304,11 @@ export function KartaPage() {
opacity: "95%", opacity: "95%",
padding: "1rem 0 1rem 1rem", padding: "1rem 0 1rem 1rem",
}} }}
sx={{
"@media (max-width: 40em)": {
display: "none",
},
}}
> >
<Title order={3} mb={10}> <Title order={3} mb={10}>
Музеи Музеи

Loading…
Cancel
Save