// Copyright (c) 2015 Mattermost, Inc. All Rights Reserved. // See License.txt for license information. import $ from 'jquery'; import * as TextFormatting from 'utils/text_formatting.jsx'; import {intlShape, injectIntl, defineMessages} from 'react-intl'; const holders = defineMessages({ collapse: { id: 'post_attachment.collapse', defaultMessage: '▲ collapse text' }, more: { id: 'post_attachment.more', defaultMessage: '▼ read more' } }); import React from 'react'; class PostAttachment extends React.Component { constructor(props) { super(props); this.getFieldsTable = this.getFieldsTable.bind(this); this.getInitState = this.getInitState.bind(this); this.shouldCollapse = this.shouldCollapse.bind(this); this.toggleCollapseState = this.toggleCollapseState.bind(this); } componentDidMount() { $(this.refs.attachment).on('click', '.attachment-link-more', this.toggleCollapseState); } componentWillUnmount() { $(this.refs.attachment).off('click', '.attachment-link-more', this.toggleCollapseState); } componentWillMount() { this.setState(this.getInitState()); } getInitState() { const shouldCollapse = this.shouldCollapse(); const text = TextFormatting.formatText(this.props.attachment.text || ''); const uncollapsedText = text + (shouldCollapse ? `${this.props.intl.formatMessage(holders.collapse)}` : ''); const collapsedText = shouldCollapse ? this.getCollapsedText() : text; return { shouldCollapse, collapsedText, uncollapsedText, text: shouldCollapse ? collapsedText : uncollapsedText, collapsed: shouldCollapse }; } toggleCollapseState(e) { e.preventDefault(); let state = this.state; state.text = state.collapsed ? state.uncollapsedText : state.collapsedText; state.collapsed = !state.collapsed; this.setState(state); } shouldCollapse() { const text = this.props.attachment.text || ''; return (text.match(/\n/g) || []).length >= 5 || text.length > 700; } getCollapsedText() { let text = this.props.attachment.text || ''; if ((text.match(/\n/g) || []).length >= 5) { text = text.split('\n').splice(0, 5).join('\n'); } else if (text.length > 700) { text = text.substr(0, 700); } return TextFormatting.formatText(text) + `${this.props.intl.formatMessage(holders.more)}`; } getFieldsTable() { const fields = this.props.attachment.fields; if (!fields || !fields.length) { return ''; } let fieldTables = []; let headerCols = []; let bodyCols = []; let rowPos = 0; let lastWasLong = false; let nrTables = 0; fields.forEach((field, i) => { if (rowPos === 2 || !(field.short === true) || lastWasLong) { fieldTables.push( {headerCols} {bodyCols}
); headerCols = []; bodyCols = []; rowPos = 0; nrTables += 1; lastWasLong = false; } headerCols.push( {field.title} ); bodyCols.push( ); rowPos += 1; lastWasLong = !(field.short === true); }); if (headerCols.length > 0) { // Flush last fields fieldTables.push( {headerCols} {bodyCols}
); } return (
{fieldTables}
); } render() { const data = this.props.attachment; let preText; if (data.pretext) { preText = (
); } let author = []; if (data.author_name || data.author_icon) { if (data.author_icon) { author.push( ); } if (data.author_name) { author.push( {data.author_name} ); } } if (data.author_link) { author = ( {author} ); } let title; if (data.title) { if (data.title_link) { title = (

{data.title}

); } else { title = (

{data.title}

); } } let text; if (data.text) { text = (
); } let image; if (data.image_url) { image = ( ); } let thumb; if (data.thumb_url) { thumb = (
); } const fields = this.getFieldsTable(); let useBorderStyle; if (data.color && data.color[0] === '#') { useBorderStyle = {borderLeftColor: data.color}; } return (
{preText}
{author} {title}
{text} {image} {fields}
{thumb}
); } } PostAttachment.propTypes = { intl: intlShape.isRequired, attachment: React.PropTypes.object.isRequired }; export default injectIntl(PostAttachment);