import { ReactNode, Ref, useState } from 'react'; import { createPortal } from 'react-dom'; import { MapContainer, MapContainerProps, TileLayer, TileLayerProps } from 'react-leaflet'; import { FormControl, FormControlProps, FormHelperText, FormHelperTextProps, FormLabel, FormLabelProps } from '@mui/material'; import clsx from 'clsx'; import { LatLngLiteral, Map } from 'leaflet'; import { isFunction } from 'lodash'; import useDefaultProps from '../../../hooks/useDefaultProps'; import Controls, { IControlsProps } from '../shared/Controls'; import MapWrapper, { MapWrapperProps } from '../shared/MapWrapper'; import StaticMarker, { StaticMarkerProps } from '../shared/StaticMarker'; import ChangeOnMoveHandler from './ChangeOnMoveHandler'; import FloatingMarker from './FloatingMarker'; export type LocationPickerProps = { name?: string; required?: boolean; error?: boolean; label?: ReactNode; disabled?: boolean; helperText?: React.ReactNode; value?: LatLngLiteral; onChange?: (value: LatLngLiteral) => void; ref?: Ref; inputRef?: Ref; slotProps?: { formControl?: Omit; formLabel?: Omit; helperText?: FormHelperTextProps; mapWrapper?: MapWrapperProps; tileLayer?: TileLayerProps; staticMarker?: Omit; controls?: Omit; }; slots?: { floatingMarker?: ReactNode; }; } & Omit; const defaultPosition: LatLngLiteral = { lat: 35.6997, lng: 51.338 }; const LocationPicker = (inProps: LocationPickerProps) => { const { required, error, label, zoom = 15, helperText, value, disabled, onChange, ref, name, inputRef, slotProps, className, slots, ...mapContainerProps } = useDefaultProps({ name: 'ReevolveLocationPicker', props: inProps }); const [rootElement, setRootElement] = useState(null); const _value = value ?? defaultPosition; return ( {label && ( ({ pb: 0.75, ...(isFunction(slotProps?.formLabel?.sx) ? (slotProps.formLabel.sx as Function)(theme) : slotProps?.formLabel?.sx) })} {...slotProps?.formLabel} > {label} )} setRootElement(_rootElement)} className={clsx(error && 'error')} > {!disabled && } {disabled ? ( ) : ( (slots?.floatingMarker ?? ) )} {rootElement && createPortal( , rootElement )} {helperText && {helperText}} ); }; declare module '@mui/material' { interface Components { ReevolveLocationPicker?: { defaultProps?: Partial; }; } } export default LocationPicker;