UNPKG

react-native-tab-navigator

Version:

A tab bar that switches between scenes, written in JS for cross-platform support

129 lines (117 loc) 2.79 kB
'use strict'; import React from 'react'; import PropTypes from 'prop-types'; import { StyleSheet, Text, TouchableOpacity, TouchableNativeFeedback, Platform, View, } from 'react-native'; import ViewPropTypes from './config/ViewPropTypes'; import Layout from './Layout'; export default class Tab extends React.Component { static propTypes = { testID : PropTypes.string, title: PropTypes.string, titleStyle: Text.propTypes.style, badge: PropTypes.element, onPress: PropTypes.func, hidesTabTouch: PropTypes.bool, allowFontScaling: PropTypes.bool, style: ViewPropTypes.style, }; constructor(props, context) { super(props, context); this._handlePress = this._handlePress.bind(this); } render() { let { title, badge } = this.props; let icon = null; if (React.Children.count(this.props.children) > 0) { icon = React.Children.only(this.props.children); } if (title) { title = <Text numberOfLines={1} allowFontScaling={!!this.props.allowFontScaling} style={[styles.title, this.props.titleStyle]}> {title} </Text>; } if (badge) { badge = React.cloneElement(badge, { style: [styles.badge, badge.props.style], }); } let tabStyle = [ styles.container, title ? null : styles.untitledContainer, this.props.style, ]; if ( !this.props.hidesTabTouch && Platform.OS === 'android' && Platform.Version >= 21 ) { return ( <TouchableNativeFeedback testID={this.props.testID} background={TouchableNativeFeedback.Ripple(undefined, true)} onPress={this._handlePress}> <View style={tabStyle}> <View> {icon} {badge} </View> {title} </View> </TouchableNativeFeedback> ); } return ( <TouchableOpacity testID={this.props.testID} activeOpacity={this.props.hidesTabTouch ? 1.0 : 0.8} onPress={this._handlePress} style={tabStyle}> <View> {icon} {badge} </View> {title} </TouchableOpacity> ); } _handlePress(event) { if (this.props.onPress) { this.props.onPress(event); } } } let styles = StyleSheet.create({ badge: { position: 'absolute', top: -6, right: -10, }, container: { flex: 1, flexDirection: 'column', justifyContent: 'flex-end', alignItems: 'center', }, untitledContainer: { paddingBottom: 13, }, title: { color: '#929292', fontSize: 10, textAlign: 'center', alignSelf: 'stretch', marginTop: 4, marginBottom: 1 + Layout.pixel, }, });