import React from "react"; import { withScriptjs, withGoogleMap, GoogleMap, Marker, } from "react-google-maps"; import SearchBox from "react-google-maps/lib/components/places/SearchBox"; import { MarkerProps } from "widgets/MapWidget"; import PickMyLocation from "./PickMyLocation"; import styled from "styled-components"; interface MapComponentProps { apiKey: string; widgetId: string; isDisabled?: boolean; isVisible?: boolean; enableSearch: boolean; zoomLevel: number; enablePickLocation: boolean; allowZoom: boolean; center: { lat: number; long: number; }; markers?: Array; selectedMarker?: { lat: number; long: number; title?: string; }; enableCreateMarker: boolean; updateCenter: (lat: number, long: number) => void; updateMarker: (lat: number, long: number, index: number) => void; saveMarker: (lat: number, long: number) => void; selectMarker: (lat: number, long: number, title: string) => void; disableDrag: (e: any) => void; } const MapWrapper = styled.div` position: relative; width: 100%; height: 100%; `; const MapContainerWrapper = styled.div` width: 100%; height: 100%; `; const StyledInput = styled.input` box-sizing: border-box; border: 1px solid transparent; width: 240px; height: 32px; margin-top: 27px; padding: 0 12px; border-radius: 3px; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); font-size: 14px; outline: none; text-overflow: ellipses; `; type PickMyLocationProps = { allowZoom: boolean; }; const PickMyLocationWrapper = styled.div` position: absolute; bottom: ${props => (props.allowZoom ? 110 : 20)}px; right: -90px; width: 140px; `; const MyMapComponent = withScriptjs( withGoogleMap((props: any) => ( { if (props.enableCreateMarker) { props.saveMarker(e.latLng.lat(), e.latLng.lng()); } }} > {props.enableSearch && ( )} {props.markers.map((marker: any, index: number) => ( { props.selectMarker(marker.lat, marker.long, marker.title); }} onDragEnd={de => { props.updateMarker(de.latLng.lat(), de.latLng.lng(), index); }} /> ))} {props.enablePickLocation && ( )} )), ); class MapComponent extends React.Component { private searchBox = React.createRef(); onSearchBoxMounted = (ref: any) => { this.searchBox = ref; }; onPlacesChanged = () => { const node: any = this.searchBox; if (node) { const places: any = node.getPlaces(); if ( places && places.length && places[0].geometry && places[0].geometry.location ) { const location = places[0].geometry.location; const lat = location.lat(); const long = location.lng(); this.props.updateCenter(lat, long); } } }; render() { const zoom = Math.floor(this.props.zoomLevel / 5); return ( } containerElement={} mapElement={} {...this.props} zoom={zoom} onPlacesChanged={this.onPlacesChanged} onSearchBoxMounted={this.onSearchBoxMounted} /> ); } } export default MapComponent;