import React from 'react'; import { View, Text, FlatList, StyleSheet } from 'react-native'; import PropTypes from 'prop-types'; import Modal from 'react-native-modal'; import Touchable from 'react-native-platform-touchable'; import Emoji from './message/Emoji'; import I18n from '../i18n'; import { CustomIcon } from '../lib/Icons'; import sharedStyles from '../views/Styles'; import { themes } from '../constants/colors'; import { withTheme } from '../theme'; import SafeAreaView from './SafeAreaView'; const styles = StyleSheet.create({ safeArea: { backgroundColor: 'transparent' }, titleContainer: { alignItems: 'center', paddingVertical: 10 }, title: { fontSize: 16, ...sharedStyles.textSemibold, ...sharedStyles.textAlignCenter }, reactCount: { fontSize: 13, ...sharedStyles.textRegular }, peopleReacted: { fontSize: 14, ...sharedStyles.textMedium }, peopleItemContainer: { flex: 1, flexDirection: 'column', justifyContent: 'center' }, emojiContainer: { width: 50, height: 50, alignItems: 'center', justifyContent: 'center' }, itemContainer: { height: 50, flexDirection: 'row' }, listContainer: { flex: 1 }, closeButton: { position: 'absolute', left: 0, top: 10 } }); const standardEmojiStyle = { fontSize: 20 }; const customEmojiStyle = { width: 20, height: 20 }; const Item = React.memo(({ item, user, baseUrl, getCustomEmoji, theme }) => { const count = item.usernames.length; let usernames = item.usernames.slice(0, 3) .map(username => (username === user.username ? I18n.t('you') : username)).join(', '); if (count > 3) { usernames = `${ usernames } ${ I18n.t('and_more') } ${ count - 3 }`; } else { usernames = usernames.replace(/,(?=[^,]*$)/, ` ${ I18n.t('and') }`); } return ( {count === 1 ? I18n.t('1_person_reacted') : I18n.t('N_people_reacted', { n: count })} { usernames } ); }); const ModalContent = React.memo(({ message, onClose, ...props }) => { if (message && message.reactions) { return ( {I18n.t('Reactions')} } keyExtractor={item => item.emoji} /> ); } return null; }); const ReactionsModal = React.memo(({ isVisible, onClose, theme, ...props }) => ( ), (prevProps, nextProps) => prevProps.isVisible === nextProps.isVisible && prevProps.theme === nextProps.theme); ReactionsModal.propTypes = { isVisible: PropTypes.bool, onClose: PropTypes.func, theme: PropTypes.string }; ReactionsModal.displayName = 'ReactionsModal'; ModalContent.propTypes = { message: PropTypes.object, onClose: PropTypes.func, theme: PropTypes.string }; ModalContent.displayName = 'ReactionsModalContent'; Item.propTypes = { item: PropTypes.object, user: PropTypes.object, baseUrl: PropTypes.string, getCustomEmoji: PropTypes.func, theme: PropTypes.string }; Item.displayName = 'ReactionsModalItem'; export default withTheme(ReactionsModal);