rs-react-native-image-gallery
Version:
React Native Image Gallery with Thumbnails
77 lines • 10.3 kB
JavaScript
import { Image } from 'react-native';
import { SCALE_MULTIPLIER } from './constants';
/**
* Calculate squared distance between two points
* @param a First coordinate
* @param b Second coordinate
*/
export var pow2abs = function (a, b) { return Math.pow((a - b), 2); };
/**
* Get distance between two touch points
* @param touches Array of touch events
*/
export var getDistance = function (touches) {
// Early validation
if (!touches || touches.length < 2)
return 0;
var a = touches[0], b = touches[1];
// Null check with optional chaining
if (!(a === null || a === void 0 ? void 0 : a.pageX) || !(b === null || b === void 0 ? void 0 : b.pageX) || !(a === null || a === void 0 ? void 0 : a.pageY) || !(b === null || b === void 0 ? void 0 : b.pageY))
return 0;
return Math.sqrt(pow2abs(a.pageX, b.pageX) + pow2abs(a.pageY, b.pageY));
};
// Cache for memoized distance calculations - improves performance on pinch gestures
var distanceCache = new Map();
/**
* Memoized version of getDistance - caches results for better performance
* Only use this when you expect the same touch points to be calculated repeatedly
* @param touches Array of touch events
*/
export var getMemoizedDistance = function (touches) {
// Early validation
if (!touches || touches.length < 2)
return 0;
var a = touches[0], b = touches[1];
// Null check with optional chaining
if (!(a === null || a === void 0 ? void 0 : a.pageX) || !(b === null || b === void 0 ? void 0 : b.pageX) || !(a === null || a === void 0 ? void 0 : a.pageY) || !(b === null || b === void 0 ? void 0 : b.pageY))
return 0;
// Create cache key from touch coordinates
var key = "".concat(a.pageX, ",").concat(a.pageY, "-").concat(b.pageX, ",").concat(b.pageY);
if (distanceCache.has(key)) {
return distanceCache.get(key);
}
var distance = Math.sqrt(pow2abs(a.pageX, b.pageX) + pow2abs(a.pageY, b.pageY));
// Cache result - limit cache size to avoid memory leaks
if (distanceCache.size > 100) {
// Clear cache when it gets too big
distanceCache.clear();
}
distanceCache.set(key, distance);
return distance;
};
/**
* Calculate scale based on distance ratio with a multiplier
* @param currentDistance Current distance between touch points
* @param initialDistance Initial distance between touch points
*/
export var getScale = function (currentDistance, initialDistance) {
// Prevent division by zero
if (!initialDistance)
return 1;
return (currentDistance / initialDistance) * SCALE_MULTIPLIER;
};
/**
* Pre-loads images to avoid spinner issues
* @param urls Array of image URLs to preload (only URLs are supported for prefetch)
*/
export var preLoadImages = function (urls) {
urls.forEach(function (url) {
if (!url || typeof url !== 'string')
return;
// Use Image.prefetch for native platforms (only works with URL strings)
Image.prefetch(url).catch(function () {
// Silent catch - we don't need to handle prefetch errors
});
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX2hlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvX2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBeUIsTUFBTSxjQUFjLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRS9DOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsSUFBTSxPQUFPLEdBQUcsVUFBQyxDQUFTLEVBQUUsQ0FBUyxJQUFhLE9BQUEsU0FBQSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBSSxDQUFDLENBQUEsRUFBWixDQUFZLENBQUM7QUFFdEU7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLElBQU0sV0FBVyxHQUFHLFVBQUMsT0FBZ0M7SUFDM0QsbUJBQW1CO0lBQ25CLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFFdEMsSUFBQSxDQUFDLEdBQU8sT0FBTyxHQUFkLEVBQUUsQ0FBQyxHQUFJLE9BQU8sR0FBWCxDQUFZO0lBRXZCLG9DQUFvQztJQUNwQyxJQUFJLENBQUMsQ0FBQSxDQUFDLGFBQUQsQ0FBQyx1QkFBRCxDQUFDLENBQUUsS0FBSyxDQUFBLElBQUksQ0FBQyxDQUFBLENBQUMsYUFBRCxDQUFDLHVCQUFELENBQUMsQ0FBRSxLQUFLLENBQUEsSUFBSSxDQUFDLENBQUEsQ0FBQyxhQUFELENBQUMsdUJBQUQsQ0FBQyxDQUFFLEtBQUssQ0FBQSxJQUFJLENBQUMsQ0FBQSxDQUFDLGFBQUQsQ0FBQyx1QkFBRCxDQUFDLENBQUUsS0FBSyxDQUFBO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFFL0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFDLENBQUM7QUFFRixvRkFBb0Y7QUFDcEYsSUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7QUFFaEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxJQUFNLG1CQUFtQixHQUFHLFVBQUMsT0FBZ0M7SUFDbkUsbUJBQW1CO0lBQ25CLElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFFdEMsSUFBQSxDQUFDLEdBQU8sT0FBTyxHQUFkLEVBQUUsQ0FBQyxHQUFJLE9BQU8sR0FBWCxDQUFZO0lBRXZCLG9DQUFvQztJQUNwQyxJQUFJLENBQUMsQ0FBQSxDQUFDLGFBQUQsQ0FBQyx1QkFBRCxDQUFDLENBQUUsS0FBSyxDQUFBLElBQUksQ0FBQyxDQUFBLENBQUMsYUFBRCxDQUFDLHVCQUFELENBQUMsQ0FBRSxLQUFLLENBQUEsSUFBSSxDQUFDLENBQUEsQ0FBQyxhQUFELENBQUMsdUJBQUQsQ0FBQyxDQUFFLEtBQUssQ0FBQSxJQUFJLENBQUMsQ0FBQSxDQUFDLGFBQUQsQ0FBQyx1QkFBRCxDQUFDLENBQUUsS0FBSyxDQUFBO1FBQUUsT0FBTyxDQUFDLENBQUM7SUFFL0QsMENBQTBDO0lBQzFDLElBQU0sR0FBRyxHQUFHLFVBQUcsQ0FBQyxDQUFDLEtBQUssY0FBSSxDQUFDLENBQUMsS0FBSyxjQUFJLENBQUMsQ0FBQyxLQUFLLGNBQUksQ0FBQyxDQUFDLEtBQUssQ0FBRSxDQUFDO0lBRTFELElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzVCLE9BQU8sYUFBYSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFFbEYsd0RBQXdEO0lBQ3hELElBQUksYUFBYSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUM5QixtQ0FBbUM7UUFDbkMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxhQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNqQyxPQUFPLFFBQVEsQ0FBQztBQUNqQixDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLElBQU0sUUFBUSxHQUFHLFVBQUMsZUFBdUIsRUFBRSxlQUF1QjtJQUN4RSwyQkFBMkI7SUFDM0IsSUFBSSxDQUFDLGVBQWU7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUUvQixPQUFPLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQyxHQUFHLGdCQUFnQixDQUFDO0FBQy9ELENBQUMsQ0FBQztBQUVGOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxJQUFNLGFBQWEsR0FBRyxVQUFDLElBQWM7SUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFDLEdBQUc7UUFDaEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQUUsT0FBTztRQUU1Qyx3RUFBd0U7UUFDeEUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDekIseURBQXlEO1FBQzFELENBQUMsQ0FBQyxDQUFDO0lBQ0osQ0FBQyxDQUFDLENBQUM7QUFDSixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbWFnZSwgdHlwZSBOYXRpdmVUb3VjaEV2ZW50IH0gZnJvbSAncmVhY3QtbmF0aXZlJztcbmltcG9ydCB7IFNDQUxFX01VTFRJUExJRVIgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHNxdWFyZWQgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzXG4gKiBAcGFyYW0gYSBGaXJzdCBjb29yZGluYXRlXG4gKiBAcGFyYW0gYiBTZWNvbmQgY29vcmRpbmF0ZVxuICovXG5leHBvcnQgY29uc3QgcG93MmFicyA9IChhOiBudW1iZXIsIGI6IG51bWJlcik6IG51bWJlciA9PiAoYSAtIGIpICoqIDI7XG5cbi8qKlxuICogR2V0IGRpc3RhbmNlIGJldHdlZW4gdHdvIHRvdWNoIHBvaW50c1xuICogQHBhcmFtIHRvdWNoZXMgQXJyYXkgb2YgdG91Y2ggZXZlbnRzXG4gKi9cbmV4cG9ydCBjb25zdCBnZXREaXN0YW5jZSA9ICh0b3VjaGVzOiBBcnJheTxOYXRpdmVUb3VjaEV2ZW50Pik6IG51bWJlciA9PiB7XG5cdC8vIEVhcmx5IHZhbGlkYXRpb25cblx0aWYgKCF0b3VjaGVzIHx8IHRvdWNoZXMubGVuZ3RoIDwgMikgcmV0dXJuIDA7XG5cblx0Y29uc3QgW2EsIGJdID0gdG91Y2hlcztcblxuXHQvLyBOdWxsIGNoZWNrIHdpdGggb3B0aW9uYWwgY2hhaW5pbmdcblx0aWYgKCFhPy5wYWdlWCB8fCAhYj8ucGFnZVggfHwgIWE/LnBhZ2VZIHx8ICFiPy5wYWdlWSkgcmV0dXJuIDA7XG5cblx0cmV0dXJuIE1hdGguc3FydChwb3cyYWJzKGEucGFnZVgsIGIucGFnZVgpICsgcG93MmFicyhhLnBhZ2VZLCBiLnBhZ2VZKSk7XG59O1xuXG4vLyBDYWNoZSBmb3IgbWVtb2l6ZWQgZGlzdGFuY2UgY2FsY3VsYXRpb25zIC0gaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb24gcGluY2ggZ2VzdHVyZXNcbmNvbnN0IGRpc3RhbmNlQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuXG4vKipcbiAqIE1lbW9pemVkIHZlcnNpb24gb2YgZ2V0RGlzdGFuY2UgLSBjYWNoZXMgcmVzdWx0cyBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlXG4gKiBPbmx5IHVzZSB0aGlzIHdoZW4geW91IGV4cGVjdCB0aGUgc2FtZSB0b3VjaCBwb2ludHMgdG8gYmUgY2FsY3VsYXRlZCByZXBlYXRlZGx5XG4gKiBAcGFyYW0gdG91Y2hlcyBBcnJheSBvZiB0b3VjaCBldmVudHNcbiAqL1xuZXhwb3J0IGNvbnN0IGdldE1lbW9pemVkRGlzdGFuY2UgPSAodG91Y2hlczogQXJyYXk8TmF0aXZlVG91Y2hFdmVudD4pOiBudW1iZXIgPT4ge1xuXHQvLyBFYXJseSB2YWxpZGF0aW9uXG5cdGlmICghdG91Y2hlcyB8fCB0b3VjaGVzLmxlbmd0aCA8IDIpIHJldHVybiAwO1xuXG5cdGNvbnN0IFthLCBiXSA9IHRvdWNoZXM7XG5cblx0Ly8gTnVsbCBjaGVjayB3aXRoIG9wdGlvbmFsIGNoYWluaW5nXG5cdGlmICghYT8ucGFnZVggfHwgIWI/LnBhZ2VYIHx8ICFhPy5wYWdlWSB8fCAhYj8ucGFnZVkpIHJldHVybiAwO1xuXG5cdC8vIENyZWF0ZSBjYWNoZSBrZXkgZnJvbSB0b3VjaCBjb29yZGluYXRlc1xuXHRjb25zdCBrZXkgPSBgJHthLnBhZ2VYfSwke2EucGFnZVl9LSR7Yi5wYWdlWH0sJHtiLnBhZ2VZfWA7XG5cblx0aWYgKGRpc3RhbmNlQ2FjaGUuaGFzKGtleSkpIHtcblx0XHRyZXR1cm4gZGlzdGFuY2VDYWNoZS5nZXQoa2V5KSE7XG5cdH1cblxuXHRjb25zdCBkaXN0YW5jZSA9IE1hdGguc3FydChwb3cyYWJzKGEucGFnZVgsIGIucGFnZVgpICsgcG93MmFicyhhLnBhZ2VZLCBiLnBhZ2VZKSk7XG5cblx0Ly8gQ2FjaGUgcmVzdWx0IC0gbGltaXQgY2FjaGUgc2l6ZSB0byBhdm9pZCBtZW1vcnkgbGVha3Ncblx0aWYgKGRpc3RhbmNlQ2FjaGUuc2l6ZSA+IDEwMCkge1xuXHRcdC8vIENsZWFyIGNhY2hlIHdoZW4gaXQgZ2V0cyB0b28gYmlnXG5cdFx0ZGlzdGFuY2VDYWNoZS5jbGVhcigpO1xuXHR9XG5cblx0ZGlzdGFuY2VDYWNoZS5zZXQoa2V5LCBkaXN0YW5jZSk7XG5cdHJldHVybiBkaXN0YW5jZTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlIHNjYWxlIGJhc2VkIG9uIGRpc3RhbmNlIHJhdGlvIHdpdGggYSBtdWx0aXBsaWVyXG4gKiBAcGFyYW0gY3VycmVudERpc3RhbmNlIEN1cnJlbnQgZGlzdGFuY2UgYmV0d2VlbiB0b3VjaCBwb2ludHNcbiAqIEBwYXJhbSBpbml0aWFsRGlzdGFuY2UgSW5pdGlhbCBkaXN0YW5jZSBiZXR3ZWVuIHRvdWNoIHBvaW50c1xuICovXG5leHBvcnQgY29uc3QgZ2V0U2NhbGUgPSAoY3VycmVudERpc3RhbmNlOiBudW1iZXIsIGluaXRpYWxEaXN0YW5jZTogbnVtYmVyKTogbnVtYmVyID0+IHtcblx0Ly8gUHJldmVudCBkaXZpc2lvbiBieSB6ZXJvXG5cdGlmICghaW5pdGlhbERpc3RhbmNlKSByZXR1cm4gMTtcblxuXHRyZXR1cm4gKGN1cnJlbnREaXN0YW5jZSAvIGluaXRpYWxEaXN0YW5jZSkgKiBTQ0FMRV9NVUxUSVBMSUVSO1xufTtcblxuLyoqXG4gKiBQcmUtbG9hZHMgaW1hZ2VzIHRvIGF2b2lkIHNwaW5uZXIgaXNzdWVzXG4gKiBAcGFyYW0gdXJscyBBcnJheSBvZiBpbWFnZSBVUkxzIHRvIHByZWxvYWQgKG9ubHkgVVJMcyBhcmUgc3VwcG9ydGVkIGZvciBwcmVmZXRjaClcbiAqL1xuZXhwb3J0IGNvbnN0IHByZUxvYWRJbWFnZXMgPSAodXJsczogc3RyaW5nW10pOiB2b2lkID0+IHtcblx0dXJscy5mb3JFYWNoKCh1cmwpID0+IHtcblx0XHRpZiAoIXVybCB8fCB0eXBlb2YgdXJsICE9PSAnc3RyaW5nJykgcmV0dXJuO1xuXG5cdFx0Ly8gVXNlIEltYWdlLnByZWZldGNoIGZvciBuYXRpdmUgcGxhdGZvcm1zIChvbmx5IHdvcmtzIHdpdGggVVJMIHN0cmluZ3MpXG5cdFx0SW1hZ2UucHJlZmV0Y2godXJsKS5jYXRjaCgoKSA9PiB7XG5cdFx0XHQvLyBTaWxlbnQgY2F0Y2ggLSB3ZSBkb24ndCBuZWVkIHRvIGhhbmRsZSBwcmVmZXRjaCBlcnJvcnNcblx0XHR9KTtcblx0fSk7XG59O1xuIl19