asb_cloud_front/src/pages/Deposit.jsx

71 lines
2.1 KiB
React
Raw Normal View History

2021-07-20 14:10:01 +05:00
import { Map, Overlay } from "pigeon-maps"
import pointer from '../images/pointer.svg'
import {Link} from "react-router-dom";
import LoaderPortal from '../components/LoaderPortal'
import { useState, useEffect } from "react";
import {ClusterService} from '../services/api'
2021-09-15 12:03:03 +05:00
import { invokeWebApiWrapperAsync } from "../components/factory"
2021-07-20 14:10:01 +05:00
const calcViewParams = (clusters) => {
2021-07-27 10:20:53 +05:00
if ((!clusters) || clusters.length === 0)
2021-07-20 14:10:01 +05:00
return {center:[60.81226, 70.0562], zoom: 5}
const center = clusters.reduce((sum, cluster) => {
sum[0] += (cluster.latitude / clusters.length)
sum[1] += (cluster.longitude / clusters.length)
return sum
}, [0, 0])
const maxDeg = clusters.reduce((max, cluster) => {
const dLatitude = Math.abs(center[0] - cluster.latitude)
const dLongitude = Math.abs(center[1] - cluster.longitude)
const d = dLatitude > dLongitude ? dLatitude : dLongitude
return d > max ? d : max
}, 0)
2021-09-15 12:03:03 +05:00
// zoom max = 20 (too close)
// zoom min = 1 (mega far)
// 4 - full Russia (161.6 deg)
// 13.5 - Khanty-Mansiysk
let zoom = 5 + 5/maxDeg
zoom = zoom < 5 ? 5: zoom
zoom = zoom > 15 ? 15: zoom
return {center, zoom}
2021-07-20 14:10:01 +05:00
}
export default function Deposit() {
const [clustersData, setClustersData] = useState([])
const [showLoader, setShowLoader] = useState(false)
2021-09-15 12:03:03 +05:00
useEffect(()=>invokeWebApiWrapperAsync(async()=>{
const data = await ClusterService.getClusters()
setClustersData(data)
},
setShowLoader,
`Не удалось загрузить список кустов`),
[])
2021-07-20 14:10:01 +05:00
const viewParams = calcViewParams(clustersData)
const markers = clustersData.map(cluster =>
<Overlay
width={32}
anchor={[cluster.latitude, cluster.longitude]}
key={`${cluster.latitude} ${cluster.longitude}`}>
<Link to={`/cluster/${cluster.id}/all`}>
<img width={40} src={pointer} alt="+"/>
<span>{cluster.caption}</span>
</Link>
</Overlay >)
2021-07-20 14:10:01 +05:00
return (
<LoaderPortal show={showLoader}>
2021-09-02 16:33:02 +05:00
<div className={'h-100vh'}>
2021-09-15 12:03:03 +05:00
<Map {...viewParams}>
2021-09-02 16:33:02 +05:00
{markers}
</Map>
</div>
2021-07-20 14:10:01 +05:00
</LoaderPortal>
);
}