react-native-mapsforge-vtm
Version:
React Native components to build vector maps using Mapsforges fork of vtm. Offline rendering of OpenStreetMap data. Android only
156 lines (153 loc) • 4.93 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _react = require("react");
var _useRefState = _interopRequireDefault(require("../compose/useRefState.js"));
var _promiseQueue = _interopRequireDefault(require("../promiseQueue.js"));
var _nativeMapModules = require("../nativeMapModules.js");
var _reactNative = require("react-native");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
/**
* External dependencies
*/
/**
* Internal dependencies
*/
const Module = _nativeMapModules.MapLayerPathModule;
;
;
// 0 never include in response.
// 1 include in response on create.
// 2 include in response on change.
const responseIncludeDefaults = {
coordinates: 0,
bounds: 0
};
const defaultStyle = {
strokeWidth: 4,
strokeColor: '#ff0000'
};
const LayerPath = ({
nativeNodeHandle,
positions = [],
filePath,
responseInclude = responseIncludeDefaults,
gestureScreenDistance = 20,
reactTreeIndex,
style = defaultStyle,
simplificationTolerance = 0,
onCreate,
onRemove,
onChange,
onError,
onPress,
onLongPress,
onDoubleTap,
onTrigger
}) => {
// @ts-ignore
const [random, setRandom] = (0, _react.useState)(0);
const [uuid, setUuid] = (0, _useRefState.default)(null);
const [triggerCreateNew, setTriggerCreateNew] = (0, _react.useState)(null);
positions = positions || [];
responseInclude = {
...responseIncludeDefaults,
...responseInclude
};
style = {
...defaultStyle,
...style
};
const supportsGestures = !!onPress || !!onLongPress || !!onDoubleTap;
const createLayer = () => {
setUuid(false);
_promiseQueue.default.enqueue(() => {
return Module.createLayer(nativeNodeHandle, positions, filePath, style, responseInclude, !!supportsGestures, gestureScreenDistance, simplificationTolerance, 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;
});
});
};
(0, _react.useEffect)(() => {
if (uuid === null && nativeNodeHandle && (filePath || positions.length > 0)) {
createLayer();
}
return () => {
if (uuid && nativeNodeHandle) {
_promiseQueue.default.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]);
(0, _react.useEffect)(() => {
if (nativeNodeHandle && uuid) {
_promiseQueue.default.enqueue(() => {
return Module.updateStyle(nativeNodeHandle, uuid, style, responseInclude).then(response => {
onChange ? onChange(response) : null;
}).catch(err => {
console.log('ERROR', err);
onError ? onError(err) : null;
});
});
}
}, [Object.values(style).join('')]);
(0, _react.useEffect)(() => {
if (nativeNodeHandle) {
if (uuid) {
_promiseQueue.default.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 && (filePath || positions.length > 0)) {
setTriggerCreateNew(Math.random());
}
}
}, [positions.length > 0 ? [...positions].map(pos => pos.lng + pos.lat).join('') : null, simplificationTolerance, filePath, Object.keys(responseInclude).map(key => key + responseInclude[key]).join('')]);
(0, _react.useEffect)(() => {
const eventEmitter = new _reactNative.NativeEventEmitter();
let eventListener = eventEmitter.addListener('PathGesture', response => {
if (response.uuid === uuid) {
switch (response.type) {
case 'doubleTap':
onDoubleTap ? onDoubleTap(response) : null;
break;
case 'LongPress':
onLongPress ? onLongPress(response) : null;
break;
case 'press':
onPress ? onPress(response) : null;
break;
case 'trigger':
onTrigger ? onTrigger(response) : null;
break;
}
}
});
return () => {
eventListener.remove();
};
}, [uuid, !!supportsGestures, onDoubleTap, onLongPress, onPress, onTrigger]);
return null;
};
LayerPath.isMapLayer = true;
var _default = exports.default = LayerPath;
//# sourceMappingURL=LayerPath.js.map