UNPKG

rs-react-native-image-gallery

Version:
92 lines 15.1 kB
import { memo, useCallback, useEffect, useMemo, useState } from 'react'; import { ActivityIndicator, Dimensions, Image, StyleSheet, Text, TouchableWithoutFeedback, View } from 'react-native'; import { LOADING_TIMEOUT } from './constants'; // ---------------------------------------------------------------------- // Get dimensions outside component to avoid recreating on every render var _a = Dimensions.get('window'), initialHeight = _a.height, initialWidth = _a.width; // Cache for tracking already loaded images to avoid showing the loading indicator again var loadedImages = new Set(); var ImagePreview = memo(function (_a) { var index = _a.index, isSelected = _a.isSelected, item = _a.item, renderCustomImage = _a.renderCustomImage, resizeMode = _a.resizeMode; // Create a unique identifier for the image for caching var imageKey = item.url || (typeof item.source === 'object' && 'uri' in item.source ? item.source.uri : String(item.source)); var _b = useState(!loadedImages.has(imageKey || '')), isLoading = _b[0], setIsLoading = _b[1]; var _c = useState(false), hasError = _c[0], setHasError = _c[1]; // Use dimensions from closure or through hook if dynamic resizing is needed var _d = useMemo(function () { return ({ height: initialHeight, width: initialWidth }); }, []), height = _d.height, width = _d.width; // Create memoized styles with dynamic dimensions var containerStyle = useMemo(function () { return ({ height: height, width: width }); }, [height, width]); var handleLoadEnd = useCallback(function () { setIsLoading(false); if (imageKey) { loadedImages.add(imageKey); } }, [imageKey]); var handleError = useCallback(function () { setHasError(true); setIsLoading(false); }, []); // Add loading timeout to prevent infinite spinner useEffect(function () { if (!isLoading) return; var timeoutId = setTimeout(function () { if (isLoading) { setIsLoading(false); } }, LOADING_TIMEOUT); return function () { return clearTimeout(timeoutId); }; }, [isLoading]); return (<View style={{ width: '100%', height: '100%' }}> <TouchableWithoutFeedback> <View style={[containerStyle, { overflow: 'hidden' }]}> {renderCustomImage ? (renderCustomImage(item, index, isSelected)) : (<Image resizeMode={resizeMode} source={item.source || { uri: item.url }} // @ts-ignore style={styles.image} onLoadStart={function () { setIsLoading(true); setHasError(false); }} onLoad={handleLoadEnd} onError={handleError} accessible={true} accessibilityLabel={"Image ".concat(index + 1)} fadeDuration={300}/>)} {isLoading && <ActivityIndicator style={styles.loader} color="white" size="large"/>} {hasError && (<View style={styles.errorContainer}> <Text style={styles.errorText}>Failed to load image</Text> </View>)} </View> </TouchableWithoutFeedback> </View>); }, function (prevProps, nextProps) { // Only re-render if the selected index changes or the image URL changes return (prevProps.isSelected === nextProps.isSelected && prevProps.item.url === nextProps.item.url && prevProps.item.source === nextProps.item.source && prevProps.index === nextProps.index); }); var styles = StyleSheet.create({ image: { height: '100%', width: '100%' }, loader: { position: 'absolute', top: '50%', left: '50%', transform: [{ translateX: -15 }, { translateY: -15 }] }, errorContainer: { position: 'absolute', top: '50%', left: '50%', transform: [{ translateX: -75 }, { translateY: -15 }], backgroundColor: 'rgba(0, 0, 0, 0.7)', padding: 10, borderRadius: 5 }, errorText: { color: 'white', fontSize: 16 } }); export default ImagePreview; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UtcHJldmlldy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9pbWFnZS1wcmV2aWV3LnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUN4RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLHdCQUF3QixFQUFFLElBQUksRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN0SCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRzlDLHlFQUF5RTtBQUV6RSx1RUFBdUU7QUFDakUsSUFBQSxLQUFpRCxVQUFVLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUEvRCxhQUFhLFlBQUEsRUFBUyxZQUFZLFdBQTZCLENBQUM7QUFFaEYsd0ZBQXdGO0FBQ3hGLElBQU0sWUFBWSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFFdkMsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUN4QixVQUFDLEVBQTZFO1FBQTNFLEtBQUssV0FBQSxFQUFFLFVBQVUsZ0JBQUEsRUFBRSxJQUFJLFVBQUEsRUFBRSxpQkFBaUIsdUJBQUEsRUFBRSxVQUFVLGdCQUFBO0lBQ3hELHVEQUF1RDtJQUN2RCxJQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN6SCxJQUFBLEtBQTRCLFFBQVEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFB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LENBQUMsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0tBQ3JEO0lBQ0QsY0FBYyxFQUFFO1FBQ2YsUUFBUSxFQUFFLFVBQVU7UUFDcEIsR0FBRyxFQUFFLEtBQUs7UUFDVixJQUFJLEVBQUUsS0FBSztRQUNYLFNBQVMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyRCxlQUFlLEVBQUUsb0JBQW9CO1FBQ3JDLE9BQU8sRUFBRSxFQUFFO1FBQ1gsWUFBWSxFQUFFLENBQUM7S0FDZjtJQUNELFNBQVMsRUFBRTtRQUNWLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUSxFQUFFLEVBQUU7S0FDWjtDQUNELENBQUMsQ0FBQztBQUVILGVBQWUsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWVtbywgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBBY3Rpdml0eUluZGljYXRvciwgRGltZW5zaW9ucywgSW1hZ2UsIFN0eWxlU2hlZXQsIFRleHQsIFRvdWNoYWJsZVdpdGhvdXRGZWVkYmFjaywgVmlldyB9IGZyb20gJ3JlYWN0LW5hdGl2ZSc7XG5pbXBvcnQgeyBMT0FESU5HX1RJTUVPVVQgfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQgdHlwZSB7IEltYWdlUHJldmlld1Byb3BzIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLy8gR2V0IGRpbWVuc2lvbnMgb3V0c2lkZSBjb21wb25lbnQgdG8gYXZvaWQgcmVjcmVhdGluZyBvbiBldmVyeSByZW5kZXJcbmNvbnN0IHsgaGVpZ2h0OiBpbml0aWFsSGVpZ2h0LCB3aWR0aDogaW5pdGlhbFdpZHRoIH0gPSBEaW1lbnNpb25zLmdldCgnd2luZG93Jyk7XG5cbi8vIENhY2hlIGZvciB0cmFja2luZyBhbHJlYWR5IGxvYWRlZCBpbWFnZXMgdG8gYXZvaWQgc2hvd2luZyB0aGUgbG9hZGluZyBpbmRpY2F0b3IgYWdhaW5cbmNvbnN0IGxvYWRlZEltYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG5jb25zdCBJbWFnZVByZXZpZXcgPSBtZW1vKFxuXHQoeyBpbmRleCwgaXNTZWxlY3RlZCwgaXRlbSwgcmVuZGVyQ3VzdG9tSW1hZ2UsIHJlc2l6ZU1vZGUgfTogSW1hZ2VQcmV2aWV3UHJvcHMpID0+IHtcblx0XHQvLyBDcmVhdGUgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGltYWdlIGZvciBjYWNoaW5nXG5cdFx0Y29uc3QgaW1hZ2VLZXkgPSBpdGVtLnVybCB8fCAodHlwZW9mIGl0ZW0uc291cmNlID09PSAnb2JqZWN0JyAmJiAndXJpJyBpbiBpdGVtLnNvdXJjZSA/IGl0ZW0uc291cmNlLnVyaSA6IFN0cmluZyhpdGVtLnNvdXJjZSkpO1xuXHRcdGNvbnN0IFtpc0xvYWRpbmcsIHNldElzTG9hZGluZ10gPSB1c2VTdGF0ZSghbG9hZGVkSW1hZ2VzLmhhcyhpbWFnZUtleSB8fCAnJykpO1xuXHRcdGNvbnN0IFtoYXNFcnJvciwgc2V0SGFzRXJyb3JdID0gdXNlU3RhdGUoZmFsc2UpO1xuXHRcdC8vIFVzZSBkaW1lbnNpb25zIGZyb20gY2xvc3VyZSBvciB0aHJvdWdoIGhvb2sgaWYgZHluYW1pYyByZXNpemluZyBpcyBuZWVkZWRcblx0XHRjb25zdCB7IGhlaWdodCwgd2lkdGggfSA9IHVzZU1lbW8oKCkgPT4gKHsgaGVpZ2h0OiBpbml0aWFsSGVpZ2h0LCB3aWR0aDogaW5pdGlhbFdpZHRoIH0pLCBbXSk7XG5cblx0XHQvLyBDcmVhdGUgbWVtb2l6ZWQgc3R5bGVzIHdpdGggZHluYW1pYyBkaW1lbnNpb25zXG5cdFx0Y29uc3QgY29udGFpbmVyU3R5bGUgPSB1c2VNZW1vKFxuXHRcdFx0KCkgPT4gKHtcblx0XHRcdFx0aGVpZ2h0LFxuXHRcdFx0XHR3aWR0aFxuXHRcdFx0fSksXG5cdFx0XHRbaGVpZ2h0LCB3aWR0aF1cblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFuZGxlTG9hZEVuZCA9IHVzZUNhbGxiYWNrKCgpID0+IHtcblx0XHRcdHNldElzTG9hZGluZyhmYWxzZSk7XG5cdFx0XHRpZiAoaW1hZ2VLZXkpIHtcblx0XHRcdFx0bG9hZGVkSW1hZ2VzLmFkZChpbWFnZUtleSk7XG5cdFx0XHR9XG5cdFx0fSwgW2ltYWdlS2V5XSk7XG5cblx0XHRjb25zdCBoYW5kbGVFcnJvciA9IHVzZUNhbGxiYWNrKCgpID0+IHtcblx0XHRcdHNldEhhc0Vycm9yKHRydWUpO1xuXHRcdFx0c2V0SXNMb2FkaW5nKGZhbHNlKTtcblx0XHR9LCBbXSk7XG5cblx0XHQvLyBBZGQgbG9hZGluZyB0aW1lb3V0IHRvIHByZXZlbnQgaW5maW5pdGUgc3Bpbm5lclxuXHRcdHVzZUVmZmVjdCgoKSA9PiB7XG5cdFx0XHRpZiAoIWlzTG9hZGluZykgcmV0dXJuO1xuXG5cdFx0XHRjb25zdCB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0aWYgKGlzTG9hZGluZykge1xuXHRcdFx0XHRcdHNldElzTG9hZGluZyhmYWxzZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIExPQURJTkdfVElNRU9VVCk7XG5cblx0XHRcdHJldHVybiAoKSA9PiBjbGVhclRpbWVvdXQodGltZW91dElkKTtcblx0XHR9LCBbaXNMb2FkaW5nXSk7XG5cblx0XHRyZXR1cm4gKFxuXHRcdFx0PFZpZXcgc3R5bGU9e3sgd2lkdGg6ICcxMDAlJywgaGVpZ2h0OiAnMTAwJScgfX0+XG5cdFx0XHRcdDxUb3VjaGFibGVXaXRob3V0RmVlZGJhY2s+XG5cdFx0XHRcdFx0PFZpZXcgc3R5bGU9e1tjb250YWluZXJTdHlsZSwgeyBvdmVyZmxvdzogJ2hpZGRlbicgfV19PlxuXHRcdFx0XHRcdFx0e3JlbmRlckN1c3RvbUltYWdlID8gKFxuXHRcdFx0XHRcdFx0XHRyZW5kZXJDdXN0b21JbWFnZShpdGVtLCBpbmRleCwgaXNTZWxlY3RlZClcblx0XHRcdFx0XHRcdCkgOiAoXG5cdFx0XHRcdFx0XHRcdDxJbWFnZVxuXHRcdFx0XHRcdFx0XHRcdHJlc2l6ZU1vZGU9e3Jlc2l6ZU1vZGV9XG5cdFx0XHRcdFx0XHRcdFx0c291cmNlPXtpdGVtLnNvdXJjZSB8fCB7IHVyaTogaXRlbS51cmwgfX1cblx0XHRcdFx0XHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdFx0XHRcdFx0c3R5bGU9e3N0eWxlcy5pbWFnZX1cblx0XHRcdFx0XHRcdFx0XHRvbkxvYWRTdGFydD17KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdFx0c2V0SXNMb2FkaW5nKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRcdFx0c2V0SGFzRXJyb3IoZmFsc2UpO1xuXHRcdFx0XHRcdFx0XHRcdH19XG5cdFx0XHRcdFx0XHRcdFx0b25Mb2FkPXtoYW5kbGVMb2FkRW5kfVxuXHRcdFx0XHRcdFx0XHRcdG9uRXJyb3I9e2hhbmRsZUVycm9yfVxuXHRcdFx0XHRcdFx0XHRcdGFjY2Vzc2libGU9e3RydWV9XG5cdFx0XHRcdFx0XHRcdFx0YWNjZXNzaWJpbGl0eUxhYmVsPXtgSW1hZ2UgJHtpbmRleCArIDF9YH1cblx0XHRcdFx0XHRcdFx0XHRmYWRlRHVyYXRpb249ezMwMH1cblx0XHRcdFx0XHRcdFx0Lz5cblx0XHRcdFx0XHRcdCl9XG5cdFx0XHRcdFx0XHR7aXNMb2FkaW5nICYmIDxBY3Rpdml0eUluZGljYXRvciBzdHlsZT17c3R5bGVzLmxvYWRlcn0gY29sb3I9XCJ3aGl0ZVwiIHNpemU9XCJsYXJnZVwiIC8+fVxuXHRcdFx0XHRcdFx0e2hhc0Vycm9yICYmIChcblx0XHRcdFx0XHRcdFx0PFZpZXcgc3R5bGU9e3N0eWxlcy5lcnJvckNvbnRhaW5lcn0+XG5cdFx0XHRcdFx0XHRcdFx0PFRleHQgc3R5bGU9e3N0eWxlcy5lcnJvclRleHR9PkZhaWxlZCB0byBsb2FkIGltYWdlPC9UZXh0PlxuXHRcdFx0XHRcdFx0XHQ8L1ZpZXc+XG5cdFx0XHRcdFx0XHQpfVxuXHRcdFx0XHRcdDwvVmlldz5cblx0XHRcdFx0PC9Ub3VjaGFibGVXaXRob3V0RmVlZGJhY2s+XG5cdFx0XHQ8L1ZpZXc+XG5cdFx0KTtcblx0fSxcblx0KHByZXZQcm9wcywgbmV4dFByb3BzKSA9PiB7XG5cdFx0Ly8gT25seSByZS1yZW5kZXIgaWYgdGhlIHNlbGVjdGVkIGluZGV4IGNoYW5nZXMgb3IgdGhlIGltYWdlIFVSTCBjaGFuZ2VzXG5cdFx0cmV0dXJuIChcblx0XHRcdHByZXZQcm9wcy5pc1NlbGVjdGVkID09PSBuZXh0UHJvcHMuaXNTZWxlY3RlZCAmJlxuXHRcdFx0cHJldlByb3BzLml0ZW0udXJsID09PSBuZXh0UHJvcHMuaXRlbS51cmwgJiZcblx0XHRcdHByZXZQcm9wcy5pdGVtLnNvdXJjZSA9PT0gbmV4dFByb3BzLml0ZW0uc291cmNlICYmXG5cdFx0XHRwcmV2UHJvcHMuaW5kZXggPT09IG5leHRQcm9wcy5pbmRleFxuXHRcdCk7XG5cdH1cbik7XG5cbmNvbnN0IHN0eWxlcyA9IFN0eWxlU2hlZXQuY3JlYXRlKHtcblx0aW1hZ2U6IHtcblx0XHRoZWlnaHQ6ICcxMDAlJyxcblx0XHR3aWR0aDogJzEwMCUnXG5cdH0sXG5cdGxvYWRlcjoge1xuXHRcdHBvc2l0aW9uOiAnYWJzb2x1dGUnLFxuXHRcdHRvcDogJzUwJScsXG5cdFx0bGVmdDogJzUwJScsXG5cdFx0dHJhbnNmb3JtOiBbeyB0cmFuc2xhdGVYOiAtMTUgfSwgeyB0cmFuc2xhdGVZOiAtMTUgfV1cblx0fSxcblx0ZXJyb3JDb250YWluZXI6IHtcblx0XHRwb3NpdGlvbjogJ2Fic29sdXRlJyxcblx0XHR0b3A6ICc1MCUnLFxuXHRcdGxlZnQ6ICc1MCUnLFxuXHRcdHRyYW5zZm9ybTogW3sgdHJhbnNsYXRlWDogLTc1IH0sIHsgdHJhbnNsYXRlWTogLTE1IH1dLFxuXHRcdGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMCwgMCwgMCwgMC43KScsXG5cdFx0cGFkZGluZzogMTAsXG5cdFx0Ym9yZGVyUmFkaXVzOiA1XG5cdH0sXG5cdGVycm9yVGV4dDoge1xuXHRcdGNvbG9yOiAnd2hpdGUnLFxuXHRcdGZvbnRTaXplOiAxNlxuXHR9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgSW1hZ2VQcmV2aWV3O1xuIl19