render: function() { let ScrollViewClass; let ScrollContentContainerViewClass; if (Platform.OS === 'ios') { ScrollViewClass = RCTScrollView; ScrollContentContainerViewClass = RCTScrollContentView; } else if (Platform.OS === 'android') { if (this.props.horizontal) { ScrollViewClass = AndroidHorizontalScrollView; } else { ScrollViewClass = AndroidScrollView; } ScrollContentContainerViewClass = View; } invariant( ScrollViewClass !== undefined, 'ScrollViewClass must not be undefined' ); invariant( ScrollContentContainerViewClass !== undefined, 'ScrollContentContainerViewClass must not be undefined' ); const contentContainerStyle = [ this.props.horizontal && styles.contentContainerHorizontal, this.props.contentContainerStyle, ]; let style, childLayoutProps; if (__DEV__ && this.props.style) { style = flattenStyle(this.props.style); childLayoutProps = ['alignItems', 'justifyContent'] .filter((prop) => style && style[prop] !== undefined); invariant( childLayoutProps.length === 0, 'ScrollView child layout (' + JSON.stringify(childLayoutProps) + ') must be applied through the contentContainerStyle prop.' ); } let contentSizeChangeProps = {}; if (this.props.onContentSizeChange) { contentSizeChangeProps = { onLayout: this._handleContentOnLayout, }; } const contentContainer = <ScrollContentContainerViewClass {...contentSizeChangeProps} ref={this._setInnerViewRef} style={contentContainerStyle} removeClippedSubviews={this.props.removeClippedSubviews} collapsable={false}> {this.props.children} </ScrollContentContainerViewClass>; const alwaysBounceHorizontal = this.props.alwaysBounceHorizontal !== undefined ? this.props.alwaysBounceHorizontal : this.props.horizontal; const alwaysBounceVertical = this.props.alwaysBounceVertical !== undefined ? this.props.alwaysBounceVertical : !this.props.horizontal; const baseStyle = this.props.horizontal ? styles.baseHorizontal : styles.baseVertical; const props = { ...this.props, alwaysBounceHorizontal, alwaysBounceVertical, style: ([baseStyle, this.props.style]: ?Array<any>), // Override the onContentSizeChange from props, since this event can // bubble up from TextInputs onContentSizeChange: null, onTouchStart: this.scrollResponderHandleTouchStart, onTouchMove: this.scrollResponderHandleTouchMove, onTouchEnd: this.scrollResponderHandleTouchEnd, onScrollBeginDrag: this.scrollResponderHandleScrollBeginDrag, onScrollEndDrag: this.scrollResponderHandleScrollEndDrag, onMomentumScrollBegin: this.scrollResponderHandleMomentumScrollBegin, onMomentumScrollEnd: this.scrollResponderHandleMomentumScrollEnd, onStartShouldSetResponder: this.scrollResponderHandleStartShouldSetResponder, onStartShouldSetResponderCapture: this.scrollResponderHandleStartShouldSetResponderCapture, onScrollShouldSetResponder: this.scrollResponderHandleScrollShouldSetResponder, onScroll: this._handleScroll, onResponderGrant: this.scrollResponderHandleResponderGrant, onResponderTerminationRequest: this.scrollResponderHandleTerminationRequest, onResponderTerminate: this.scrollResponderHandleTerminate, onResponderRelease: this.scrollResponderHandleResponderRelease, onResponderReject: this.scrollResponderHandleResponderReject, sendMomentumEvents: (this.props.onMomentumScrollBegin || this.props.onMomentumScrollEnd) ? true : false, }; const { decelerationRate } = this.props; if (decelerationRate) { props.decelerationRate = processDecelerationRate(decelerationRate); } const refreshControl = this.props.refreshControl; if (refreshControl) { if (Platform.OS === 'ios') { // On iOS the RefreshControl is a child of the ScrollView. return ( <ScrollViewClass {...props} ref={this._setScrollViewRef}> {refreshControl} {contentContainer} </ScrollViewClass> ); } else if (Platform.OS === 'android') { // On Android wrap the ScrollView with a AndroidSwipeRefreshLayout. // Since the ScrollView is wrapped add the style props to the // AndroidSwipeRefreshLayout and use flex: 1 for the ScrollView. // Note: we should only apply props.style on the wrapper // however, the ScrollView still needs the baseStyle to be scrollable return React.cloneElement( refreshControl, {style: props.style}, <ScrollViewClass {...props} style={baseStyle} ref={this._setScrollViewRef}> {contentContainer} </ScrollViewClass> ); } } return ( <ScrollViewClass {...props} ref={this._setScrollViewRef}> {contentContainer} </ScrollViewClass> ); }
render() { let ScrollViewClass; let ScrollContentContainerViewClass; if (Platform.OS === 'android') { if (this.props.horizontal) { ScrollViewClass = AndroidHorizontalScrollView; ScrollContentContainerViewClass = AndroidHorizontalScrollContentView; } else { ScrollViewClass = AndroidScrollView; ScrollContentContainerViewClass = View; } } else { ScrollViewClass = RCTScrollView; ScrollContentContainerViewClass = RCTScrollContentView; } invariant( ScrollViewClass !== undefined, 'ScrollViewClass must not be undefined', ); invariant( ScrollContentContainerViewClass !== undefined, 'ScrollContentContainerViewClass must not be undefined', ); const contentContainerStyle = [ this.props.horizontal && styles.contentContainerHorizontal, this.props.contentContainerStyle, ]; if (__DEV__ && this.props.style) { const style = flattenStyle(this.props.style); const childLayoutProps = ['alignItems', 'justifyContent'].filter( prop => style && style[prop] !== undefined, ); invariant( childLayoutProps.length === 0, 'ScrollView child layout (' + JSON.stringify(childLayoutProps) + ') must be applied through the contentContainerStyle prop.', ); } let contentSizeChangeProps = {}; if (this.props.onContentSizeChange) { contentSizeChangeProps = { onLayout: this._handleContentOnLayout, }; } const {stickyHeaderIndices} = this.props; let children = this.props.children; if (stickyHeaderIndices != null && stickyHeaderIndices.length > 0) { const childArray = React.Children.toArray(this.props.children); children = childArray.map((child, index) => { const indexOfIndex = child ? stickyHeaderIndices.indexOf(index) : -1; if (indexOfIndex > -1) { const key = child.key; const nextIndex = stickyHeaderIndices[indexOfIndex + 1]; return ( <ScrollViewStickyHeader key={key} ref={ref => this._setStickyHeaderRef(key, ref)} nextHeaderLayoutY={this._headerLayoutYs.get( this._getKeyForIndex(nextIndex, childArray), )} onLayout={event => this._onStickyHeaderLayout(index, event, key)} scrollAnimatedValue={this._scrollAnimatedValue} inverted={this.props.invertStickyHeaders} scrollViewHeight={this.state.layoutHeight}> {child} </ScrollViewStickyHeader> ); } else { return child; } }); } const hasStickyHeaders = stickyHeaderIndices && stickyHeaderIndices.length > 0; const contentContainer = ( <ScrollContentContainerViewClass {...contentSizeChangeProps} // $FlowFixMe Invalid prop usage ref={this._setInnerViewRef} style={contentContainerStyle} removeClippedSubviews={ // Subview clipping causes issues with sticky headers on Android and // would be hard to fix properly in a performant way. Platform.OS === 'android' && hasStickyHeaders ? false : this.props.removeClippedSubviews } collapsable={false}> {children} </ScrollContentContainerViewClass> ); const alwaysBounceHorizontal = this.props.alwaysBounceHorizontal !== undefined ? this.props.alwaysBounceHorizontal : this.props.horizontal; const alwaysBounceVertical = this.props.alwaysBounceVertical !== undefined ? this.props.alwaysBounceVertical : !this.props.horizontal; const DEPRECATED_sendUpdatedChildFrames = !!this.props .DEPRECATED_sendUpdatedChildFrames; const baseStyle = this.props.horizontal ? styles.baseHorizontal : styles.baseVertical; const props = { ...this.props, alwaysBounceHorizontal, alwaysBounceVertical, style: ([baseStyle, this.props.style]: ?Array<any>), // Override the onContentSizeChange from props, since this event can // bubble up from TextInputs onContentSizeChange: null, onLayout: this._handleLayout, onMomentumScrollBegin: this._scrollResponder .scrollResponderHandleMomentumScrollBegin, onMomentumScrollEnd: this._scrollResponder .scrollResponderHandleMomentumScrollEnd, onResponderGrant: this._scrollResponder .scrollResponderHandleResponderGrant, onResponderReject: this._scrollResponder .scrollResponderHandleResponderReject, onResponderRelease: this._scrollResponder .scrollResponderHandleResponderRelease, // $FlowFixMe onResponderTerminate: this._scrollResponder .scrollResponderHandleTerminate, onResponderTerminationRequest: this._scrollResponder .scrollResponderHandleTerminationRequest, onScrollBeginDrag: this._scrollResponder .scrollResponderHandleScrollBeginDrag, onScrollEndDrag: this._scrollResponder.scrollResponderHandleScrollEndDrag, onScrollShouldSetResponder: this._scrollResponder .scrollResponderHandleScrollShouldSetResponder, onStartShouldSetResponder: this._scrollResponder .scrollResponderHandleStartShouldSetResponder, onStartShouldSetResponderCapture: this._scrollResponder .scrollResponderHandleStartShouldSetResponderCapture, onTouchEnd: this._scrollResponder.scrollResponderHandleTouchEnd, onTouchMove: this._scrollResponder.scrollResponderHandleTouchMove, onTouchStart: this._scrollResponder.scrollResponderHandleTouchStart, onTouchCancel: this._scrollResponder.scrollResponderHandleTouchCancel, onScroll: this._handleScroll, scrollBarThumbImage: resolveAssetSource(this.props.scrollBarThumbImage), scrollEventThrottle: hasStickyHeaders ? 1 : this.props.scrollEventThrottle, sendMomentumEvents: this.props.onMomentumScrollBegin || this.props.onMomentumScrollEnd ? true : false, DEPRECATED_sendUpdatedChildFrames, // default to true snapToStart: this.props.snapToStart !== false, // default to true snapToEnd: this.props.snapToEnd !== false, // pagingEnabled is overridden by snapToInterval / snapToOffsets pagingEnabled: Platform.select({ // on iOS, pagingEnabled must be set to false to have snapToInterval / snapToOffsets work ios: this.props.pagingEnabled && this.props.snapToInterval == null && this.props.snapToOffsets == null, // on Android, pagingEnabled must be set to true to have snapToInterval / snapToOffsets work android: this.props.pagingEnabled || this.props.snapToInterval != null || this.props.snapToOffsets != null, }), }; const {decelerationRate} = this.props; if (decelerationRate != null) { props.decelerationRate = processDecelerationRate(decelerationRate); } const refreshControl = this.props.refreshControl; if (refreshControl) { if (Platform.OS === 'ios') { // On iOS the RefreshControl is a child of the ScrollView. // tvOS lacks native support for RefreshControl, so don't include it in that case return ( // $FlowFixMe <ScrollViewClass {...props} ref={this._setScrollViewRef}> {Platform.isTV ? null : refreshControl} {contentContainer} </ScrollViewClass> ); } else if (Platform.OS === 'android') { // On Android wrap the ScrollView with a AndroidSwipeRefreshLayout. // Since the ScrollView is wrapped add the style props to the // AndroidSwipeRefreshLayout and use flex: 1 for the ScrollView. // Note: we should only apply props.style on the wrapper // however, the ScrollView still needs the baseStyle to be scrollable return React.cloneElement( refreshControl, {style: props.style}, <ScrollViewClass {...props} style={baseStyle} // $FlowFixMe ref={this._setScrollViewRef}> {contentContainer} </ScrollViewClass>, ); } } return ( // $FlowFixMe <ScrollViewClass {...props} ref={this._setScrollViewRef}> {contentContainer} </ScrollViewClass> ); }
render() { let otherView = null; if (this.state.viewState === WebViewState.LOADING) { otherView = (this.props.renderLoading || defaultRenderLoading)(); } else if (this.state.viewState === WebViewState.ERROR) { const errorEvent = this.state.lastErrorEvent; invariant( errorEvent != null, 'lastErrorEvent expected to be non-null' ); otherView = (this.props.renderError || defaultRenderError)( errorEvent.domain, errorEvent.code, errorEvent.description ); } else if (this.state.viewState !== WebViewState.IDLE) { console.error( 'RCTWebView invalid state encountered: ' + this.state.loading ); } const webViewStyles = [styles.container, styles.webView, this.props.style]; if (this.state.viewState === WebViewState.LOADING || this.state.viewState === WebViewState.ERROR) { // if we're in either LOADING or ERROR states, don't show the webView webViewStyles.push(styles.hidden); } const nativeConfig = this.props.nativeConfig || {}; const viewManager = nativeConfig.viewManager || RCTWebViewManager; const onShouldStartLoadWithRequest = this.props.onShouldStartLoadWithRequest && ((event: Event) => { const shouldStart = this.props.onShouldStartLoadWithRequest && this.props.onShouldStartLoadWithRequest(event.nativeEvent); viewManager.startLoadWithResult(!!shouldStart, event.nativeEvent.lockIdentifier); }); const decelerationRate = processDecelerationRate(this.props.decelerationRate); const source = this.props.source || {}; if (this.props.html) { source.html = this.props.html; } else if (this.props.url) { source.uri = this.props.url; } const messagingEnabled = typeof this.props.onMessage === 'function'; const NativeWebView = nativeConfig.component || RCTWebView; const webView = <NativeWebView ref={RCT_WEBVIEW_REF} key="webViewKey" style={webViewStyles} source={resolveAssetSource(source)} injectedJavaScript={this.props.injectedJavaScript} bounces={this.props.bounces} scrollEnabled={this.props.scrollEnabled} decelerationRate={decelerationRate} contentInset={this.props.contentInset} automaticallyAdjustContentInsets={this.props.automaticallyAdjustContentInsets} onLoadingStart={this._onLoadingStart} onLoadingFinish={this._onLoadingFinish} onLoadingError={this._onLoadingError} messagingEnabled={messagingEnabled} onMessage={this._onMessage} onShouldStartLoadWithRequest={onShouldStartLoadWithRequest} scalesPageToFit={this.props.scalesPageToFit} allowsInlineMediaPlayback={this.props.allowsInlineMediaPlayback} mediaPlaybackRequiresUserAction={this.props.mediaPlaybackRequiresUserAction} dataDetectorTypes={this.props.dataDetectorTypes} {...nativeConfig.props} />; return ( <View style={styles.container}> {webView} {otherView} </View> ); }
render: function() { var contentContainerStyle = [ this.props.horizontal && styles.contentContainerHorizontal, this.props.contentContainerStyle, ]; if (__DEV__ && this.props.style) { var style = flattenStyle(this.props.style); var childLayoutProps = ['alignItems', 'justifyContent'] .filter((prop) => style && style[prop] !== undefined); invariant( childLayoutProps.length === 0, 'ScrollView child layout (' + JSON.stringify(childLayoutProps) + ') must be applied through the contentContainerStyle prop.' ); } var contentSizeChangeProps = {}; if (this.props.onContentSizeChange) { contentSizeChangeProps = { onLayout: this._handleContentOnLayout, }; } var contentContainer = <View {...contentSizeChangeProps} ref={INNERVIEW} style={contentContainerStyle} removeClippedSubviews={this.props.removeClippedSubviews} collapsable={false}> {this.props.children} </View>; var alwaysBounceHorizontal = this.props.alwaysBounceHorizontal !== undefined ? this.props.alwaysBounceHorizontal : this.props.horizontal; var alwaysBounceVertical = this.props.alwaysBounceVertical !== undefined ? this.props.alwaysBounceVertical : !this.props.horizontal; var props = { ...this.props, alwaysBounceHorizontal, alwaysBounceVertical, style: ([styles.base, this.props.style]: ?Array<any>), onTouchStart: this.scrollResponderHandleTouchStart, onTouchMove: this.scrollResponderHandleTouchMove, onTouchEnd: this.scrollResponderHandleTouchEnd, onScrollBeginDrag: this.scrollResponderHandleScrollBeginDrag, onScrollEndDrag: this.scrollResponderHandleScrollEndDrag, onMomentumScrollBegin: this.scrollResponderHandleMomentumScrollBegin, onMomentumScrollEnd: this.scrollResponderHandleMomentumScrollEnd, onStartShouldSetResponder: this.scrollResponderHandleStartShouldSetResponder, onStartShouldSetResponderCapture: this.scrollResponderHandleStartShouldSetResponderCapture, onScrollShouldSetResponder: this.scrollResponderHandleScrollShouldSetResponder, onScroll: this.handleScroll, onResponderGrant: this.scrollResponderHandleResponderGrant, onResponderTerminationRequest: this.scrollResponderHandleTerminationRequest, onResponderTerminate: this.scrollResponderHandleTerminate, onResponderRelease: this.scrollResponderHandleResponderRelease, onResponderReject: this.scrollResponderHandleResponderReject, sendMomentumEvents: (this.props.onMomentumScrollBegin || this.props.onMomentumScrollEnd) ? true : false, }; var onRefreshStart = this.props.onRefreshStart; if (onRefreshStart) { // this is necessary because if we set it on props, even when empty, // it'll trigger the default pull-to-refresh behavior on native. props.onRefreshStart = function() { onRefreshStart && onRefreshStart(this.endRefreshing); }.bind(this); } var { decelerationRate } = this.props; if (decelerationRate) { props.decelerationRate = processDecelerationRate(decelerationRate); } var ScrollViewClass; if (Platform.OS === 'ios') { ScrollViewClass = RCTScrollView; } else if (Platform.OS === 'android') { if (this.props.horizontal) { ScrollViewClass = AndroidHorizontalScrollView; } else { ScrollViewClass = AndroidScrollView; } } invariant( ScrollViewClass !== undefined, 'ScrollViewClass must not be undefined' ); var refreshControl = this.props.refreshControl; if (refreshControl) { if (Platform.OS === 'ios') { // On iOS the RefreshControl is a child of the ScrollView. return ( <ScrollViewClass {...props} ref={SCROLLVIEW}> {refreshControl} {contentContainer} </ScrollViewClass> ); } else if (Platform.OS === 'android') { // On Android wrap the ScrollView with a AndroidSwipeRefreshLayout. // Since the ScrollView is wrapped add the style props to the // AndroidSwipeRefreshLayout and use flex: 1 for the ScrollView. return React.cloneElement( refreshControl, {style: props.style}, <ScrollViewClass {...props} style={styles.base} ref={SCROLLVIEW}> {contentContainer} </ScrollViewClass> ); } } return ( <ScrollViewClass {...props} ref={SCROLLVIEW}> {contentContainer} </ScrollViewClass> ); }
render: function() { let ScrollViewClass; let ScrollContentContainerViewClass; if (Platform.OS === 'ios') { ScrollViewClass = RCTScrollView; ScrollContentContainerViewClass = RCTScrollContentView; } else if (Platform.OS === 'android') { if (this.props.horizontal) { ScrollViewClass = AndroidHorizontalScrollView; } else { ScrollViewClass = AndroidScrollView; } ScrollContentContainerViewClass = View; } invariant( ScrollViewClass !== undefined, 'ScrollViewClass must not be undefined' ); invariant( ScrollContentContainerViewClass !== undefined, 'ScrollContentContainerViewClass must not be undefined' ); const contentContainerStyle = [ this.props.horizontal && styles.contentContainerHorizontal, this.props.contentContainerStyle, ]; let style, childLayoutProps; if (__DEV__ && this.props.style) { style = flattenStyle(this.props.style); childLayoutProps = ['alignItems', 'justifyContent'] .filter((prop) => style && style[prop] !== undefined); invariant( childLayoutProps.length === 0, 'ScrollView child layout (' + JSON.stringify(childLayoutProps) + ') must be applied through the contentContainerStyle prop.' ); } let contentSizeChangeProps = {}; if (this.props.onContentSizeChange) { contentSizeChangeProps = { onLayout: this._handleContentOnLayout, }; } const {stickyHeaderIndices} = this.props; const hasStickyHeaders = stickyHeaderIndices && stickyHeaderIndices.length > 0; const childArray = hasStickyHeaders && React.Children.toArray(this.props.children); const children = hasStickyHeaders ? childArray.map((child, index) => { const indexOfIndex = child ? stickyHeaderIndices.indexOf(index) : -1; if (indexOfIndex > -1) { const key = child.key; const nextIndex = stickyHeaderIndices[indexOfIndex + 1]; return ( <ScrollViewStickyHeader key={key} ref={(ref) => this._setStickyHeaderRef(key, ref)} nextHeaderLayoutY={ this._headerLayoutYs.get(this._getKeyForIndex(nextIndex, childArray)) } onLayout={(event) => this._onStickyHeaderLayout(index, event, key)} scrollAnimatedValue={this._scrollAnimatedValue}> {child} </ScrollViewStickyHeader> ); } else { return child; } }) : this.props.children; const contentContainer = <ScrollContentContainerViewClass {...contentSizeChangeProps} ref={this._setInnerViewRef} style={contentContainerStyle} removeClippedSubviews={this.props.removeClippedSubviews} collapsable={false}> {children} </ScrollContentContainerViewClass>; const alwaysBounceHorizontal = this.props.alwaysBounceHorizontal !== undefined ? this.props.alwaysBounceHorizontal : this.props.horizontal; const alwaysBounceVertical = this.props.alwaysBounceVertical !== undefined ? this.props.alwaysBounceVertical : !this.props.horizontal; const baseStyle = this.props.horizontal ? styles.baseHorizontal : styles.baseVertical; const props = { ...this.props, alwaysBounceHorizontal, alwaysBounceVertical, style: ([baseStyle, this.props.style]: ?Array<any>), // Override the onContentSizeChange from props, since this event can // bubble up from TextInputs onContentSizeChange: null, onMomentumScrollBegin: this.scrollResponderHandleMomentumScrollBegin, onMomentumScrollEnd: this.scrollResponderHandleMomentumScrollEnd, onResponderGrant: this.scrollResponderHandleResponderGrant, onResponderReject: this.scrollResponderHandleResponderReject, onResponderRelease: this.scrollResponderHandleResponderRelease, onResponderTerminate: this.scrollResponderHandleTerminate, onResponderTerminationRequest: this.scrollResponderHandleTerminationRequest, onScroll: this._handleScroll, onScrollBeginDrag: this.scrollResponderHandleScrollBeginDrag, onScrollEndDrag: this.scrollResponderHandleScrollEndDrag, onScrollShouldSetResponder: this.scrollResponderHandleScrollShouldSetResponder, onStartShouldSetResponder: this.scrollResponderHandleStartShouldSetResponder, onStartShouldSetResponderCapture: this.scrollResponderHandleStartShouldSetResponderCapture, onTouchEnd: this.scrollResponderHandleTouchEnd, onTouchMove: this.scrollResponderHandleTouchMove, onTouchStart: this.scrollResponderHandleTouchStart, scrollEventThrottle: hasStickyHeaders ? 1 : this.props.scrollEventThrottle, sendMomentumEvents: (this.props.onMomentumScrollBegin || this.props.onMomentumScrollEnd) ? true : false, }; const { decelerationRate } = this.props; if (decelerationRate) { props.decelerationRate = processDecelerationRate(decelerationRate); } const refreshControl = this.props.refreshControl; if (refreshControl) { if (Platform.OS === 'ios') { // On iOS the RefreshControl is a child of the ScrollView. // tvOS lacks native support for RefreshControl, so don't include it in that case return ( <ScrollViewClass {...props} ref={this._setScrollViewRef}> {Platform.isTVOS ? null : refreshControl} {contentContainer} </ScrollViewClass> ); } else if (Platform.OS === 'android') { // On Android wrap the ScrollView with a AndroidSwipeRefreshLayout. // Since the ScrollView is wrapped add the style props to the // AndroidSwipeRefreshLayout and use flex: 1 for the ScrollView. // Note: we should only apply props.style on the wrapper // however, the ScrollView still needs the baseStyle to be scrollable return React.cloneElement( refreshControl, {style: props.style}, <ScrollViewClass {...props} style={baseStyle} ref={this._setScrollViewRef}> {contentContainer} </ScrollViewClass> ); } } return ( <ScrollViewClass {...props} ref={this._setScrollViewRef}> {contentContainer} </ScrollViewClass> ); }
render: function() { var otherView = null; if (this.state.viewState === WebViewState.LOADING) { otherView = (this.props.renderLoading || defaultRenderLoading)(); } else if (this.state.viewState === WebViewState.ERROR) { var errorEvent = this.state.lastErrorEvent; invariant( errorEvent != null, 'lastErrorEvent expected to be non-null' ); otherView = (this.props.renderError || defaultRenderError)( errorEvent.domain, errorEvent.code, errorEvent.description ); } else if (this.state.viewState !== WebViewState.IDLE) { console.error( 'RCTWebView invalid state encountered: ' + this.state.loading ); } var webViewStyles = [styles.container, styles.webView, this.props.style]; if (this.state.viewState === WebViewState.LOADING || this.state.viewState === WebViewState.ERROR) { // if we're in either LOADING or ERROR states, don't show the webView webViewStyles.push(styles.hidden); } var onShouldStartLoadWithRequest = this.props.onShouldStartLoadWithRequest && ((event: Event) => { var shouldStart = this.props.onShouldStartLoadWithRequest && this.props.onShouldStartLoadWithRequest(event.nativeEvent); RCTWebViewManager.startLoadWithResult(!!shouldStart, event.nativeEvent.lockIdentifier); }); var {javaScriptEnabled, domStorageEnabled} = this.props; if (this.props.javaScriptEnabledAndroid) { console.warn('javaScriptEnabledAndroid is deprecated. Use javaScriptEnabled instead'); javaScriptEnabled = this.props.javaScriptEnabledAndroid; } if (this.props.domStorageEnabledAndroid) { console.warn('domStorageEnabledAndroid is deprecated. Use domStorageEnabled instead'); domStorageEnabled = this.props.domStorageEnabledAndroid; } var decelerationRate = processDecelerationRate(this.props.decelerationRate); var source = this.props.source || {}; if (this.props.html) { source.html = this.props.html; } else if (this.props.url) { source.uri = this.props.url; } var webView = <RCTWebView ref={RCT_WEBVIEW_REF} key="webViewKey" style={webViewStyles} source={resolveAssetSource(source)} injectedJavaScript={this.props.injectedJavaScript} bounces={this.props.bounces} scrollEnabled={this.props.scrollEnabled} decelerationRate={decelerationRate} contentInset={this.props.contentInset} automaticallyAdjustContentInsets={this.props.automaticallyAdjustContentInsets} onLoadingStart={this.onLoadingStart} onLoadingFinish={this.onLoadingFinish} onLoadingError={this.onLoadingError} onShouldStartLoadWithRequest={onShouldStartLoadWithRequest} scalesPageToFit={this.props.scalesPageToFit} allowsInlineMediaPlayback={this.props.allowsInlineMediaPlayback} />; return ( <View style={styles.container}> {webView} {otherView} </View> ); },
render:function render(){ var contentContainerStyle=[ this.props.horizontal&&styles.contentContainerHorizontal, this.props.contentContainerStyle]; var style=void 0,childLayoutProps=void 0; if(__DEV__&&this.props.style){ style=flattenStyle(this.props.style); childLayoutProps=['alignItems','justifyContent']. filter(function(prop){return style&&style[prop]!==undefined;}); invariant( childLayoutProps.length===0, 'ScrollView child layout ('+JSON.stringify(childLayoutProps)+ ') must be applied through the contentContainerStyle prop.'); } var contentSizeChangeProps={}; if(this.props.onContentSizeChange){ contentSizeChangeProps={ onLayout:this._handleContentOnLayout}; } var contentContainer= React.createElement(View,babelHelpers.extends({}, contentSizeChangeProps,{ ref:this._setInnerViewRef, style:contentContainerStyle, removeClippedSubviews:this.props.removeClippedSubviews, collapsable:false}), this.props.children); var alwaysBounceHorizontal= this.props.alwaysBounceHorizontal!==undefined? this.props.alwaysBounceHorizontal: this.props.horizontal; var alwaysBounceVertical= this.props.alwaysBounceVertical!==undefined? this.props.alwaysBounceVertical: !this.props.horizontal; var baseStyle=this.props.horizontal?styles.baseHorizontal:styles.baseVertical; var props=babelHelpers.extends({}, this.props,{ alwaysBounceHorizontal:alwaysBounceHorizontal, alwaysBounceVertical:alwaysBounceVertical, style:[baseStyle,this.props.style], onContentSizeChange:null, onTouchStart:this.scrollResponderHandleTouchStart, onTouchMove:this.scrollResponderHandleTouchMove, onTouchEnd:this.scrollResponderHandleTouchEnd, onScrollBeginDrag:this.scrollResponderHandleScrollBeginDrag, onScrollEndDrag:this.scrollResponderHandleScrollEndDrag, onMomentumScrollBegin:this.scrollResponderHandleMomentumScrollBegin, onMomentumScrollEnd:this.scrollResponderHandleMomentumScrollEnd, onStartShouldSetResponder:this.scrollResponderHandleStartShouldSetResponder, onStartShouldSetResponderCapture:this.scrollResponderHandleStartShouldSetResponderCapture, onScrollShouldSetResponder:this.scrollResponderHandleScrollShouldSetResponder, onScroll:this._handleScroll, onResponderGrant:this.scrollResponderHandleResponderGrant, onResponderTerminationRequest:this.scrollResponderHandleTerminationRequest, onResponderTerminate:this.scrollResponderHandleTerminate, onResponderRelease:this.scrollResponderHandleResponderRelease, onResponderReject:this.scrollResponderHandleResponderReject, sendMomentumEvents:this.props.onMomentumScrollBegin||this.props.onMomentumScrollEnd?true:false});var decelerationRate=this.props.decelerationRate; if(decelerationRate){ props.decelerationRate=processDecelerationRate(decelerationRate); } var ScrollViewClass=void 0; if(Platform.OS==='ios'){ ScrollViewClass=RCTScrollView; }else if(Platform.OS==='android'){ if(this.props.horizontal){ ScrollViewClass=AndroidHorizontalScrollView; }else{ ScrollViewClass=AndroidScrollView; } } invariant( ScrollViewClass!==undefined, 'ScrollViewClass must not be undefined'); var refreshControl=this.props.refreshControl; if(refreshControl){ if(Platform.OS==='ios'){ return( React.createElement(ScrollViewClass,babelHelpers.extends({},props,{ref:this._setScrollViewRef}), refreshControl, contentContainer)); }else if(Platform.OS==='android'){ return React.cloneElement( refreshControl, {style:props.style}, React.createElement(ScrollViewClass,babelHelpers.extends({},props,{style:baseStyle,ref:this._setScrollViewRef}), contentContainer)); } } return( React.createElement(ScrollViewClass,babelHelpers.extends({},props,{ref:this._setScrollViewRef}), contentContainer)); }});