Removed all calls to textToJsx and replaced them with calls to TextFormatting

Этот коммит содержится в:
hmhealey
2015-09-14 11:48:07 -04:00
родитель 3e3b52554a
Коммит 15aa853da5
7 изменённых файлов: 39 добавлений и 28 удалений

Просмотреть файл

@@ -8,6 +8,7 @@ const SocketStore = require('../stores/socket_store.jsx');
const NavbarSearchBox = require('./search_bar.jsx'); const NavbarSearchBox = require('./search_bar.jsx');
const AsyncClient = require('../utils/async_client.jsx'); const AsyncClient = require('../utils/async_client.jsx');
const Client = require('../utils/client.jsx'); const Client = require('../utils/client.jsx');
const TextFormatting = require('../utils/text_formatting.jsx');
const Utils = require('../utils/utils.jsx'); const Utils = require('../utils/utils.jsx');
const MessageWrapper = require('./message_wrapper.jsx'); const MessageWrapper = require('./message_wrapper.jsx');
const PopoverListMembers = require('./popover_list_members.jsx'); const PopoverListMembers = require('./popover_list_members.jsx');
@@ -107,7 +108,6 @@ export default class ChannelHeader extends React.Component {
} }
const channel = this.state.channel; const channel = this.state.channel;
const description = Utils.textToJsx(channel.description, {singleline: true, noMentionHighlight: true});
const popoverContent = React.renderToString(<MessageWrapper message={channel.description}/>); const popoverContent = React.renderToString(<MessageWrapper message={channel.description}/>);
let channelTitle = channel.display_name; let channelTitle = channel.display_name;
const currentId = UserStore.getCurrentId(); const currentId = UserStore.getCurrentId();
@@ -326,9 +326,9 @@ export default class ChannelHeader extends React.Component {
data-toggle='popover' data-toggle='popover'
data-content={popoverContent} data-content={popoverContent}
className='description' className='description'
> onClick={TextFormatting.handleClick}
{description} dangerouslySetInnerHTML={{__html: TextFormatting.formatText(channel.description, {singleline: true, mentionHighlight: false})}}
</div> />
</div> </div>
</th> </th>
<th> <th>

Просмотреть файл

@@ -1,7 +1,7 @@
// Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. // Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved.
// See License.txt for license information. // See License.txt for license information.
var Utils = require('../utils/utils.jsx'); var TextFormatting = require('../utils/text_formatting.jsx');
export default class MessageWrapper extends React.Component { export default class MessageWrapper extends React.Component {
constructor(props) { constructor(props) {
@@ -10,10 +10,7 @@ export default class MessageWrapper extends React.Component {
} }
render() { render() {
if (this.props.message) { if (this.props.message) {
var inner = Utils.textToJsx(this.props.message, this.props.options); return <div dangerouslySetInnerHTML={{__html: TextFormatting.formatText(this.props.message, this.props.options)}}/>;
return (
<div>{inner}</div>
);
} }
return <div/>; return <div/>;
@@ -21,8 +18,7 @@ export default class MessageWrapper extends React.Component {
} }
MessageWrapper.defaultProps = { MessageWrapper.defaultProps = {
message: null, message: ''
options: null
}; };
MessageWrapper.propTypes = { MessageWrapper.propTypes = {
message: React.PropTypes.string, message: React.PropTypes.string,

Просмотреть файл

@@ -332,7 +332,7 @@ export default class Navbar extends React.Component {
popoverContent = React.renderToString( popoverContent = React.renderToString(
<MessageWrapper <MessageWrapper
message={channel.description} message={channel.description}
options={{singleline: true, noMentionHighlight: true}} options={{singleline: true, mentionHighlight: false}}
/> />
); );
isAdmin = this.state.member.roles.indexOf('admin') > -1; isAdmin = this.state.member.roles.indexOf('admin') > -1;

Просмотреть файл

@@ -13,7 +13,6 @@ export default class PostBody extends React.Component {
super(props); super(props);
this.parseEmojis = this.parseEmojis.bind(this); this.parseEmojis = this.parseEmojis.bind(this);
this.handleClick = this.handleClick.bind(this);
const linkData = Utils.extractLinks(this.props.post.message); const linkData = Utils.extractLinks(this.props.post.message);
this.state = {links: linkData.links, message: linkData.text}; this.state = {links: linkData.links, message: linkData.text};
@@ -31,17 +30,10 @@ export default class PostBody extends React.Component {
const linkData = Utils.extractLinks(nextProps.post.message); const linkData = Utils.extractLinks(nextProps.post.message);
this.setState({links: linkData.links, message: linkData.text}); this.setState({links: linkData.links, message: linkData.text});
} }
handleClick(e) {
let mentionAttribute = e.target.getAttributeNode('data-mention');
if (mentionAttribute) {
Utils.searchForTerm(mentionAttribute.value);
}
}
render() { render() {
const post = this.props.post; const post = this.props.post;
const filenames = this.props.post.filenames; const filenames = this.props.post.filenames;
const parentPost = this.props.parentPost; const parentPost = this.props.parentPost;
const inner = Utils.textToJsx(this.state.message);
let comment = ''; let comment = '';
let postClass = ''; let postClass = '';
@@ -143,7 +135,11 @@ export default class PostBody extends React.Component {
key={`${post.id}_message`} key={`${post.id}_message`}
className={postClass} className={postClass}
> >
{loading}<span onClick={this.handleClick} dangerouslySetInnerHTML={{__html: TextFormatting.formatText(this.state.message)}}/> {loading}
<span
onClick={TextFormatting.handleClick}
dangerouslySetInnerHTML={{__html: TextFormatting.formatText(this.state.message)}}
/>
</p> </p>
{fileAttachmentHolder} {fileAttachmentHolder}
{embed} {embed}

Просмотреть файл

@@ -12,6 +12,7 @@ var FileAttachmentList = require('./file_attachment_list.jsx');
var Client = require('../utils/client.jsx'); var Client = require('../utils/client.jsx');
var AsyncClient = require('../utils/async_client.jsx'); var AsyncClient = require('../utils/async_client.jsx');
var ActionTypes = Constants.ActionTypes; var ActionTypes = Constants.ActionTypes;
var TextFormatting = require('../utils/text_formatting.jsx');
var twemoji = require('twemoji'); var twemoji = require('twemoji');
export default class RhsComment extends React.Component { export default class RhsComment extends React.Component {
@@ -84,7 +85,6 @@ export default class RhsComment extends React.Component {
type = 'Comment'; type = 'Comment';
} }
var message = Utils.textToJsx(post.message);
var timestamp = UserStore.getCurrentUser().update_at; var timestamp = UserStore.getCurrentUser().update_at;
var loading; var loading;
@@ -202,7 +202,13 @@ export default class RhsComment extends React.Component {
</li> </li>
</ul> </ul>
<div className='post-body'> <div className='post-body'>
<p className={postClass}>{loading}{message}</p> <p className={postClass}>
{loading}
<span
onClick={TextFormatting.handleClick}
dangerouslySetInnerHTML={{__html: TextFormatting.formatText(post.message)}}
/>
</p>
{fileAttachment} {fileAttachment}
</div> </div>
</div> </div>

Просмотреть файл

@@ -4,6 +4,7 @@
var ChannelStore = require('../stores/channel_store.jsx'); var ChannelStore = require('../stores/channel_store.jsx');
var UserProfile = require('./user_profile.jsx'); var UserProfile = require('./user_profile.jsx');
var UserStore = require('../stores/user_store.jsx'); var UserStore = require('../stores/user_store.jsx');
var TextFormatting = require('../utils/text_formatting.jsx');
var utils = require('../utils/utils.jsx'); var utils = require('../utils/utils.jsx');
var FileAttachmentList = require('./file_attachment_list.jsx'); var FileAttachmentList = require('./file_attachment_list.jsx');
var twemoji = require('twemoji'); var twemoji = require('twemoji');
@@ -35,7 +36,6 @@ export default class RhsRootPost extends React.Component {
} }
render() { render() {
var post = this.props.post; var post = this.props.post;
var message = utils.textToJsx(post.message);
var isOwner = UserStore.getCurrentId() === post.user_id; var isOwner = UserStore.getCurrentId() === post.user_id;
var timestamp = UserStore.getProfile(post.user_id).update_at; var timestamp = UserStore.getProfile(post.user_id).update_at;
var channel = ChannelStore.get(post.channel_id); var channel = ChannelStore.get(post.channel_id);
@@ -140,7 +140,10 @@ export default class RhsRootPost extends React.Component {
</li> </li>
</ul> </ul>
<div className='post-body'> <div className='post-body'>
<p>{message}</p> <p
onClick={TextFormatting.handleClick}
dangerouslySetInnerHTML={{__html: TextFormatting.formatText(post.message)}}
/>
{fileAttachment} {fileAttachment}
</div> </div>
</div> </div>

Просмотреть файл

@@ -10,6 +10,7 @@ var client = require('../utils/client.jsx');
var AsyncClient = require('../utils/async_client.jsx'); var AsyncClient = require('../utils/async_client.jsx');
var AppDispatcher = require('../dispatcher/app_dispatcher.jsx'); var AppDispatcher = require('../dispatcher/app_dispatcher.jsx');
var Constants = require('../utils/constants.jsx'); var Constants = require('../utils/constants.jsx');
var TextFormatting = require('../utils/text_formatting.jsx');
var ActionTypes = Constants.ActionTypes; var ActionTypes = Constants.ActionTypes;
export default class SearchResultsItem extends React.Component { export default class SearchResultsItem extends React.Component {
@@ -56,7 +57,6 @@ export default class SearchResultsItem extends React.Component {
} }
render() { render() {
var message = utils.textToJsx(this.props.post.message, {searchTerm: this.props.term, noMentionHighlight: !this.props.isMentionSearch});
var channelName = ''; var channelName = '';
var channel = ChannelStore.get(this.props.post.channel_id); var channel = ChannelStore.get(this.props.post.channel_id);
var timestamp = UserStore.getCurrentUser().update_at; var timestamp = UserStore.getCurrentUser().update_at;
@@ -68,6 +68,11 @@ export default class SearchResultsItem extends React.Component {
} }
} }
const formattingOptions = {
searchTerm: this.props.term,
mentionHighlight: this.props.isMentionSearch
};
return ( return (
<div <div
className='search-item-container post' className='search-item-container post'
@@ -91,7 +96,12 @@ export default class SearchResultsItem extends React.Component {
</time> </time>
</li> </li>
</ul> </ul>
<div className='search-item-snippet'><span>{message}</span></div> <div className='search-item-snippet'>
<span
onClick={this.handleClick}
dangerouslySetInnerHTML={{__html: TextFormatting.formatText(this.props.post.message, formattingOptions)}}
/>
</div>
</div> </div>
</div> </div>
); );
@@ -102,4 +112,4 @@ SearchResultsItem.propTypes = {
post: React.PropTypes.object, post: React.PropTypes.object,
isMentionSearch: React.PropTypes.bool, isMentionSearch: React.PropTypes.bool,
term: React.PropTypes.string term: React.PropTypes.string
}; };