Advertisement
ahmadandika

map.js

Mar 25th, 2021
556
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { useMap } from 'react-leaflet';
  2. import L from 'leaflet';
  3. import { get, find } from 'lodash';
  4. import React, { useRef, useState } from 'react';
  5.  
  6. import {
  7.   streamingAPI,
  8.   readCardata,
  9.   dataMarker,
  10.   getFleetInfo,
  11.   templatePopup,
  12. } from '../../../../services/map.service';
  13. import { Api } from '../../../../services/config/request';
  14.  
  15. const API_URL = process.env.REACT_APP_API_ENDPOINT;
  16.  
  17. const defaultMarkColor = '#888888';
  18.  
  19. export const Map = (props) => {
  20.   const map = useMap();
  21.   const sse = useRef(null);
  22.   const [markers, setMarker] = useState({});
  23.   const [markerInfo, setMarkerInfo] = useState(null);
  24.   const [markerDetail, setMarkerDetail] = useState(null);
  25.  
  26.   const markerOnClick = async (data) => {
  27.     const result = await getFleetInfo(data.deviceID, data.orderID);
  28.     await setMarkerDetail(data);
  29.     await setMarkerInfo(() => result);
  30.   };
  31.  
  32.   React.useEffect(() => {
  33.     if (markerInfo !== null) {
  34.       markers[markerDetail.vehicleNo]
  35.         .bindPopup(templatePopup(markerInfo, markerDetail), {
  36.           autoPanPadding: [100, 220],
  37.         })
  38.         .openPopup();
  39.     }
  40.   }, [markerInfo]);
  41.  
  42.   const setMarkers = (data) => {
  43.     data.forEach((obj) => {
  44.       if (!Object.prototype.hasOwnProperty.call(markers, obj.vehicleNo)) {
  45.         markers[obj.vehicleNo] = L.circleMarker([obj.lat, obj.long], {
  46.           radius: 4,
  47.           fillColor: get(
  48.             find(dataMarker, (o) => o.key === obj.status),
  49.             'primaryColor',
  50.             defaultMarkColor,
  51.           ),
  52.           color: get(
  53.             find(dataMarker, (o) => o.key === obj.status),
  54.             'secondaryColor',
  55.             defaultMarkColor,
  56.           ),
  57.           weight: 2,
  58.           opacity: 1,
  59.           fillOpacity: 0.8,
  60.         })
  61.           .on('click', () => {
  62.             markerOnClick(obj);
  63.           })
  64.           .addTo(map);
  65.         markers[obj.vehicleNo].previousLatLngs = [];
  66.         markers[obj.vehicleNo].data = obj;
  67.       } else {
  68.         markers[obj.vehicleNo].previousLatLngs.push(markers[obj.vehicleNo].getLatLng());
  69.         markers[obj.vehicleNo].data = obj;
  70.         markers[obj.vehicleNo].setLatLng([obj.lat, obj.long]);
  71.       }
  72.     });
  73.  
  74.     setMarker(markers);
  75.     props.parentCallback(markers);
  76.   };
  77.  
  78.   const loadData = async () => {
  79.     sse.current = await streamingAPI('/fleettrack/pushrealevents/');
  80.  
  81.     let trackTime = 0;
  82.  
  83.     sse.current.onmessage = async (e) => {
  84.       if (e.data.includes('/realtime/') || e.data.includes('/resource/')) {
  85.         trackTime += 1;
  86.         const urlString = API_URL + e.data;
  87.         const url = new URL(urlString);
  88.         const seq = url.searchParams.get('seq');
  89.         const urlParam = e.data.replace(`&seq=${seq}`, `&seq=${trackTime}`);
  90.  
  91.         const arraybuffer = await Api.getStreamRequest(urlParam);
  92.  
  93.         if (arraybuffer) {
  94.           const perfstat = performance.now();
  95.           const result = readCardata(arraybuffer);
  96.  
  97.           const resultMarkers = get(result, 'markers', []) || [];
  98.  
  99.           setMarkers(resultMarkers);
  100.           console.log('%d items processed in %d (ms) ', result?.cnt, performance.now() - perfstat);
  101.         } else {
  102.           sse.current.close();
  103.         }
  104.       }
  105.     };
  106.   };
  107.  
  108.   React.useEffect(() => {
  109.     loadData();
  110.     return () => {
  111.       if (sse.current) {
  112.         sse.current.close();
  113.       }
  114.     };
  115.   }, []);
  116.  
  117.   return null;
  118. };
  119.  
  120. Map.propTypes = {};
  121.  
  122. Map.defaultProps = {};
  123.  
  124. export default Map;
  125.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement