From 4771b599d9d10a3323016b29f48db59ccb4d39f5 Mon Sep 17 00:00:00 2001 From: Diego Mello Date: Tue, 5 Dec 2017 11:12:03 -0200 Subject: [PATCH] Init custom header --- app/containers/Header.js | 209 +++++++++++++++++++++++++++++++++++++ app/views/RoomsListView.js | 6 +- 2 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 app/containers/Header.js diff --git a/app/containers/Header.js b/app/containers/Header.js new file mode 100644 index 000000000..c57290361 --- /dev/null +++ b/app/containers/Header.js @@ -0,0 +1,209 @@ +import React from 'react'; +import { Text, View, StyleSheet, Platform, SafeAreaView, TouchableOpacity, Dimensions } 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 DrawerMenuButton from '../presentation/DrawerMenuButton'; +import Avatar from './Avatar'; + +const TITLE_OFFSET = Platform.OS === 'ios' ? 70 : 56; + +let platformContainerStyles; +if (Platform.OS === 'ios') { + platformContainerStyles = { + borderBottomWidth: StyleSheet.hairlineWidth, + borderBottomColor: 'rgba(0, 0, 0, .3)' + }; +} else { + platformContainerStyles = { + shadowColor: 'black', + shadowOpacity: 0.1, + shadowRadius: StyleSheet.hairlineWidth, + shadowOffset: { + height: StyleSheet.hairlineWidth + }, + elevation: 4 + }; +} + +const appBarHeight = Platform.OS === 'ios' ? 64 : 56; +const { width } = Dimensions.get('window'); +const styles = StyleSheet.create({ + container: { + backgroundColor: Platform.OS === 'ios' ? '#F7F7F7' : '#FFF', + height: appBarHeight, + ...platformContainerStyles + }, + appBar: { + flex: 1, + marginTop: 20 + }, + header: { + flexDirection: 'row', + alignItems: 'center', + flex: 1 + }, + titleContainer: { + left: TITLE_OFFSET, + right: TITLE_OFFSET, + position: 'absolute', + alignItems: Platform.OS === 'ios' ? 'center' : 'flex-start', + justifyContent: 'center', + flexDirection: 'row' + }, + status: { + backgroundColor: 'red', + borderRadius: 4, + width: 8, + height: 8, + marginRight: 10 + }, + avatar: { + marginRight: 10 + }, + title: { + fontWeight: 'bold' + }, + left: { + left: 0, + position: 'absolute' + }, + right: { + right: 0, + position: 'absolute' + }, + modal: { + width: width - 60, + height: width - 60, + backgroundColor: '#fff', + borderRadius: 4, + flexDirection: 'column' + }, + modalButton: { + flex: 1, + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'center', + backgroundColor: 'transparent', + borderBottomWidth: StyleSheet.hairlineWidth, + borderBottomColor: 'rgba(0, 0, 0, .3)' + } +}); +const statusColors = { + online: 'green', + busy: 'red', + away: 'yellow', + offline: 'gray' +}; + +@connect(state => ({ + user: state.login.user, + Site_Url: state.settings.Site_Url +})) +export default class extends React.PureComponent { + static propTypes = { + navigation: PropTypes.object.isRequired, + user: PropTypes.object.isRequired, + Site_Url: PropTypes.string + } + + constructor(props) { + super(props); + this.state = { + isModalVisible: false + }; + } + + onPressModalButton(status) { + this.hideModal(); + } + + showModal() { + this.setState({ isModalVisible: true }); + } + + hideModal() { + this.setState({ isModalVisible: false }); + } + + createChannel() { + this.props.navigation.navigate('SelectUsers'); + } + + renderTitle() { + if (!this.props.user.username) { + return null; + } + return ( + this.showModal()}> + + + {this.props.user.username} + + ); + } + + renderRight() { + if (Platform.OS !== 'ios') { + return; + } + return ( + + this.createChannel()} + /> + + ); + } + + renderModalButton = (status, text) => ( + this.onPressModalButton(status)}> + + {text || status.charAt(0).toUpperCase() + status.slice(1)} + + ); + + render() { + return ( + + + + + + + {this.renderTitle()} + {this.renderRight()} + + + this.hideModal()} + onBackdropPress={() => this.hideModal()} + > + + {this.renderModalButton('online')} + {this.renderModalButton('busy')} + {this.renderModalButton('away')} + {this.renderModalButton('offline', 'Invisible')} + + + + ); + } +} diff --git a/app/views/RoomsListView.js b/app/views/RoomsListView.js index a9277ec9c..7c5df2006 100644 --- a/app/views/RoomsListView.js +++ b/app/views/RoomsListView.js @@ -12,6 +12,7 @@ import RocketChat from '../lib/rocketchat'; import RoomItem from '../presentation/RoomItem'; import Banner from '../containers/Banner'; import { goRoom } from '../containers/routes/NavigationService'; +import Header from '../containers/Header'; const styles = StyleSheet.create({ container: { @@ -94,7 +95,10 @@ export default class RoomsListView extends React.Component { onPress={params.createChannel} />); - return { headerRight }; + return { + header:
, + headerRight + }; }; constructor(props) {