import PropTypes from 'prop-types' import React from 'react' import { StyleSheet, View, Keyboard, ViewPropTypes, EmitterSubscription, ViewStyle, } from 'react-native' import Composer from './Composer' import Send from './Send' import Actions from './Actions' import Color from './Color' const styles = StyleSheet.create({ container: { borderTopWidth: StyleSheet.hairlineWidth, borderTopColor: Color.defaultColor, backgroundColor: Color.white, bottom: 0, left: 0, right: 0, }, primary: { flexDirection: 'row', alignItems: 'flex-end', }, accessory: { height: 44, }, }) interface InputToolbarProps { options?: { [key: string]: any } optionTintColor?: string containerStyle?: ViewStyle primaryStyle?: ViewStyle accessoryStyle?: ViewStyle renderAccessory?(props: InputToolbarProps): React.ReactNode renderActions?(props: Actions['props']): React.ReactNode renderSend?(props: Send['props']): React.ReactNode renderComposer?(props: Composer['props']): React.ReactNode onPressActionButton?(): void } export default class InputToolbar extends React.Component< InputToolbarProps, { position: string } > { static defaultProps = { renderAccessory: null, renderActions: null, renderSend: null, renderComposer: null, containerStyle: {}, primaryStyle: {}, accessoryStyle: {}, onPressActionButton: () => {}, } static propTypes = { renderAccessory: PropTypes.func, renderActions: PropTypes.func, renderSend: PropTypes.func, renderComposer: PropTypes.func, onPressActionButton: PropTypes.func, containerStyle: ViewPropTypes.style, primaryStyle: ViewPropTypes.style, accessoryStyle: ViewPropTypes.style, } state = { position: 'absolute', } keyboardWillShowListener?: EmitterSubscription = undefined keyboardWillHideListener?: EmitterSubscription = undefined componentWillMount() { this.keyboardWillShowListener = Keyboard.addListener( 'keyboardWillShow', this.keyboardWillShow, ) this.keyboardWillHideListener = Keyboard.addListener( 'keyboardWillHide', this.keyboardWillHide, ) } componentWillUnmount() { if (this.keyboardWillShowListener) { this.keyboardWillShowListener.remove() } if (this.keyboardWillHideListener) { this.keyboardWillHideListener.remove() } } keyboardWillShow = () => { if (this.state.position !== 'relative') { this.setState({ position: 'relative', }) } } keyboardWillHide = () => { if (this.state.position !== 'absolute') { this.setState({ position: 'absolute', }) } } renderActions() { const { containerStyle, ...props } = this.props if (this.props.renderActions) { return this.props.renderActions(props) } else if (this.props.onPressActionButton) { return } return null } renderSend() { if (this.props.renderSend) { return this.props.renderSend(this.props) } return } renderComposer() { if (this.props.renderComposer) { return this.props.renderComposer(this.props) } return } renderAccessory() { if (this.props.renderAccessory) { return ( {this.props.renderAccessory(this.props)} ) } return null } render() { return ( {this.renderActions()} {this.renderComposer()} {this.renderSend()} {this.renderAccessory()} ) } }