HeaderBackButton.js 2.44 KB
/* @flow */

import * as React from 'react';
import {
	I18nManager,
	Image,
	Text,
	View,
	Platform,
	StyleSheet,
} from 'react-native';

import type { LayoutEvent, TextStyleProp } from '../../TypeDefinition';

import TouchableItem from '../TouchableItem';

type Props = {
	onPress?: () => void,
	pressColorAndroid?: string,
	title?: ?string,
	titleStyle?: ?TextStyleProp,
	tintColor?: ?string,
	truncatedTitle?: ?string,
	width?: ?number,
};

type State = {
	initialTextWidth?: number,
};

class HeaderBackButton extends React.PureComponent<Props, State> {
	static defaultProps = {
		pressColorAndroid: 'rgba(0, 0, 0, .32)',
		tintColor: Platform.select({
			ios: '#037aff',
		}),
		truncatedTitle: 'Back',
	};

	state = {};

	_onTextLayout = (e: LayoutEvent) => {
		if (this.state.initialTextWidth) {
			return;
		}
		this.setState({
			initialTextWidth: e.nativeEvent.layout.x + e.nativeEvent.layout.width,
		});
	};

	render() {
		const {
			onPress,
			pressColorAndroid,
			width,
			title,
			titleStyle,
			tintColor,
			truncatedTitle,
		} = this.props;

		const renderTruncated =
			this.state.initialTextWidth && width
				? this.state.initialTextWidth > width
				: false;

		const backButtonTitle = renderTruncated ? truncatedTitle : title;

		// eslint-disable-next-line global-require
		const asset = require('../assets/back-icon.png');

		return (
			<TouchableItem
				accessibilityComponentType="button"
				accessibilityLabel={backButtonTitle}
				accessibilityTraits="button"
				testID="header-back"
				delayPressIn={0}
				onPress={onPress}
				pressColor={pressColorAndroid}
				style={styles.container}
				borderless
			>
				<View style={styles.container}>
					<Image
						style={[
							styles.icon,

						]}
						source={asset}
					/>
				</View>
			</TouchableItem>
		);
	}
}

const styles = StyleSheet.create({
	container: {
		alignItems: 'center',
		flexDirection: 'row',
		backgroundColor: 'transparent',
	},
	title: {
		fontSize: 17,
		paddingRight: 10,
	},
	icon:
		Platform.OS === 'ios'
			? {
				height: 21,
				width: 13,
				marginLeft: 10,
				marginRight: 22,
				marginVertical: 12,
				resizeMode: 'contain',
				transform: [{ scaleX: I18nManager.isRTL ? -1 : 1 }],
			}
			: {
				height: 21,
				width: 13,
				margin: 16,
			marginLeft:10,
				resizeMode: 'contain',
				transform: [{ scaleX: I18nManager.isRTL ? -1 : 1 }],
			},
	iconWithTitle:
		Platform.OS === 'ios'
			? {
				marginRight: 5,
			}
			: {},
});

export default HeaderBackButton;