react-native/Libraries/PullToRefresh/PullToRefreshViewAndroid.android.js
Thom Dixon d586daad51 Fix red screen due to ref being undefined in PullRefreshViewAndroid
Summary:This fixes the error
`undefined is not an object (evaluating 'this.refs[NATIVE_REF].setNativeProps')`, which seems to occur when the refresh fails (in our case due to CORS).

![screen shot 2016-03-16 at 12 23 52](https://cloud.githubusercontent.com/assets/461514/13826121/1f8b0aaa-eb73-11e5-81e3-b2c60e536bf0.png)
Closes https://github.com/facebook/react-native/pull/6489

Differential Revision: D3172217

fb-gh-sync-id: 5ba3b2653685888f5358ef32b01b441757eff7c8
fbshipit-source-id: 5ba3b2653685888f5358ef32b01b441757eff7c8
2016-04-19 06:58:22 -07:00

102 lines
3.0 KiB
JavaScript

/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
* @providesModule PullToRefreshViewAndroid
*/
'use strict';
var ColorPropType = require('ColorPropType');
var React = require('React');
var RefreshLayoutConsts = require('UIManager').AndroidSwipeRefreshLayout.Constants;
var View = require('View');
var onlyChild = require('onlyChild');
var requireNativeComponent = require('requireNativeComponent');
var NATIVE_REF = 'native_swiperefreshlayout';
/**
* Deprecated. Use `RefreshControl` instead.
*
* React view that supports a single scrollable child view (e.g. `ScrollView`). When this child
* view is at `scrollY: 0`, swiping down triggers an `onRefresh` event.
*
* The style `{flex: 1}` might be required to ensure the expected behavior of the child component
* (e.g. when the child is expected to scroll with `ScrollView` or `ListView`).
*/
var PullToRefreshViewAndroid = React.createClass({
statics: {
SIZE: RefreshLayoutConsts.SIZE,
},
propTypes: {
...View.propTypes,
/**
* Whether the pull to refresh functionality is enabled
*/
enabled: React.PropTypes.bool,
/**
* The colors (at least one) that will be used to draw the refresh indicator
*/
colors: React.PropTypes.arrayOf(ColorPropType),
/**
* The background color of the refresh indicator
*/
progressBackgroundColor: ColorPropType,
/**
* Whether the view should be indicating an active refresh
*/
refreshing: React.PropTypes.bool,
/**
* Size of the refresh indicator, see PullToRefreshViewAndroid.SIZE
*/
size: React.PropTypes.oneOf(RefreshLayoutConsts.SIZE.DEFAULT, RefreshLayoutConsts.SIZE.LARGE),
},
componentDidMount: function() {
console.warn('`PullToRefreshViewAndroid` is deprecated. Use `RefreshControl` instead.');
},
getInnerViewNode: function() {
return this.refs[NATIVE_REF];
},
setNativeProps: function(props) {
let innerViewNode = this.getInnerViewNode();
return innerViewNode && innerViewNode.setNativeProps(props);
},
render: function() {
return (
<NativePullToRefresh
colors={this.props.colors}
enabled={this.props.enabled}
onRefresh={this._onRefresh}
progressBackgroundColor={this.props.progressBackgroundColor}
ref={NATIVE_REF}
refreshing={this.props.refreshing}
size={this.props.size}
style={this.props.style}>
{onlyChild(this.props.children)}
</NativePullToRefresh>
);
},
_onRefresh: function() {
this.props.onRefresh && this.props.onRefresh();
this.setNativeProps({refreshing: !!this.props.refreshing});
}
});
var NativePullToRefresh = requireNativeComponent(
'AndroidSwipeRefreshLayout',
PullToRefreshViewAndroid
);
module.exports = PullToRefreshViewAndroid;