@chayns-components/maps
Version:
A set of beautiful React components for developing your own applications with chayns.
96 lines (94 loc) • 3.51 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = _interopRequireWildcard(require("react"));
var _Map = require("./Map.styles");
var _positionInput = require("../../../../hooks/positionInput");
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
const Map = ({
mapTypeControl,
fullscreenControl,
streetViewControl,
children,
onClick,
onIdle,
zoom,
center,
onPositionChange
}) => {
const [map, setMap] = (0, _react.useState)();
const ref = (0, _react.useRef)(null);
(0, _react.useEffect)(() => {
if (ref.current && !map) {
setMap(new window.google.maps.Map(ref.current, {}));
const input = document.getElementById('auto-complete-input');
if (!input) {
return;
}
const autoComplete = new google.maps.places.Autocomplete(input, {
// componentRestrictions: { country: ["de"] },
fields: ['address_component', 'geometry'],
types: ['(cities)']
});
input.placeholder = '';
autoComplete.addListener('place_changed', () => {
var _place$geometry;
const place = autoComplete.getPlace();
const placeLocation = (_place$geometry = place.geometry) === null || _place$geometry === void 0 ? void 0 : _place$geometry.location;
if (!placeLocation) {
return;
}
onPositionChange({
lat: placeLocation.lat(),
lng: placeLocation.lng()
});
});
}
}, [ref, map, onPositionChange]);
(0, _react.useEffect)(() => {
if (map) {
map.setCenter(center);
}
}, [center, map]);
// because React does not do deep comparisons, a custom hook is used
// see discussion in https://github.com/googlemaps/js-samples/issues/946
(0, _positionInput.useDeepCompareEffectForMaps)(() => {
if (map) {
map.setOptions({
mapTypeControl,
fullscreenControl,
streetViewControl,
zoom
});
}
}, [map]);
(0, _react.useEffect)(() => {
if (map) {
['click', 'idle'].forEach(eventName => google.maps.event.clearListeners(map, eventName));
if (onClick) {
map.addListener('click', onClick);
}
if (onIdle) {
map.addListener('idle', () => onIdle(map));
}
}
}, [map, onClick, onIdle]);
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Map.StyledMap, {
ref: ref
}), _react.default.Children.map(children, child => {
if (/*#__PURE__*/_react.default.isValidElement(child)) {
// set the map prop on the child component
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
// @ts-ignore
return /*#__PURE__*/_react.default.cloneElement(child, {
map
});
}
return null;
}));
};
Map.displayName = 'Map';
var _default = exports.default = Map;
//# sourceMappingURL=Map.js.map