UNPKG

react-native-fast-image

Version:

🚩 FastImage, performant React Native image component.

108 lines (99 loc) • 2.98 kB
import _extends from '@babel/runtime/helpers/extends'; import React, { forwardRef, memo } from 'react'; import { NativeModules, StyleSheet, requireNativeComponent, Image, View } from 'react-native'; const FastImageViewNativeModule = NativeModules.FastImageView; const resizeMode = { contain: 'contain', cover: 'cover', stretch: 'stretch', center: 'center' }; const priority = { low: 'low', normal: 'normal', high: 'high' }; const cacheControl = { // Ignore headers, use uri as cache key, fetch only if not in cache. immutable: 'immutable', // Respect http headers, no aggressive caching. web: 'web', // Only load from cache. cacheOnly: 'cacheOnly' }; function FastImageBase({ source, tintColor, onLoadStart, onProgress, onLoad, onError, onLoadEnd, style, fallback, children, // eslint-disable-next-line no-shadow resizeMode = 'cover', forwardedRef, ...props }) { if (fallback) { const cleanedSource = { ...source }; delete cleanedSource.cache; const resolvedSource = Image.resolveAssetSource(cleanedSource); return /*#__PURE__*/React.createElement(View, { style: [styles.imageContainer, style], ref: forwardedRef }, /*#__PURE__*/React.createElement(Image, _extends({}, props, { style: StyleSheet.absoluteFill, source: resolvedSource, onLoadStart: onLoadStart, onProgress: onProgress, onLoad: onLoad, onError: onError, onLoadEnd: onLoadEnd, resizeMode: resizeMode })), children); } const resolvedSource = Image.resolveAssetSource(source); return /*#__PURE__*/React.createElement(View, { style: [styles.imageContainer, style], ref: forwardedRef }, /*#__PURE__*/React.createElement(FastImageView, _extends({}, props, { tintColor: tintColor, style: StyleSheet.absoluteFill, source: resolvedSource, onFastImageLoadStart: onLoadStart, onFastImageProgress: onProgress, onFastImageLoad: onLoad, onFastImageError: onError, onFastImageLoadEnd: onLoadEnd, resizeMode: resizeMode })), children); } const FastImageMemo = /*#__PURE__*/memo(FastImageBase); const FastImageComponent = /*#__PURE__*/forwardRef((props, ref) => /*#__PURE__*/React.createElement(FastImageMemo, _extends({ forwardedRef: ref }, props))); FastImageComponent.displayName = 'FastImage'; const FastImage = FastImageComponent; FastImage.resizeMode = resizeMode; FastImage.cacheControl = cacheControl; FastImage.priority = priority; FastImage.preload = sources => FastImageViewNativeModule.preload(sources); const styles = StyleSheet.create({ imageContainer: { overflow: 'hidden' } }); // Types of requireNativeComponent are not correct. const FastImageView = requireNativeComponent('FastImageView', FastImage, { nativeOnly: { onFastImageLoadStart: true, onFastImageProgress: true, onFastImageLoad: true, onFastImageError: true, onFastImageLoadEnd: true } }); export default FastImage;