/** * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved. * SPDX-License-Identifier: MIT-0 */ /* eslint-disable @typescript-eslint/no-var-requires */ import React, { useEffect, useState } from 'react' import ReactMapGL, { NavigationControl, Source, Layer } from 'react-map-gl' import * as polyline from '@mapbox/polyline' import Container from 'aws-northstar/layouts/Container' import Inline from 'aws-northstar/layouts/Inline' import Icon from 'aws-northstar/components/Icon' // to fix: https://github.com/visgl/react-map-gl/issues/1266 import mapboxgl from 'mapbox-gl' import MapPin from '../MapPin' import { appvars } from '../../config' // @ts-ignore // eslint-disable-next-line import/no-webpack-loader-syntax mapboxgl.workerClass = require('worker-loader!mapbox-gl/dist/mapbox-gl-csp-worker').default const navControlStyle = { left: 10, top: 10, } export type NextDayDeliveryMapInputProps = { segments?: any[] route?: any[] } const getColor = (idx: number) => { if (idx % 2) { return '#03AA46' } return '#AA0303' } const MAX_DRIVERS = 100 const { MAPBOX_VARS } = appvars const NextDayDeliveryMapComponent: React.FC = ({ segments, route }) => { const [warehouses, setWarehouses] = useState([]) const [customers, setCustomers] = useState([]) const [geoJSON, setGeoJSON] = useState([]) const [segmentsState, setSegmentsState] = useState([]) const [routeState, setRouteState] = useState() const baseLocation = { latitude: MAPBOX_VARS.DEFAULT_LATITUDE, longitude: MAPBOX_VARS.DEFAULT_LONGITUDE, zoom: 12, } const [viewport, setViewport] = useState({ width: '100%', height: 800, ...baseLocation, }) const resetDefault = () => { setViewport((old) => ({ ...old, ...baseLocation, })) } useEffect(() => { setSegmentsState(segments) setRouteState(route) }, [segments, route]) // Warehouse useEffect(() => { if (!segmentsState || segmentsState.length === 0) { return } setWarehouses([ { latitude: segmentsState[0].from.lat, longitude: segmentsState[0].from.long, }, ]) }, [segmentsState]) // Customers useEffect(() => { if (!segmentsState || segmentsState.length === 0) { return } const customerLocations = segmentsState.map((r: any) => { return { deliveryCode: r.deliveryCode, deliveryName: r.deliveryName, deliveryTimeGroup: r.deliveryTimeGroup, demands: r.demands, latitude: r.to.lat, longitude: r.to.long, } }) setCustomers(customerLocations) }, [segmentsState]) // Routes useEffect(() => { if (!routeState) { return } const routeGeoJson = { type: 'Feature', geometry: polyline.toGeoJSON(routeState.pointsEncoded), } setGeoJSON([routeGeoJson]) }, [routeState]) return ( {viewport.latitude} {viewport.longitude} {parseInt(viewport.zoom.toString(), 10)} } > setViewport(v)} > {warehouses && warehouses.map((r: any, idx: number) => ( ))} {customers && customers.map((r: any, idx: number) => ( ))} {geoJSON && geoJSON.map((g: any, idx: number) => ( ))} ) } export default NextDayDeliveryMapComponent