UNPKG

http-teapot-comment

Version:

A comment system for your website

99 lines (87 loc) 2.98 kB
/** * @jsx React.DOM */ var Comment = React.createClass({ getInitialState: function () { return { editable: this.props.editable, liked: this.props.liked, likes: this.props.likes } }, submit: function (event) { var body = this.refs.body.getDOMNode().innerHTML.trim(); this.props.submitCallback(this.getDOMNode().getAttribute('data-reply-to'), body); }, like: function (event) { event.preventDefault(); event.stopPropagation(); var likes = this.state.likes; if (this.state.liked) { likes--; } else { likes++; } this.setState({ liked: !this.state.liked, likes: likes }); this.props.likeCallback(this.props.key); }, listReplies: function (event) { event.preventDefault(); if (this.props.listRepliesCallback) { this.props.listRepliesCallback(event, event.currentTarget); } }, toggleComment: function (event) { this.props.toggleCommentCallback(event, event.currentTarget); }, render: function() { var markupFooter = '' , classString = "Comment" , replyTo = this.props.replyTo , id = "" , markupStatsLikes = '' , markupStatsReplies = ''; if (this.state.editable === "true") { markupFooter = <div className="Comment-footer"><button className="Comment-submit" onClick={this.submit} type="button">Post</button></div>; classString += " is-editable"; } else { id = "Comment-" + this.props.key; markupFooter = <div className="Comment-footer"><a className="Comment-footer-flag" href="#">Flag</a> ● <div className="Comment-footer-date">{moment(this.props.timestamp).calendar()}</div></div> } // If the comment was liked one time or more if (this.state.likes) { markupStatsLikes = <div className="Comment-likeTotal">{this.state.likes}</div>; } // If the comment has one or more replies if (this.props.replies) { markupStatsReplies = <div className="Comment-repliesTotal">{this.props.replies}</div> } if (this.state.liked) { classString += " is-liked"; } if (this.props.active) { classString += " is-active"; } return ( <div id={id} className={classString} key={this.props.key} onClick={this.toggleComment} data-comment-id={this.props.key} data-reply-to={replyTo}> <a className="Comment-avatar"> <img src={this.props.avatar} /> </a> <a className="Comment-like" onClick={this.like} href="#"> <i className="fa fa-heart"></i> </a> <a className="Comment-replies" onClick={this.listReplies} href="#"> <i className="fa fa-comment"></i> </a> {markupStatsLikes} {markupStatsReplies} <div className="Comment-body" ref="body" contentEditable={this.state.editable} dangerouslySetInnerHTML={{__html: marked(this.props.children.toString())}}> </div> {markupFooter} </div> ); } });