react-native-mapsforge-vtm
Version:
React Native components to build vector maps using Mapsforges fork of vtm. Offline rendering of OpenStreetMap data. Android only
121 lines (119 loc) • 3.57 kB
JavaScript
;
/**
* External dependencies
*/
import { useEffect, useState } from 'react';
/**
* Internal dependencies
*/
import useRefState from "../compose/useRefState.js";
import promiseQueue from "../promiseQueue.js";
import { MarkerHotspotPlaces } from "../constants.js";
import { MapLayerMarkerModule } from "../nativeMapModules.js";
import { NativeEventEmitter } from 'react-native';
const Module = MapLayerMarkerModule;
;
const Marker = ({
nativeNodeHandle,
layerUuid,
position,
title = '',
description = '',
symbol = null,
onCreate,
onRemove,
onChange,
onError,
onPress,
onLongPress,
onTrigger
}) => {
// @ts-ignore
const [random, setRandom] = useState(0);
const [uuid, setUuid] = useRefState(null);
const [triggerCreateNew, setTriggerCreateNew] = useState(null);
const create = () => {
setUuid(false);
promiseQueue.enqueue(() => {
return Module.createMarker(nativeNodeHandle, layerUuid, position, title, description, symbol).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 && position) {
create();
}
return () => {
if (!!uuid && nativeNodeHandle) {
promiseQueue.enqueue(() => {
return Module.removeMarker(nativeNodeHandle, layerUuid, uuid).then(removedUuid => {
onRemove ? onRemove({
uuid: removedUuid
}) : null;
}).catch(err => {
console.log('ERROR', err);
onError ? onError(err) : null;
});
});
}
};
}, [!!uuid, triggerCreateNew]);
useEffect(() => {
if (nativeNodeHandle && !!uuid) {
promiseQueue.enqueue(() => {
return Module.removeMarker(nativeNodeHandle, layerUuid, uuid).then(() => {
setUuid(null);
setTriggerCreateNew(Math.random());
}).catch(err => {
console.log('ERROR', err);
onError ? onError(err) : null;
});
});
} else if (uuid === null && position) {
setTriggerCreateNew(Math.random());
}
}, [position ? position.lng + position.lat : null, symbol ? Object.values(symbol).join('') : null]);
useEffect(() => {
const eventEmitter = new NativeEventEmitter();
let eventListener = eventEmitter.addListener('MarkerItemSingleTapUp', response => {
if (response.uuid === uuid && onPress) {
onPress(response);
}
});
return () => {
eventListener.remove();
};
}, [uuid, onPress]);
useEffect(() => {
const eventEmitter = new NativeEventEmitter();
let eventListener = eventEmitter.addListener('MarkerItemLongPress', response => {
if (response.uuid === uuid && onLongPress) {
onLongPress(response);
}
});
return () => {
eventListener.remove();
};
}, [uuid, onLongPress]);
useEffect(() => {
const eventEmitter = new NativeEventEmitter();
let eventListener = eventEmitter.addListener('MarkerItemTriggerEvent', response => {
if (response.uuid === uuid && onTrigger) {
onTrigger(response);
}
});
return () => {
eventListener.remove();
};
}, [uuid, onTrigger]);
return null;
};
Marker.MarkerHotspotPlaces = MarkerHotspotPlaces;
export default Marker;
//# sourceMappingURL=Marker.js.map