import React, { useContext, useEffect, useState } from 'react'; import { apiClient } from '../../services/api'; import { MapContainer, GeoJSON, useMapEvents, TileLayer, Tooltip, Marker } from 'react-leaflet'; import { useTheme, LinearProgress } from '@mui/material'; import { UseAppStoreType, AppContext } from '../../contexts/AppContext'; import { GeoJsonObject } from 'geojson'; import { Icon, LeafletMouseEvent, Point } from 'leaflet'; import { PublicOrder } from '../../models'; import OrderTooltip from '../Charts/helpers/OrderTooltip'; import getWorldmapGeojson from '../../geo/Web'; interface Props { orderType?: number; useTiles: boolean; position?: [number, number] | undefined; setPosition?: (position: [number, number]) => void; orders?: PublicOrder[]; onOrderClicked?: (id: number) => void; zoom?: number; center?: [number, number]; interactive?: boolean; } const Map = ({ orderType, position, zoom, orders = [], setPosition = () => {}, useTiles = false, onOrderClicked = () => null, center = [0, 0], interactive = false, }: Props): JSX.Element => { const theme = useTheme(); const { baseUrl } = useContext(AppContext); const [worldmap, setWorldmap] = useState(); useEffect(() => { if (!worldmap) { getWorldmapGeojson(apiClient, baseUrl).then(setWorldmap); } }, []); const RobotMarker = ( key: string | number, position: [number, number], orderType: number, order?: PublicOrder, ) => { const color = orderType == 1 ? 'Blue' : 'Lilac'; const path = window.NativeRobosats === undefined ? '/static/assets' : 'file:///android_asset/Web.bundle/assets'; return ( order?.id && onOrderClicked(order.id), }} > {order && ( )} ); }; const LocationMarker = () => { useMapEvents({ click(event: LeafletMouseEvent) { if (interactive) { setPosition([event.latlng.lat, event.latlng.lng]); } }, }); return position ? RobotMarker('marker', position, orderType || 0) : <>; }; const getOrderMarkers = () => { return orders.map((order) => { if (!order.latitude || !order.longitude) return <>; return RobotMarker(order.id, [order.latitude, order.longitude], order.type || 0, order); }); }; return ( {!useTiles && !worldmap && } {!useTiles && worldmap && ( )} {useTiles && ( )} {getOrderMarkers()} ); }; export default Map;