react-native-mapsforge-vtm
Version:
React Native components to build vector maps using Mapsforges fork of vtm. Offline rendering of OpenStreetMap data. Android only
107 lines (104 loc) • 3.36 kB
JavaScript
;
/**
* External dependencies
*/
import { useEffect, useState } from 'react';
/**
* Internal dependencies
*/
import useRefState from "../compose/useRefState.js";
import promiseQueue from "../promiseQueue.js";
import { MapLayerBitmapTileModule } from "../nativeMapModules.js";
const Module = MapLayerBitmapTileModule;
const LayerBitmapTile = ({
nativeNodeHandle,
reactTreeIndex,
url = 'https://tile.openstreetmap.org/{Z}/{X}/{Y}.png',
alpha = 1,
zoomMin = 1,
zoomMax = 20,
enabledZoomMin = 1,
enabledZoomMax = 20,
cacheSize = 0,
cacheDirBase = '/',
// if `/`, will fallback to java getReactApplicationContext().getCacheDir();
cacheDirChild = '',
// if ``, will fallback to slugify url;
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, url, alpha,
// The BitmapTileLayer will ensure its between 0 and 1.
Math.round(zoomMin), Math.round(zoomMax), Math.round(enabledZoomMin), Math.round(enabledZoomMax), Math.round(cacheSize), cacheDirBase.trim(), cacheDirChild.trim(), 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]);
// enabledZoomMin enabledZoomMax changed.
useEffect(() => {
if (nativeNodeHandle && uuid) {
Module.updateEnabledZoomMinMax(nativeNodeHandle, uuid, Math.round(enabledZoomMin), Math.round(enabledZoomMax)).catch(err => {
console.log('ERROR', err);
onError ? onError(err) : null;
});
}
}, [enabledZoomMin, enabledZoomMax]);
useEffect(() => {
if (nativeNodeHandle && uuid) {
Module.setAlpha(nativeNodeHandle, uuid, alpha).catch(err => {
console.log('ERROR', err);
onError ? onError(err) : null;
});
}
}, [alpha]);
useEffect(() => {
if (nativeNodeHandle && uuid) {
promiseQueue.enqueue(() => {
return Module.removeLayer(nativeNodeHandle, uuid).then(() => {
setUuid(null);
setTriggerCreateNew(Math.random());
}).catch(err => {
console.log('ERROR', err);
onError ? onError(err) : null;
});
});
}
}, [url, zoomMin, zoomMax, cacheSize, cacheDirBase, cacheDirChild]);
return null;
};
LayerBitmapTile.isMapLayer = true;
export default LayerBitmapTile;
//# sourceMappingURL=LayerBitmapTile.js.map