vn-verdnaturachat/app/presentation/RoomItem.js

150 lines
3.0 KiB
JavaScript
Raw Normal View History

2017-08-09 01:40:55 +00:00
import React from 'react';
2017-11-08 20:23:46 +00:00
import moment from 'moment';
import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons';
2017-08-09 01:40:55 +00:00
import PropTypes from 'prop-types';
import { View, Text, StyleSheet, TouchableOpacity } from 'react-native';
2017-09-01 20:20:34 +00:00
import Avatar from '../containers/Avatar';
2017-08-13 03:19:14 +00:00
import avatarInitialsAndColor from '../utils/avatarInitialsAndColor';
2017-08-09 01:40:55 +00:00
const styles = StyleSheet.create({
2017-08-09 18:01:54 +00:00
container: {
2017-08-17 19:31:27 +00:00
// flex: 1,
2017-08-09 18:01:54 +00:00
flexDirection: 'row',
paddingLeft: 16,
2017-08-17 19:31:27 +00:00
paddingRight: 16,
height: 56,
2017-08-09 18:01:54 +00:00
alignItems: 'center'
},
number: {
2017-08-09 20:08:50 +00:00
minWidth: 20,
borderRadius: 3,
backgroundColor: '#1d74f5',
2017-08-09 18:01:54 +00:00
color: '#fff',
textAlign: 'center',
overflow: 'hidden',
fontSize: 14,
paddingHorizontal: 5,
paddingVertical: 2
2017-08-09 18:01:54 +00:00
},
2017-11-08 20:23:46 +00:00
roomNameView: {
2017-08-17 19:31:27 +00:00
flex: 1,
marginLeft: 16,
marginRight: 4
},
2017-11-08 20:23:46 +00:00
roomName: {
paddingTop: 10,
flex: 1,
fontSize: 16,
height: 16,
color: '#444'
},
alert: {
fontWeight: 'bold'
},
favorite: {
// backgroundColor: '#eee'
},
2017-11-08 20:23:46 +00:00
update: {
flex: 1,
fontSize: 10,
height: 10,
color: '#888'
},
2017-08-13 03:19:14 +00:00
iconContainer: {
height: 40,
width: 40,
2017-11-13 20:51:36 +00:00
borderRadius: 4,
2017-08-13 03:19:14 +00:00
overflow: 'hidden',
justifyContent: 'center',
alignItems: 'center'
},
icon: {
fontSize: 20,
2017-08-13 23:19:27 +00:00
color: '#fff'
2017-08-13 03:19:14 +00:00
},
avatarInitials: {
2017-08-17 19:31:27 +00:00
fontSize: 20,
2017-08-13 03:19:14 +00:00
color: '#ffffff'
2017-08-09 01:40:55 +00:00
}
});
export default class RoomItem extends React.PureComponent {
static propTypes = {
2017-08-17 19:31:27 +00:00
type: PropTypes.string.isRequired,
name: PropTypes.string.isRequired,
2017-11-18 20:17:24 +00:00
_updatedAt: PropTypes.instanceOf(Date),
favorite: PropTypes.bool,
alert: PropTypes.bool,
2017-08-17 19:31:27 +00:00
unread: PropTypes.number,
userMentions: PropTypes.number,
2017-08-22 01:24:41 +00:00
baseUrl: PropTypes.string,
2017-11-08 20:23:46 +00:00
onPress: PropTypes.func,
2017-11-13 12:49:19 +00:00
dateFormat: PropTypes.string
}
2017-08-17 19:31:27 +00:00
get icon() {
2017-08-17 19:31:27 +00:00
const { type, name, baseUrl } = this.props;
const icon = {
d: 'at',
c: 'pound',
p: 'lock',
l: 'account'
2017-08-17 19:31:27 +00:00
}[type];
2017-08-13 03:19:14 +00:00
if (!icon) {
return null;
}
2017-08-13 03:19:14 +00:00
2017-08-17 19:31:27 +00:00
if (type === 'd') {
2017-08-13 03:19:14 +00:00
return (
2017-11-13 20:51:36 +00:00
<Avatar text={name} baseUrl={baseUrl} size={40} />
2017-08-13 03:19:14 +00:00
);
}
const { color } = avatarInitialsAndColor(name);
2017-08-13 03:19:14 +00:00
return (
2017-08-13 23:19:27 +00:00
<View style={[styles.iconContainer, { backgroundColor: color }]}>
<MaterialCommunityIcons name={icon} style={styles.icon} />
2017-08-13 03:19:14 +00:00
</View>
);
2017-08-09 01:40:55 +00:00
}
2017-08-13 03:19:14 +00:00
renderNumber = (unread, userMentions) => {
2017-08-17 19:31:27 +00:00
if (!unread || unread <= 0) {
return;
}
if (unread >= 1000) {
unread = '999+';
2017-08-09 18:01:54 +00:00
}
2017-08-17 19:31:27 +00:00
if (userMentions > 0) {
unread = `@ ${ unread }`;
}
2017-08-17 19:31:27 +00:00
return (
<Text style={styles.number}>
{ unread }
</Text>
);
2017-08-09 18:01:54 +00:00
}
2017-08-09 01:40:55 +00:00
render() {
const {
favorite, alert, unread, userMentions, name, _updatedAt
} = this.props;
2017-11-13 12:49:19 +00:00
2017-08-09 01:40:55 +00:00
return (
<TouchableOpacity onPress={this.props.onPress} style={[styles.container, favorite && styles.favorite]}>
{this.icon}
2017-11-08 20:23:46 +00:00
<View style={styles.roomNameView}>
<Text style={[styles.roomName, alert && styles.alert]} ellipsizeMode='tail' numberOfLines={1}>{ name }</Text>
2017-11-19 03:41:58 +00:00
{_updatedAt ? <Text style={styles.update} ellipsizeMode='tail' numberOfLines={1}>{ moment(_updatedAt).format(this.props.dateFormat) }</Text> : null}
2017-11-08 20:23:46 +00:00
</View>
{this.renderNumber(unread, userMentions)}
</TouchableOpacity>
2017-08-09 01:40:55 +00:00
);
}
}