// A single topic or user. import React from 'react'; import { FormattedMessage } from 'react-intl'; import ContactBadges from './contact-badges.jsx'; import LetterTile from './letter-tile.jsx'; import ReceivedMarker from './received-marker.jsx' import UnreadBadge from './unread-badge.jsx'; import { Drafty } from 'tinode-sdk'; import { deliveryMarker } from '../lib/utils.js'; export default class Contact extends React.Component { constructor(props) { super(props); this.handleClick = this.handleClick.bind(this); this.handleContextClick = this.handleContextClick.bind(this); } handleClick(e) { e.preventDefault(); e.stopPropagation(); if (this.props.onSelected) { // Index this.props.index is used by GroupManager. this.props.onSelected(this.props.item, this.props.index); } } handleContextClick(e) { e.preventDefault(); e.stopPropagation(); this.props.showContextMenu({ topicName: this.props.item, y: e.pageY, x: e.pageX }); } render() { let title = this.props.title; if (!title) { title = ; } else if (title.length > 30) { // FIXME: this is probably wrong for RTL languages. title = title.substring(0, 28) + '…'; } const online = this.props.now ? 'online' : 'offline'; const avatar = this.props.avatar ? this.props.avatar : true; const badges = this.props.badges ? this.props.badges.slice() : []; const icon_badges = []; if (this.props.acs) { if (this.props.showMode) { badges.push({name: this.props.acs.getMode(), key: 'mode'}); } if (this.props.acs.isMuted()) { icon_badges.push({icon: 'muted'}); } if (!this.props.acs.isJoiner()) { icon_badges.push({icon: 'banned'}); } } const subtitle = this.props.preview ? (typeof this.props.preview == 'string' ? this.props.preview : React.createElement(React.Fragment, null, Drafty.format(this.props.preview, draftyFormatter, this))) : this.props.comment; const icon = deliveryMarker(this.props.received); const marker = icon ? {icon.name} : null; return (
  • {this.props.showOnline ? : (this.props.showCheckmark && this.props.selected ? check_circle : null)}
    {title} {this.props.isChannel ? channel : null}
    {marker}{subtitle || '\u00A0'}
    {this.props.showContextMenu ? expand_more : null}
  • ); } }; // Converts Drafty object into a one-line preview. function draftyFormatter(style, data, values, key) { let el = Drafty.tagName(style); const attr = { key: key }; if (el) { switch (style) { case 'HL': // Make highlight less prominent in preview. attr.className = 'highlight preview'; break; case 'LN': // Disable links in previews. el = 'span'; break; case 'IM': // Replace image with '[icon] Image'. el = React.Fragment; values = [photo, 'Picture']; break; case 'BN': el = 'span'; attr.className = 'flat-button faux'; break; case 'FM': el = React.Fragment; values = [dashboard, 'Form:']; break; case 'RW': el = React.Fragment; break; case 'EX': el = React.Fragment; values = [attachment, 'Attachment']; break; default: if (el == '_UNKN') { el = React.Fragment; values = [extension]; } break; } return React.createElement(el, attr, values); } else { return values; } };