@james18/react-native-keyboard-accessory
Version:
A React Native Keyboard Accessory (View, Navigation) Component. Sticky views on keyboard.
215 lines (202 loc) • 5.99 kB
JavaScript
import React, { Component } from 'react';
import PropTypes from 'prop-types';
import {
StyleSheet,
View,
Text,
TouchableOpacity,
Keyboard,
} from 'react-native';
import KeyboardAccessoryView from './KeyboardAccessoryView';
import AccessoryArrowButton from './components/AccessoryArrowButton';
class KeyboardAccessoryNavigation extends Component {
handleDoneButton = () => {
this.props.onDone && this.props.onDone();
Keyboard.dismiss();
}
render() {
const {
nextButton,
previousButton,
doneButton,
doneButtonTitle,
infoContainer,
infoMessage,
tintColor,
onNext,
onPrevious,
nextDisabled,
previousDisabled,
nextHidden,
previousHidden,
accessoryStyle,
nextButtonStyle,
previousButtonStyle,
doneButtonStyle,
doneButtonTitleStyle,
doneButtonHitslop,
infoMessageStyle,
nextButtonDirection,
nextButtonHitslop,
previousButtonDirection,
previousButtonHitslop,
...passThroughProps
} = this.props;
// Are both arrows hidden?
const arrowsHidden = nextHidden && previousHidden;
// Is there an info message/container?
const noInfo = !infoMessage && !infoContainer;
const accessoryContainerStyle = [
styles.accessoryContainer,
arrowsHidden && noInfo ? styles.accessoryContainerReverse : null,
accessoryStyle,
];
return (
<KeyboardAccessoryView { ...passThroughProps }>
<View style={accessoryContainerStyle}>
{ !arrowsHidden && (
<View style={styles.leftContainer}>
<AccessoryArrowButton
style={[styles.previousButton, previousButtonStyle]}
hidden={previousHidden}
disabled={previousDisabled}
direction={previousButtonDirection}
hitSlop={previousButtonHitslop}
customButton={previousButton}
tintColor={tintColor}
onPress={onPrevious}
/>
<AccessoryArrowButton
style={nextButtonStyle}
hidden={nextHidden}
disabled={nextDisabled}
direction={nextButtonDirection}
hitSlop={nextButtonHitslop}
customButton={nextButton}
tintColor={tintColor}
onPress={onNext}
/>
</View>
)}
{ (infoMessage || infoContainer) && (
<View style={styles.infoContainer}>
{infoContainer || (
<Text style={[infoMessageStyle, {
color: tintColor,
}]}>
{infoMessage}
</Text>
)}
</View>
)}
<TouchableOpacity
style={[styles.doneButton, doneButtonStyle]}
onPress={this.handleDoneButton}
hitSlop={doneButtonHitslop}>
{ doneButton ||
<Text style={[
styles.doneButtonText,
doneButtonTitleStyle,
{
color: tintColor,
}
]}>
{doneButtonTitle}
</Text>
}
</TouchableOpacity>
</View>
</KeyboardAccessoryView>
);
}
}
KeyboardAccessoryNavigation.propTypes = {
...KeyboardAccessoryView.propTypes,
doneButtonTitle: PropTypes.string,
infoMessage: PropTypes.string,
doneButton: PropTypes.element,
nextButton: PropTypes.element,
previousButton: PropTypes.element,
infoContainer: PropTypes.element,
onNext: PropTypes.func,
onPrevious: PropTypes.func,
onDone: PropTypes.func,
nextDisabled: PropTypes.bool,
previousDisabled: PropTypes.bool,
doneDisabled: PropTypes.bool,
nextHidden: PropTypes.bool,
previousHidden: PropTypes.bool,
tintColor: PropTypes.string,
accessoryStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
previousButtonStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
nextButtonStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
doneButtonStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
doneButtonTitleStyle: PropTypes.oneOfType([
PropTypes.object,
PropTypes.array,
]),
doneButtonHitslop: PropTypes.oneOfType([
PropTypes.number,
PropTypes.shape({
left: PropTypes.number,
top: PropTypes.number,
right: PropTypes.number,
bottom: PropTypes.number,
}),
]),
infoMessageStyle: PropTypes.oneOfType([PropTypes.object, PropTypes.array]),
nextButtonDirection: PropTypes.oneOf(["up", "down", "left", "right"]),
nextButtonHitslop: PropTypes.oneOfType([
PropTypes.number,
PropTypes.shape({
left: PropTypes.number,
top: PropTypes.number,
right: PropTypes.number,
bottom: PropTypes.number,
}),
]),
previousButtonDirection: PropTypes.oneOf(["up", "down", "left", "right"]),
previousButtonHitslop: PropTypes.oneOfType([
PropTypes.number,
PropTypes.shape({
left: PropTypes.number,
top: PropTypes.number,
right: PropTypes.number,
bottom: PropTypes.number,
}),
]),
};
KeyboardAccessoryNavigation.defaultProps = {
doneButtonTitle: 'Done',
tintColor: '#007AFF',
nextDisabled: false,
previousDisabled: false,
nextHidden: false,
previousHidden: false,
nextButtonDirection: 'down',
previousButtonDirection: 'up',
}
const styles = StyleSheet.create({
accessoryContainer: {
height: 45,
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'space-between',
paddingLeft: 15,
paddingRight: 15,
},
accessoryContainerReverse: {
flexDirection: 'row-reverse',
},
leftContainer: {
flexDirection: 'row',
alignItems: 'center',
},
previousButton: {
marginRight: 16,
},
doneButtonText: {
fontWeight: 'bold'
},
})
export default KeyboardAccessoryNavigation;