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
JavaScript
;
/**
* 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