通用评论

1
  1. {"version":3,"sources":["../../../src/components/ContentItem/index.js"],"names":["dayjs","locale","extend","relativeTime","CommentItem","props","state","showInput","showPreviewer","previewerIndex","handleToggleInput","bind","renderTextWithReply","hidePreviewer","index","setState","text","content","newText","reply","user_name","commentId","replyId","action","showReply","onShowReply","app","newContent","images","indexOf","IMAGE_SPLIT","split","pop","join","imageList","needClear","length","imgs","splice","type","user_avatar","avatar","marginLeft","created","format","fromNow","__html","map","item","i","backgroundImage","reply_count","userId","user_id","sDeleteReply","id","sDeleteComment","sReplyFavor","favored","sCommentFavor","favor_count","children","Component","propTypes","PropTypes","object","isRequired","oneOf","func","defaultProps"],"mappings":"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","file":"index.js","sourcesContent":["import React, { Component } from \"react\";\nimport PropTypes from \"prop-types\";\nimport { Avatar, Icon, Tooltip, Popconfirm } from \"antd\";\nimport dayjs from \"dayjs\";\nimport \"dayjs/locale/zh-cn\";\nimport relativeTime from \"dayjs/plugin/relativeTime\";\nimport Comment from \"../../Comment\";\nimport CommentInput from \"../CommentInput\";\nimport avatar from \"../../avatar\";\nimport { renderContent } from \"../../helper\";\nimport { IMAGE_SPLIT } from \"../../constant\";\nimport \"./index.css\";\nimport ImagePreviewer from \"../ImagePreviewer/ImagePreviewer\";\n\ndayjs.locale(\"zh-cn\");\ndayjs.extend(relativeTime);\n\nclass CommentItem extends Component {\n constructor(props) {\n super(props);\n this.state = {\n showInput: false,\n showPreviewer: false,\n previewerIndex: 0\n };\n this.handleToggleInput = this.handleToggleInput.bind(this);\n this.renderTextWithReply = this.renderTextWithReply.bind(this);\n this.showPreviewer = this.showPreviewer.bind(this);\n this.hidePreviewer = this.hidePreviewer.bind(this);\n }\n\n showPreviewer(index) {\n this.setState({\n showPreviewer: true,\n previewerIndex: index\n });\n }\n\n hidePreviewer() {\n this.setState({\n showPreviewer: false\n });\n }\n\n handleToggleInput() {\n this.setState({ showInput: !this.state.showInput });\n }\n\n renderTextWithReply(text, content) {\n let newText = text;\n const { reply } = content;\n if (reply) {\n // newText = `${newText} //@<a href=\"/${reply.user_id}\">${\n // reply.user_name\n // }</a> ${reply.content}`;\n newText = `${newText} //@${reply.user_name} ${reply.content}`;\n // newText = (\n // <span>\n // {newText}\n // @<a href={`/${reply.user_id}`}>{reply.user_name}</a>{reply.content}\n // </span>\n // )\n if (reply.reply) {\n return this.renderTextWithReply(newText, reply);\n }\n }\n return newText;\n }\n\n render() {\n const {\n commentId,\n replyId,\n content,\n action,\n showReply,\n onShowReply,\n app\n } = this.props;\n\n const { showInput } = this.state;\n\n let newContent = content.content;\n let images = \"\";\n if (newContent.indexOf(IMAGE_SPLIT) !== -1) {\n newContent = newContent.split(IMAGE_SPLIT);\n images = newContent.pop();\n newContent = newContent.join(\"\");\n }\n\n const imageList = images.split(\",\");\n\n // 在3, 7前需要换行\n const needClear =\n imageList.length === 5 ||\n imageList.length === 6 ||\n imageList.length === 9;\n const imgs = [...imageList];\n if (needClear) {\n if (imgs.length > 6) {\n imgs.splice(3, 0, { type: \"divider\" });\n imgs.splice(7, 0, { type: \"divider\" });\n } else {\n imgs.splice(3, 0, { type: \"divider\" });\n }\n }\n\n return (\n <div className=\"comment-item-box\">\n <div className=\"comment-item-left\">\n <Avatar src={content.user_avatar || avatar} size=\"large\" />\n </div>\n <div className=\"comment-item-right\">\n <div>\n {/* <a href={`/${content.user_id}`}>\n {content.user_name || \"暂无昵称\"}\n </a> */}\n <strong>{content.user_name || \"游客\"}</strong>\n <span style={{ marginLeft: 10 }}>\n <Tooltip\n placement=\"top\"\n title={dayjs(content.created * 1000).format(\n \"YYYY-MM-DD HH:mm:ss\"\n )}\n >\n {dayjs(content.created * 1000).fromNow()}\n </Tooltip>\n </span>\n </div>\n <div\n className=\"comment-item-content\"\n dangerouslySetInnerHTML={{\n __html: renderContent(\n this.renderTextWithReply(newContent, content)\n )\n }}\n />\n {// image为空时不渲染comment-item-image\n imageList.length > 0 &&\n imageList[0] !== \"\" && (\n <div className=\"comment-item-image\">\n {!this.state.showPreviewer &&\n imgs.map((item, index) => {\n if (item.type === \"divider\") {\n return (\n <div className=\"comment-item-image-wrapper\" key={index}>\n <div className=\"comment-img-divider\" />\n {/* <img src={item} alt={item} className=\"comment-img\" /> */}\n </div>\n );\n }\n return (\n <div\n className=\"comment-item-image-wrapper\"\n key={index}\n onClick={() => {\n let i = index;\n if (needClear) {\n if (index > 3) {\n i -= 1;\n }\n if (index > 7) {\n i -= 1;\n }\n }\n this.showPreviewer(i);\n }}\n >\n <div\n style={{ backgroundImage: `url(${item})` }}\n className=\"comment-img-thumbnail\"\n />\n {/* <img src={item} alt={item} className=\"comment-img\" /> */}\n </div>\n );\n })}\n {this.state.showPreviewer && (\n <ImagePreviewer\n list={imageList}\n index={this.state.previewerIndex}\n onFold={this.hidePreviewer}\n />\n )}\n <div className=\"clearfix\" />\n </div>\n )}\n <div className=\"comment-item-bottom\">\n {content.reply_count ? (\n <div>\n <a className=\"comment-item-bottom-left\" onClick={onShowReply}>\n {content.reply_count} 条回复\n {showReply ? <Icon type=\"up\" /> : <Icon type=\"down\" />}\n </a>\n </div>\n ) : null}\n {app.userId === content.user_id && (\n <Popconfirm\n title=\"确定要删除吗?\"\n onConfirm={() => {\n if (replyId) {\n app.sDeleteReply(content.id, commentId);\n return;\n }\n app.sDeleteComment(content.id);\n }}\n okText=\"确定\"\n cancelText=\"取消\"\n >\n <a className=\"comment-item-bottom-right\">&nbsp; 删除</a>\n </Popconfirm>\n )}\n <a\n onClick={this.handleToggleInput}\n className=\"comment-item-bottom-right\"\n >\n &nbsp; 回复\n </a>\n <div\n className=\"comment-item-bottom-right\"\n onClick={() => {\n if (replyId) {\n // 如果有 replyId,则说明是评论的回复\n app.sReplyFavor(content.id, commentId, content.favored);\n return;\n }\n app.sCommentFavor(content.id, content.favored);\n }}\n >\n <Icon\n type=\"like-o\"\n className={\n content.favored\n ? \"comment-favor comment-favored\"\n : \"comment-favor\"\n }\n />\n &nbsp;{content.favor_count}\n </div>\n </div>\n </div>\n\n {showInput && (\n <CommentInput\n content={app.children}\n action={action}\n replyId={replyId}\n commentId={commentId}\n callback={this.handleToggleInput}\n />\n )}\n </div>\n );\n }\n}\n\nCommentItem.propTypes = {\n content: PropTypes.object.isRequired,\n // comment 评论\n // reply 评论的回复\n // replyToReply 回复的回复\n action: PropTypes.oneOf([\"comment\", \"reply\", \"replyToReply\"]),\n onShowReply: PropTypes.func\n};\n\nCommentItem.defaultProps = {\n action: \"comment\",\n onShowReply: () => {}\n};\n\nexport default Comment(CommentItem);\n"]}