UNPKG

react-native-media-viewing

Version:

React Native modal component for viewing images and video as a sliding gallery

65 lines (64 loc) 2.3 kB
/** * Copyright (c) JOB TODAY S.A. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * */ import { useEffect, useState } from "react"; import { Image } from "react-native"; import { createCache } from "../utils"; const CACHE_SIZE = 50; const imageDimensionsCache = createCache(CACHE_SIZE); const useImageDimensions = (image) => { const [dimensions, setDimensions] = useState(null); const getImageDimensions = (image) => { return new Promise((resolve) => { if (typeof image == "number") { const cacheKey = `${image}`; let imageDimensions = imageDimensionsCache.get(cacheKey); if (!imageDimensions) { const { width, height } = Image.resolveAssetSource(image); imageDimensions = { width, height }; imageDimensionsCache.set(cacheKey, imageDimensions); } resolve(imageDimensions); return; } // @ts-ignore if (image.uri) { const source = image; const cacheKey = source.uri; const imageDimensions = imageDimensionsCache.get(cacheKey); if (imageDimensions) { resolve(imageDimensions); } else { // @ts-ignore Image.getSizeWithHeaders(source.uri, source.headers, (width, height) => { imageDimensionsCache.set(cacheKey, { width, height }); resolve({ width, height }); }, () => { resolve({ width: 0, height: 0 }); }); } } else { resolve({ width: 0, height: 0 }); } }); }; let isImageUnmounted = false; useEffect(() => { getImageDimensions(image).then((dimensions) => { if (!isImageUnmounted) { setDimensions(dimensions); } }); return () => { isImageUnmounted = true; }; }, [image]); return dimensions; }; export default useImageDimensions;