UNPKG

react-native-mapsforge-vtm

Version:

React Native components to build vector maps using Mapsforges fork of vtm. Offline rendering of OpenStreetMap data. Android only

101 lines (99 loc) 2.88 kB
"use strict"; /** * External dependencies */ import { Children, cloneElement, isValidElement, useEffect, useState } from 'react'; /** * Internal dependencies */ import useRefState from "../compose/useRefState.js"; import promiseQueue from "../promiseQueue.js"; import { MapLayerMarkerModule } from "../nativeMapModules.js"; const Module = MapLayerMarkerModule; const LayerMarker = ({ children, nativeNodeHandle, symbol = null, reactTreeIndex, onCreate, onRemove, onChange, onError }) => { // @ts-ignore const [random, setRandom] = useState(0); const [uuid, setUuid] = useRefState(null); const [triggerCreateNew, setTriggerCreateNew] = useState(null); const createLayer = () => { setUuid(false); promiseQueue.enqueue(() => { return Module.createLayer(nativeNodeHandle, symbol, reactTreeIndex).then(response => { setUuid(response.uuid); setRandom(Math.random()); null === triggerCreateNew ? onCreate ? onCreate(response) : null : onChange ? onChange(response) : null; }).catch(err => { console.log('ERROR', err); onError ? onError(err) : null; }); }); }; useEffect(() => { if (uuid === null && nativeNodeHandle) { createLayer(); } return () => { if (uuid && nativeNodeHandle) { promiseQueue.enqueue(() => { return Module.removeLayer(nativeNodeHandle, uuid).then(removedUuid => { onRemove ? onRemove({ uuid: removedUuid }) : null; }).catch(err => { console.log('ERROR', err); onError ? onError(err) : null; }); }); } }; }, [nativeNodeHandle, !!uuid, triggerCreateNew]); useEffect(() => { if (nativeNodeHandle) { if (uuid) { promiseQueue.enqueue(() => { return Module.removeLayer(nativeNodeHandle, uuid).then(() => { setUuid(null); setTriggerCreateNew(Math.random()); }).catch(err => { console.log('ERROR', err); onError ? onError(err) : null; }); }); } else if (uuid === null) { setTriggerCreateNew(Math.random()); } } }, [symbol ? Object.values(symbol).join('') : null]); if (!uuid) { return null; } const wrapChildren = children => !children ? null : Children.map(children, child => { let newChild = child; if (! /*#__PURE__*/isValidElement(child)) { return newChild; } newChild = /*#__PURE__*/cloneElement(child, { ...{ layerUuid: uuid }, ...(child?.props?.children && { children: wrapChildren(child.props.children) }) }); return newChild; }); const wrappedChildren = wrapChildren(children); return wrappedChildren; }; LayerMarker.isMapLayer = true; export default LayerMarker; //# sourceMappingURL=LayerMarker.js.map