UNPKG

google-maps-js-api-react

Version:

Fast, tree-shakable, and light-weight React components and hooks for integrating Google Maps API functionality

1 lines 16.8 kB
{"version":3,"sources":["../../src/GoogleMap/index.tsx"],"names":["getConnectedEventsAndProps_default","handleHas_default","forwardRef","useMemo","render","noop","props","useState","jsx","MapContext_default","PanesContext_default","GoogleMapsLoader","MAPS","useHandlersAndProps_default","handleRef_default","setRef","Suspense"],"mappings":"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","file":"chunk-ZZP22YHO.cjs","sourcesContent":["'use client';\n\nimport {\n type ComponentProps,\n type FC,\n type PropsWithChildren,\n type SuspenseProps,\n type ForwardedRef,\n type ReactElement,\n Suspense,\n forwardRef,\n useMemo,\n useState,\n} from 'react';\nimport type {\n CombineProps,\n GetValue,\n DragEventName,\n MouseHandlers,\n} from '../types';\nimport MapContext from '../utils/MapContext';\nimport useHandlersAndProps from '../utils/useHandlersAndProps';\nimport getConnectedEventsAndProps from '../utils/getConnectedEventsAndProps';\nimport setRef from 'react-helpful-utils/setRef';\nimport { GoogleMapsLoader } from 'google-maps-js-api-loader';\nimport { MAPS } from '../utils/constants';\nimport noop from 'lodash.noop';\nimport PanesContext from '../utils/PanesContext';\nimport handleHas from '../utils/handleHas';\nimport handleRef from '../utils/handleRef';\nimport { jsx } from 'react/jsx-runtime';\n\ntype Props = CombineProps<\n google.maps.Map,\n {\n onBoundsChanged: [bounds: GetValue<google.maps.Map, 'bounds'>];\n onCenterChanged: [center: GetValue<google.maps.Map, 'center'>];\n onDrag: [];\n onDragEnd: [];\n onDragStart: [];\n onHeadingChanged: [heading: GetValue<google.maps.Map, 'heading'>];\n onIdle: [];\n onMapTypeIdChanged: [mapTypeId: GetValue<google.maps.Map, 'mapTypeId'>];\n onProjectionChanged: [projection: GetValue<google.maps.Map, 'projection'>];\n onResize: [];\n onTilesLoaded: [];\n onTiltChanged: [tilt: GetValue<google.maps.Map, 'tilt'>];\n onZoomChanged: [zoom: GetValue<google.maps.Map, 'zoom'>];\n } & Omit<MouseHandlers, DragEventName>,\n {\n center: true;\n /**\n * When `false`, map icons are not clickable. A map icon represents a point of interest, also known as a POI.\n */\n clickableIcons: true;\n /**\n * The heading for aerial imagery in degrees measured clockwise from cardinal direction North. Headings are snapped to the nearest available angle for which imagery is available.\n */\n heading: true;\n /**\n * The initial Map mapTypeId. Defaults to **ROADMAP**.\n */\n mapTypeId: true;\n /**\n * A {@link google.maps.StreetViewPanorama StreetViewPanorama} to display when the Street View pegman is dropped on the map. If no panorama is specified, a default {@link google.maps.StreetViewPanorama StreetViewPanorama} will be displayed in the map's div when the pegman is dropped.\n */\n streetView: true;\n /**\n * The initial Map zoom level. Valid zoom values are numbers from zero up to the supported maximum zoom level. Larger zoom values correspond to a higher resolution.\n */\n zoom: true;\n }\n> &\n Pick<ComponentProps<'div'>, 'className' | 'style' | 'id'> &\n Pick<SuspenseProps, 'fallback'>;\n\nexport type GoogleMapProps = ComponentProps<typeof GoogleMap>;\n\nconst MAX_LAT = (Math.atan(Math.sinh(Math.PI)) * 180) / Math.PI;\n\nconst connectedEventsAndProps = getConnectedEventsAndProps<google.maps.Map>([\n 'center',\n 'heading',\n 'mapTypeId',\n 'tilt',\n 'zoom',\n 'bounds',\n]);\n\nconst isKeyOmitted = handleHas<GoogleMapProps>([\n 'className',\n 'style',\n 'id',\n 'children',\n 'defaultOptions',\n 'fallback',\n]);\n\ntype RenderMap = ((\n props: PropsWithChildren<Props>,\n ref: ForwardedRef<google.maps.Map>\n) => ReactElement) & {\n _isFree?: boolean;\n};\n\nconst mapsStorage = new Map<string, Array<RenderMap>>();\n\nconst GoogleMap = forwardRef<google.maps.Map, PropsWithChildren<Props>>(\n (props, ref) => {\n const { defaultOptions = {} } = props;\n\n const key = `${defaultOptions.backgroundColor || ''},${\n defaultOptions.controlSize || 40\n },${defaultOptions.mapId || ''},${defaultOptions.renderingType || ''}`;\n\n return useMemo(() => {\n if (!mapsStorage.has(key)) {\n mapsStorage.set(key, []);\n }\n\n const components = mapsStorage.get(key)!;\n\n for (let i = 0; i < components.length; i++) {\n const render = components[i];\n\n if (render._isFree) {\n return render;\n }\n }\n\n let map: google.maps.Map | undefined;\n\n let panes: google.maps.MapPanes | undefined;\n\n let mapPromise: Promise<void> | undefined;\n\n let resolveMap: () => void = noop;\n\n let isPanesPending = true;\n\n const Content: FC<PropsWithChildren> = (props) => {\n const forceRerender = useState<{}>()[1];\n\n if (panes) {\n return (\n <MapContext.Provider value={map!}>\n <PanesContext.Provider value={panes}>\n {props.children}\n </PanesContext.Provider>\n </MapContext.Provider>\n );\n }\n\n if (isPanesPending) {\n isPanesPending = false;\n\n const overlayView = new (GoogleMapsLoader.get(MAPS)!.OverlayView)();\n\n overlayView.onRemove = overlayView.draw = noop;\n\n overlayView.onAdd = () => {\n panes = overlayView.getPanes()!;\n\n overlayView.setMap(null);\n\n forceRerender(panes);\n };\n\n overlayView.setMap(map!);\n }\n\n return null;\n };\n\n const SuspendedGoogleMap: FC<PropsWithChildren<Props>> = (props) => {\n if (map) {\n const { children } = props;\n\n useHandlersAndProps<PropsWithChildren<Props>, google.maps.Map>(\n props,\n connectedEventsAndProps,\n isKeyOmitted\n )(map);\n\n return children ? <Content>{children}</Content> : null;\n }\n\n if (GoogleMapsLoader.getStatus(MAPS) == 'error') {\n throw GoogleMapsLoader.getError(MAPS);\n }\n\n if (!mapPromise) {\n mapPromise = new Promise((resolve) => {\n resolveMap = () => {\n resolveMap = noop;\n\n mapPromise = undefined;\n\n resolve();\n };\n });\n }\n\n throw mapPromise;\n };\n\n const divRef = handleRef<HTMLDivElement>((el) => {\n let isAlive = true;\n\n const options = {\n ...props.defaultOptions,\n ...props,\n };\n\n const _ref = ref;\n\n props = ref = undefined!;\n\n if (map) {\n map.setOptions(options);\n\n map.moveCamera({});\n\n el.prepend(map.getDiv());\n\n setRef(_ref, map);\n } else {\n const handleMap = () => {\n if (isAlive) {\n const div = document.createElement('div');\n\n div.style.width = div.style.height = '100%';\n\n map = new (GoogleMapsLoader.get(MAPS)!.Map)(div, options);\n\n resolveMap();\n\n el.prepend(div);\n\n setRef(_ref, map);\n }\n };\n\n if (GoogleMapsLoader.getStatus(MAPS) == 'loaded') {\n handleMap();\n } else {\n GoogleMapsLoader.load(MAPS).then(handleMap, () => {\n resolveMap();\n });\n }\n }\n\n return () => {\n isAlive = false;\n\n render._isFree = true;\n\n resolveMap();\n\n if (map) {\n const { ControlPosition, MapTypeId } = google.maps;\n\n map.setOptions({\n clickableIcons: true,\n disableDefaultUI: false,\n disableDoubleClickZoom: false,\n draggable: true,\n draggableCursor: null,\n draggingCursor: null,\n fullscreenControl: true,\n fullscreenControlOptions: {\n position: ControlPosition.INLINE_END_BLOCK_START,\n },\n gestureHandling: 'auto',\n headingInteractionEnabled: false,\n isFractionalZoomEnabled:\n map.getRenderingType() == google.maps.RenderingType.VECTOR,\n keyboardShortcuts: true,\n mapTypeControl: true,\n mapTypeControlOptions: {\n mapTypeIds: [\n MapTypeId.ROADMAP,\n MapTypeId.SATELLITE,\n MapTypeId.HYBRID,\n MapTypeId.TERRAIN,\n ],\n position: ControlPosition.BLOCK_START_INLINE_START,\n style: google.maps.MapTypeControlStyle.DEFAULT,\n },\n mapTypeId: MapTypeId.ROADMAP,\n maxZoom: null,\n minZoom: null,\n noClear: false,\n panControl: false,\n panControlOptions: {\n position: ControlPosition.INLINE_END_BLOCK_END,\n },\n restriction: {\n latLngBounds: {\n west: -180,\n east: 180,\n north: MAX_LAT,\n south: -MAX_LAT,\n },\n strictBounds: false,\n },\n rotateControl: false,\n rotateControlOptions: {\n position: ControlPosition.INLINE_END_BLOCK_END,\n },\n scaleControl: false,\n scaleControlOptions: {\n style: google.maps.ScaleControlStyle.DEFAULT,\n },\n scrollwheel: true,\n streetView: null,\n streetViewControl: true,\n styles: null,\n tiltInteractionEnabled: false,\n zoomControl: true,\n zoomControlOptions: {\n position: ControlPosition.INLINE_END_BLOCK_END,\n },\n });\n\n map.moveCamera({ tilt: 0, heading: 0 });\n\n setRef(_ref, null);\n }\n };\n });\n\n const render: RenderMap = (_props, _ref) => {\n if (render._isFree) {\n props = _props;\n\n ref = _ref;\n\n render._isFree = false;\n }\n\n return (\n <div\n ref={divRef}\n className={_props.className}\n style={_props.style}\n id={_props.id}\n >\n <Suspense fallback={_props.fallback || null}>\n {jsx(SuspendedGoogleMap, _props)}\n </Suspense>\n </div>\n );\n };\n\n components.push(render);\n\n return render;\n }, [key])(props, ref);\n }\n);\n\nexport default GoogleMap;\n"]}