1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x | import React from 'react'; import { CachedImage } from 'react-native-img-cache'; import MaterialCommunityIcons from 'react-native-vector-icons/MaterialCommunityIcons'; import PropTypes from 'prop-types'; import { View, Text, StyleSheet } from 'react-native'; import avatarInitialsAndColor from '../utils/avatarInitialsAndColor'; const styles = StyleSheet.create({ container: { // flex: 1, flexDirection: 'row', paddingLeft: 16, paddingRight: 16, height: 56, alignItems: 'center' }, number: { minWidth: 20, borderRadius: 5, backgroundColor: '#1d74f5', color: '#fff', textAlign: 'center', overflow: 'hidden', fontSize: 14, paddingLeft: 5, paddingRight: 5 }, roomName: { flex: 1, fontSize: 16, color: '#444', marginLeft: 16, marginRight: 4 }, iconContainer: { height: 40, width: 40, borderRadius: 20, overflow: 'hidden', justifyContent: 'center', alignItems: 'center' }, icon: { fontSize: 20, color: '#fff' }, avatar: { width: 40, height: 40, position: 'absolute', borderRadius: 20 }, avatarInitials: { fontSize: 20, color: '#ffffff' } }); export default class RoomItem extends React.PureComponent { static propTypes = { type: PropTypes.string.isRequired, name: PropTypes.string.isRequired, unread: PropTypes.number, baseUrl: PropTypes.string } get icon() { const { type, name, baseUrl } = this.props; const icon = { d: 'at', c: 'pound', p: 'lock', l: 'account' }[type]; Iif (!icon) { return null; } Eif (type === 'd') { const { initials, color } = avatarInitialsAndColor(name); return ( <View style={[styles.iconContainer, { backgroundColor: color }]}> <Text style={styles.avatarInitials}>{initials}</Text> <CachedImage style={styles.avatar} source={{ uri: `${ baseUrl }/avatar/${ name }` }} /> </View> ); } const { color } = avatarInitialsAndColor(name); return ( <View style={[styles.iconContainer, { backgroundColor: color }]}> <MaterialCommunityIcons name={icon} style={styles.icon} /> </View> ); } renderNumber = (unread) => { Eif (!unread || unread <= 0) { return; } if (unread >= 1000) { unread = '999+'; } return ( <Text style={styles.number}> { unread } </Text> ); } render() { const { unread, name } = this.props; return ( <View style={styles.container}> {this.icon} <Text style={styles.roomName} ellipsizeMode='tail' numberOfLines={1}>{ name }</Text> {this.renderNumber(unread)} </View> ); } } |