diff --git a/packages/docs/src/components/Image/Image.stories.mdx b/packages/docs/src/components/Image/Image.stories.mdx
index 63ab1a113..49acbdb55 100644
--- a/packages/docs/src/components/Image/Image.stories.mdx
+++ b/packages/docs/src/components/Image/Image.stories.mdx
@@ -19,6 +19,7 @@ An accessible and responsive image component.
| onLoad | ?Function | false |
| onLoadEnd | ?Function | false |
| onLoadStart | ?Function | false |
+| onProgress | ?Function | false |
| resizeMode | ?ResizeMode | 'cover' |
| source | Source | false |
| style | ?Style | |
@@ -72,6 +73,16 @@ Called when load completes successfully.
+### onProgress
+
+Invoked on download progress.
+
+
+
+
+
+
+
### resizeMode
Determines how to resize the image when the frame doesn't match the raw image dimensions.
@@ -91,7 +102,7 @@ type ResizeMode = 'center' | 'contain' | 'cover' | 'none' | 'repeat' | 'stretch'
The source `uri` is a string representing the resource identifier for the image, which could be an http address or a base64 encoded image.
```js
-type Source = { uri: string, width: number, height: number }
+type Source = { uri: string, width: number, height: number, method?: string, headers?: object }
```
diff --git a/packages/docs/src/components/Image/examples/NetworkImage.js b/packages/docs/src/components/Image/examples/NetworkImage.js
index 07a8dd7fa..4ade8c76b 100644
--- a/packages/docs/src/components/Image/examples/NetworkImage.js
+++ b/packages/docs/src/components/Image/examples/NetworkImage.js
@@ -6,7 +6,8 @@ import { ActivityIndicator, Image, Text, View } from 'react-native';
class NetworkImageExample extends PureComponent {
state = {
error: false,
- loading: false
+ loading: false,
+ messages: []
};
static defaultProps = {
@@ -29,44 +30,94 @@ class NetworkImageExample extends PureComponent {
onLoad={this._handleLoad}
onLoadEnd={this._handleLoadEnd}
onLoadStart={this._handleLoadStart}
+ onProgress={this._handleProgress}
source={this.props.source}
style={helpers.styles.base}
/>
- {this.state.message && {this.state.message}}
+ {this.state.messages.map((message, index) => {
+ return (
+
+ {message}
+
+ );
+ })}
);
}
_handleError = e => {
- const nextState = { loading: false };
- if (this.props.logMethod === 'onError') {
- nextState.message = `✘ onError ${JSON.stringify(e.nativeEvent)}`;
- }
- this.setState(() => nextState);
+ this.setState(state => {
+ const messages = [...state.messages];
+ if (this.props.logMethod === 'onError') {
+ messages.push(`✘ onError ${JSON.stringify(e.nativeEvent)}`);
+ }
+
+ return {
+ loading: false,
+ messages
+ };
+ });
};
_handleLoad = () => {
- const nextState = { loading: false };
- if (this.props.logMethod === 'onLoad') {
- nextState.message = '✔ onLoad';
- }
- this.setState(() => nextState);
+ this.setState(state => {
+ const messages = [...state.messages];
+ if (this.props.logMethod === 'onLoad') {
+ messages.push('✔ onLoad');
+ }
+
+ return {
+ loading: false,
+ messages
+ };
+ });
};
_handleLoadEnd = () => {
- const nextState = { loading: false };
- if (this.props.logMethod === 'onLoadEnd') {
- nextState.message = '✔ onLoadEnd';
- }
- this.setState(() => nextState);
+ this.setState(state => {
+ const messages = [...state.messages];
+ if (this.props.logMethod === 'onLoadEnd') {
+ messages.push('✔ onLoadEnd');
+ }
+
+ return {
+ loading: false,
+ messages
+ };
+ });
};
_handleLoadStart = () => {
- const nextState = { loading: true };
- if (this.props.logMethod === 'onLoadStart') {
- nextState.message = '✔ onLoadStart';
- }
- this.setState(() => nextState);
+ this.setState(state => {
+ const messages = [...state.messages];
+ if (this.props.logMethod === 'onLoadStart') {
+ messages.push('✔ onLoadStart');
+ }
+
+ return {
+ loading: false,
+ messages
+ };
+ });
+ };
+
+ _handleProgress = e => {
+ this.setState(state => {
+ const messages = [...state.messages];
+ if (this.props.logMethod === 'onProgress') {
+ const { loaded, total } = e.nativeEvent;
+ messages.push(
+ `✔ onProgress ${JSON.stringify({
+ loaded,
+ total
+ })}`
+ );
+ }
+
+ return {
+ messages
+ };
+ });
};
}
diff --git a/packages/docs/src/components/Image/examples/OnProgress.js b/packages/docs/src/components/Image/examples/OnProgress.js
new file mode 100644
index 000000000..5aee630c4
--- /dev/null
+++ b/packages/docs/src/components/Image/examples/OnProgress.js
@@ -0,0 +1,8 @@
+import { createUncachedURI } from '../helpers';
+import NetworkImage from './NetworkImage';
+import React from 'react';
+import sources from '../sources';
+
+export default function OnProgress() {
+ return ;
+}
diff --git a/packages/docs/src/components/Image/examples/Source.js b/packages/docs/src/components/Image/examples/Source.js
index e2aafcdd8..18c8f3f36 100644
--- a/packages/docs/src/components/Image/examples/Source.js
+++ b/packages/docs/src/components/Image/examples/Source.js
@@ -33,6 +33,16 @@ export default function Source() {
+
+
+ WebP
+
+
+
+ Dynamic (POST)
+
+
+
);
}
diff --git a/packages/docs/src/components/Image/examples/index.js b/packages/docs/src/components/Image/examples/index.js
index cb632f096..b7c2ba39b 100644
--- a/packages/docs/src/components/Image/examples/index.js
+++ b/packages/docs/src/components/Image/examples/index.js
@@ -4,6 +4,7 @@ export { default as onError } from './OnError';
export { default as onLoad } from './OnLoad';
export { default as onLoadEnd } from './OnLoadEnd';
export { default as onLoadStart } from './OnLoadStart';
+export { default as onProgress } from './OnProgress';
export { default as resizeMode } from './ResizeMode';
export { default as source } from './Source';
export { default as styleBoxShadow } from './StyleBoxShadow';
diff --git a/packages/docs/src/components/Image/sources/index.js b/packages/docs/src/components/Image/sources/index.js
index 189575e29..3d889c0a5 100644
--- a/packages/docs/src/components/Image/sources/index.js
+++ b/packages/docs/src/components/Image/sources/index.js
@@ -42,7 +42,15 @@ const sources = {
},
dataSvg,
dataBase64Png,
- dataBase64Svg
+ dataBase64Svg,
+ webP: {
+ uri: 'https://www.gstatic.com/webp/gallery/4.sm.webp'
+ },
+ dynamic: {
+ uri: 'https://chart.googleapis.com/chart',
+ method: 'POST',
+ body: 'cht=lc&chtt=Test&chs=300x200&chxt=x&chd=t:40,20,50,20,100'
+ }
};
export default sources;
diff --git a/packages/react-native-web/src/exports/Image/__tests__/__snapshots__/index-test.js.snap b/packages/react-native-web/src/exports/Image/__tests__/__snapshots__/index-test.js.snap
index fd8dddd8c..80b64bbc3 100644
--- a/packages/react-native-web/src/exports/Image/__tests__/__snapshots__/index-test.js.snap
+++ b/packages/react-native-web/src/exports/Image/__tests__/__snapshots__/index-test.js.snap
@@ -328,14 +328,14 @@ exports[`components/Image prop "style" removes other unsupported View styles 1`]
>