import * as React from 'react'; import { I18nManager, Image, Text, View, Platform, StyleSheet, LayoutChangeEvent, } from 'react-native'; import TouchableItem from '../TouchableItem'; import defaultBackImage from '../assets/back-icon.png'; import BackButtonWeb from './BackButtonWeb'; import { HeaderBackbuttonProps } from '../../types'; type State = { initialTextWidth?: number; }; class HeaderBackButton extends React.PureComponent< HeaderBackbuttonProps, State > { static defaultProps = { pressColorAndroid: 'rgba(0, 0, 0, .32)', tintColor: Platform.select({ ios: '#037aff', web: '#5f6368', }), truncatedTitle: 'Back', backImage: Platform.select({ web: BackButtonWeb, }), }; state: State = {}; private handleTextLayout = (e: LayoutChangeEvent) => { if (this.state.initialTextWidth) { return; } this.setState({ initialTextWidth: e.nativeEvent.layout.x + e.nativeEvent.layout.width, }); }; private renderBackImage() { const { backImage, backTitleVisible, tintColor } = this.props; let title = this.getTitleText(); if (React.isValidElement(backImage)) { return backImage; } else if (backImage) { const BackImage = backImage; return ; } else { return ( ); } } private getTitleText = () => { const { width, title, truncatedTitle } = this.props; let { initialTextWidth } = this.state; if (title === null) { return null; } else if (!title) { return truncatedTitle; } else if (initialTextWidth && width && initialTextWidth > width) { return truncatedTitle; } else { return title; } }; private maybeRenderTitle() { const { allowFontScaling, backTitleVisible, titleStyle, tintColor, } = this.props; let backTitleText = this.getTitleText(); if (!backTitleVisible || backTitleText === null) { return null; } return ( {this.getTitleText()} ); } render() { const { onPress, pressColorAndroid, title, disabled } = this.props; let button = ( {this.renderBackImage()} {this.maybeRenderTitle()} ); if (Platform.OS === 'ios') { return button; } else { return {button}; } } } const styles = StyleSheet.create({ disabled: { opacity: 0.5, }, androidButtonWrapper: { margin: 13, backgroundColor: 'transparent', ...Platform.select({ web: { marginLeft: 21, }, default: {}, }), }, container: { alignItems: 'center', flexDirection: 'row', backgroundColor: 'transparent', }, title: { fontSize: 17, paddingRight: 10, }, icon: Platform.select({ ios: { backgroundColor: 'transparent', height: 21, width: 13, marginLeft: 9, marginRight: 22, marginVertical: 12, resizeMode: 'contain', transform: [{ scaleX: I18nManager.isRTL ? -1 : 1 }], }, default: { height: 24, width: 24, margin: 3, resizeMode: 'contain', backgroundColor: 'transparent', transform: [{ scaleX: I18nManager.isRTL ? -1 : 1 }], }, }), iconWithTitle: Platform.OS === 'ios' ? { marginRight: 6, } : {}, }); export default HeaderBackButton;