From 88ebdb2a6584293bac38308fece9bc8bed102a71 Mon Sep 17 00:00:00 2001 From: Janic Duplessis Date: Sun, 13 Mar 2016 03:03:22 -0700 Subject: [PATCH] RefreshControl refreshing prop and doc improvements Summary:This makes the `refreshing` prop more 'controlled'. Before forgetting to set the refreshing prop in the onRefresh callback would make the js and native `refreshing` prop get out of sync and make the RefreshControl stop refreshing properly (see #5839). I also added a simple usage example and a note about the refreshing prop in the doc. There was also a small bug in the doc generation code that made the array of color show as [[object Object]] instead of [color] so I fixed that too. ** Test plan** Tested using the UIExplorer example on iOS and Android. Not setting the `refreshing` prop to true in the `onRefresh` function should cause the RefreshControl to stop refreshing immediately and continue working properly after. Closes #5839 Closes https://github.com/facebook/react-native/pull/6434 Differential Revision: D3046279 Pulled By: nicklockwood fb-gh-sync-id: ebda04c659a10f0b9d468473c8d5c659256ca1b5 shipit-source-id: ebda04c659a10f0b9d468473c8d5c659256ca1b5 --- .../RefreshControl/RefreshControl.js | 64 +++++++++++++++++-- website/layout/AutodocsLayout.js | 8 +-- 2 files changed, 64 insertions(+), 8 deletions(-) diff --git a/Libraries/Components/RefreshControl/RefreshControl.js b/Libraries/Components/RefreshControl/RefreshControl.js index ee285a3c7..64e9a76ea 100644 --- a/Libraries/Components/RefreshControl/RefreshControl.js +++ b/Libraries/Components/RefreshControl/RefreshControl.js @@ -11,9 +11,10 @@ */ 'use strict'; -const React = require('React'); -const Platform = require('Platform'); const ColorPropType = require('ColorPropType'); +const NativeMethodsMixin = require('NativeMethodsMixin'); +const Platform = require('Platform'); +const React = require('React'); const View = require('View'); const requireNativeComponent = require('requireNativeComponent'); @@ -25,15 +26,57 @@ if (Platform.OS === 'android') { } /** - * This component is used inside a ScrollView to add pull to refresh + * This component is used inside a ScrollView or ListView to add pull to refresh * functionality. When the ScrollView is at `scrollY: 0`, swiping down * triggers an `onRefresh` event. + * + * ### Usage example + * + * ``` js + * class RefreshableList extends Component { + * constructor(props) { + * super(props); + * this.state = { + * refreshing: false, + * }; + * } + * + * _onRefresh() { + * this.setState({refreshing: true}); + * fetchData().then(() => { + * this.setState({refreshing: false}); + * }); + * } + * + * render() { + * return ( + * + * } + * ... + * > + * ... + * + * ); + * } + * ... + * } + * ``` + * + * __Note:__ `refreshing` is a controlled prop, this is why it needs to be set to true + * in the `onRefresh` function otherwise the refresh indicator will stop immediatly. */ const RefreshControl = React.createClass({ statics: { SIZE: RefreshLayoutConsts.SIZE, }, + mixins: [NativeMethodsMixin], + propTypes: { ...View.propTypes, /** @@ -76,8 +119,21 @@ const RefreshControl = React.createClass({ size: React.PropTypes.oneOf(RefreshLayoutConsts.SIZE.DEFAULT, RefreshLayoutConsts.SIZE.LARGE), }, + _nativeRef: {}, + render() { - return ; + return ( + this._nativeRef = ref} + onRefresh={this._onRefresh} + /> + ); + }, + + _onRefresh() { + this.props.onRefresh && this.props.onRefresh(); + this._nativeRef.setNativeProps({refreshing: this.props.refreshing}); }, }); diff --git a/website/layout/AutodocsLayout.js b/website/layout/AutodocsLayout.js index 269314cb1..e48212e58 100644 --- a/website/layout/AutodocsLayout.js +++ b/website/layout/AutodocsLayout.js @@ -41,12 +41,12 @@ function renderType(type) { return '{' + Object.keys(type.value).map((key => key + ': ' + renderType(type.value[key]))).join(', ') + '}'; } - if (type.name == 'union') { + if (type.name === 'union') { return type.value.map(renderType).join(', '); } if (type.name === 'arrayOf') { - return '[' + renderType(type.value) + ']'; + return [{renderType(type.value)}]; } if (type.name === 'instanceOf') { @@ -56,10 +56,10 @@ function renderType(type) { if (type.name === 'custom') { if (styleReferencePattern.test(type.raw)) { var name = type.raw.substring(0, type.raw.indexOf('.')); - return {name}#style + return {name}#style; } if (type.raw === 'ColorPropType') { - return color + return color; } if (type.raw === 'EdgeInsetsPropType') { return '{top: number, left: number, bottom: number, right: number}';