import React from 'react'; import { Text, View, Platform, TouchableOpacity, TextInput } from 'react-native'; import Icon from 'react-native-vector-icons/Ionicons'; import PropTypes from 'prop-types'; import { connect } from 'react-redux'; import Modal from 'react-native-modal'; import FastImage from 'react-native-fast-image'; import { HeaderBackButton } from 'react-navigation'; import Avatar from '../../../containers/Avatar'; import Status from '../../../containers/status'; import RocketChat from '../../../lib/rocketchat'; import { STATUS_COLORS } from '../../../constants/colors'; import { setSearch } from '../../../actions/rooms'; import styles from './styles'; import log from '../../../utils/log'; const title = (offline, connecting, authenticating, logged) => { if (offline) { return 'offline...'; } if (connecting) { return 'Connecting...'; } if (authenticating) { return 'Authenticating...'; } if (logged) { return null; } return 'Not logged...'; }; @connect(state => ({ user: state.login.user, connected: state.meteor.connected, baseUrl: state.settings.Site_Url || state.server ? state.server.server : '', connecting: state.meteor.connecting, authenticating: state.login.isFetching, offline: !state.meteor.connected, logged: !!state.login.token }), dispatch => ({ setSearch: searchText => dispatch(setSearch(searchText)) })) export default class RoomsListHeaderView extends React.PureComponent { static propTypes = { navigation: PropTypes.object.isRequired, user: PropTypes.object.isRequired, connected: PropTypes.bool, baseUrl: PropTypes.string, setSearch: PropTypes.func } constructor(props) { super(props); this.state = { isModalVisible: false, searching: false }; } onPressModalButton(status) { try { RocketChat.setUserPresenceDefaultStatus(status); } catch (e) { log('onPressModalButton', e); } this.hideModal(); } onSearchChangeText(text) { this.props.setSearch(text.trim()); } onPressCancelSearchButton() { this.setState({ searching: false }); this.props.setSearch(''); } onPressSearchButton() { this.setState({ searching: true }); requestAnimationFrame(() => { this.inputSearch.focus(); }); } getUserStatus() { return (this.props.connected && this.props.user.status) || 'offline'; } getUserStatusLabel() { const status = this.getUserStatus(); return status.charAt(0).toUpperCase() + status.slice(1); } showModal() { this.setState({ isModalVisible: true }); } hideModal() { this.setState({ isModalVisible: false }); } createChannel() { this.props.navigation.navigate({ key: 'SelectedUsers', routeName: 'SelectedUsers', params: { nextAction: () => this.props.navigation.navigate('CreateChannel') } }); } renderLeft() { if (this.state.searching) { return null; } return ( this.props.navigation.openDrawer()} > ); } renderCenter() { const { offline, connecting, authenticating, logged, user } = this.props; if (this.state.searching) { return null; } if (!user.username) { return null; } const t = title(offline, connecting, authenticating, logged); const accessibilityLabel = `${ user.username }, ${ this.getUserStatusLabel() }, double tap to change status`; return ( this.showModal()} accessibilityLabel={accessibilityLabel} accessibilityTraits='header'> {this.props.user.username} { t && {t}} ); } renderRight() { if (this.state.searching) { return null; } return ( {Platform.OS === 'android' ? this.onPressSearchButton()} accessibilityLabel='Search' accessibilityTraits='button' > : null} {Platform.OS === 'ios' ? this.createChannel()} accessibilityLabel='Create channel' accessibilityTraits='button' > : null } ); } renderModalButton = (status, text) => { const statusStyle = [styles.status, { marginRight: 10, backgroundColor: STATUS_COLORS[status] }]; const textStyle = { flex: 1, fontWeight: this.props.user.status === status ? 'bold' : 'normal' }; return ( this.onPressModalButton(status)} > {text || status.charAt(0).toUpperCase() + status.slice(1)} ); }; renderSearch() { if (!this.state.searching) { return null; } return ( this.onPressCancelSearchButton()} /> this.inputSearch = inputSearch} underlineColorAndroid='transparent' style={styles.inputSearch} onChangeText={text => this.onSearchChangeText(text)} returnKeyType='search' placeholder='Search' clearButtonMode='while-editing' blurOnSubmit autoCorrect={false} autoCapitalize='none' /> ); } render() { return ( {this.renderLeft()} {this.renderCenter()} {this.renderRight()} {this.renderSearch()} this.hideModal()} onBackdropPress={() => this.hideModal()} > {this.renderModalButton('online')} {this.renderModalButton('busy')} {this.renderModalButton('away')} {this.renderModalButton('offline', 'Invisible')} ); } }