# react-native-img-cache
**Repository Path**: ryanwu/react-native-img-cache
## Basic Information
- **Project Name**: react-native-img-cache
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-03-10
- **Last Updated**: 2021-03-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
clone from https://github.com/wcandillon/react-native-img-cache for RN0.60+
# React Native Image Cache
[](https://circleci.com/gh/wcandillon/react-native-img-cache)
[](https://badge.fury.io/js/react-native-img-cache)
CachedImage component and Cache image manager for React Native.
## Deprecated
**I am no longer maintaining this library but [react-native-expo-image-cache](https://github.com/wcandillon/react-native-expo-image-cache) which depends on ExpoKit.**
**Checkout [5 things to know about Images in React Native](https://medium.com/@wcandillon/5-things-to-know-about-images-react-native-69be41d2a9ee)**
## Why do I need this?
Starting version `0.43`, the React Native [Image component](https://facebook.github.io/react-native/docs/image.html) has now a cache property: `cache: force-cache` (iOS only). This is a major improvement but only for iOS and at this time, I wasn't able to use it in a way that provides a user experience as smooth as this module.
## Installation
### rn-fetch-blob
This package has a dependency with [rn-fetch-blob](https://github.com/joltup/rn-fetch-blob).
If your project doesn't have a dependency with this package already, please refer to [their installation instructions](https://github.com/joltup/rn-fetch-blob#user-content-installation).
```bash
npm install react-native-img-cache --save
```
## Usage
### CachedImage
The `CachedImage` component assumes that the image URI will never change. The image is stored and served from the application cache. This component accepts the same properties than `Image` except for a few difference:
* `source` doesn't accept an array of image URIs like `Image` does. Please file an issue if that's something you would like to see supported.
* The `uri` property in `source` is mandatory.
* The `body` property in `source` is not supported. Please file an issue if that's something you would like to see supported.
```jsx
import {CachedImage} from "react-native-img-cache";
```
The `mutable` property implies assumes that the image URI can change over time. The lifetime of this cache is the one of the running application and it can be manually busted using `ImageCache`.
```jsx
import {CachedImage} from "react-native-img-cache";
```
### Custom Image Component
By default, the `CachedImage` component is using the [standard RN Image component](https://facebook.github.io/react-native/docs/image.html).
It is possible however to use a different component via `CustomCachedImage`. In the example below, we use the `Image` component from [react-native-image-progress](https://github.com/oblador/react-native-image-progress).
```jsx
import {CustomCachedImage} from "react-native-img-cache";
import Image from 'react-native-image-progress';
import ProgressBar from 'react-native-progress/Bar';
```
### ImageCache
#### clear()
Remove cache entries and all physical files.
```js
ImageCache.get().clear();
```
#### bust(uri)
`ImageCache` can be used to bust an image from the local cache.
This removes the cache entry but it **does not remove any physical files**.
```js
ImageCache.get().bust("https://i.ytimg.com/vi/yaqe1qesQ8c/maxresdefault.jpg");
```
#### cancel(uri)
It can also be used to cancel the download of an image. This can be very useful when [scrolling through images](https://medium.com/@wcandillon/image-pipeline-with-react-native-listview-b92d4768b17c).
```js
ImageCache.get().cancel("https://i.ytimg.com/vi/yaqe1qesQ8c/maxresdefault.jpg");
```
#### on(uri, observer, immutable)
The `ImageCache` class can register observers to the cache.
```js
const immutable = true;
const observer = (path: string) => {
console.log(`path of the image in the cache: ${path}`);
};
ImageCache.get().on(uri, observer, immutable);
```
We use the observer pattern instead of a promise because a mutable image might have different version with different paths in the cache.
#### dispose(uri, observer)
Observers can be deregistered using `dispose`:
```js
ImageCache.get().dispose(uri, observer);
```
## Testing with jest
### Mocking CachedImage
With jest, testing a snapshot can generate errors. Jest doesn't know how to generate the component CachedImage. For fix this, you have to mock CachedImage with Image component.
```js
jest.mock('react-native-img-cache', () => {
const mockComponent = require('react-native/jest/mockComponent')
return {
CustomCachedImage: mockComponent('Image'),
CachedImage: mockComponent('Image'),
}
})
```