PageComments.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import Comment from './PageComment/Comment';
  4. import DeleteCommentModal from './PageComment/DeleteCommentModal';
  5. /**
  6. * Load data of comments and render the list of <Comment />
  7. *
  8. * @author Yuki Takei <yuki@weseek.co.jp>
  9. *
  10. * @export
  11. * @class PageComments
  12. * @extends {React.Component}
  13. */
  14. export default class PageComments extends React.Component {
  15. constructor(props) {
  16. super(props);
  17. this.state = {
  18. currentComments: [],
  19. newerComments: [],
  20. olderComments: [],
  21. // for deleting comment
  22. commentToDelete: undefined,
  23. isDeleteConfirmModalShown: false,
  24. };
  25. this.init = this.init.bind(this);
  26. this.confirmToDeleteComment = this.confirmToDeleteComment.bind(this);
  27. this.deleteComment = this.deleteComment.bind(this);
  28. this.showDeleteConfirmModal = this.showDeleteConfirmModal.bind(this);
  29. this.closeDeleteConfirmModal = this.closeDeleteConfirmModal.bind(this);
  30. }
  31. componentWillMount() {
  32. const pageId = this.props.pageId;
  33. if (pageId) {
  34. this.init();
  35. }
  36. }
  37. init() {
  38. if (!this.props.pageId) {
  39. return ;
  40. }
  41. const pageId = this.props.pageId;
  42. const revisionId = this.props.revisionId;
  43. const revisionCreatedAt = this.props.revisionCreatedAt;
  44. this.props.crowi.apiGet('/comments.get', {page_id: pageId})
  45. .then(res => {
  46. if (res.ok) {
  47. let currentComments = [];
  48. let newerComments = [];
  49. let olderComments = [];
  50. // divide by revisionId and createdAt
  51. res.comments.forEach((comment) => {
  52. if (comment.revision == revisionId) {
  53. currentComments.push(comment);
  54. }
  55. else if (Date.parse(comment.createdAt)/1000 > revisionCreatedAt) {
  56. newerComments.push(comment);
  57. }
  58. else {
  59. olderComments.push(comment);
  60. }
  61. });
  62. this.setState({currentComments, newerComments, olderComments});
  63. }
  64. }).catch(err => {
  65. });
  66. }
  67. confirmToDeleteComment(comment) {
  68. this.setState({commentToDelete: comment});
  69. this.showDeleteConfirmModal();
  70. }
  71. deleteComment() {
  72. const comment = this.state.commentToDelete;
  73. // TODO delete
  74. console.log(comment);
  75. this.closeDeleteConfirmModal();
  76. }
  77. showDeleteConfirmModal() {
  78. this.setState({isDeleteConfirmModalShown: true});
  79. }
  80. closeDeleteConfirmModal() {
  81. this.setState({
  82. commentToDelete: undefined,
  83. isDeleteConfirmModalShown: false,
  84. });
  85. }
  86. /**
  87. * generate Elements of Comment
  88. *
  89. * @param {any} comments Array of Comment Model Obj
  90. *
  91. * @memberOf PageComments
  92. */
  93. generateCommentElements(comments) {
  94. return comments.map((comment) => {
  95. return (
  96. <Comment key={comment._id} comment={comment}
  97. currentUserId={this.props.crowi.me}
  98. currentRevisionId={this.props.revisionId}
  99. deleteBtnClicked={this.confirmToDeleteComment} />
  100. );
  101. });
  102. }
  103. render() {
  104. let currentElements = this.generateCommentElements(this.state.currentComments);
  105. let newerElements = this.generateCommentElements(this.state.newerComments);
  106. let olderElements = this.generateCommentElements(this.state.olderComments);
  107. let toggleNewer = (newerElements.length === 0)
  108. ? <div></div>
  109. : (
  110. <a className="page-comments-list-toggle-newer text-center" data-toggle="collapse" href="#page-comments-list-newer">
  111. <i className="fa fa-angle-double-up"></i> Comments for Newer Revision <i className="fa fa-angle-double-up"></i>
  112. </a>
  113. )
  114. let toggleOlder = (olderElements.length === 0)
  115. ? <div></div>
  116. : (
  117. <a className="page-comments-list-toggle-older text-center" data-toggle="collapse" href="#page-comments-list-older">
  118. <i className="fa fa-angle-double-down"></i> Comments for Older Revision <i className="fa fa-angle-double-down"></i>
  119. </a>
  120. )
  121. return (
  122. <div>
  123. <div className="page-comments-list-newer collapse" id="page-comments-list-newer">
  124. {newerElements}
  125. </div>
  126. {toggleNewer}
  127. <div className="page-comments-list-current" id="page-comments-list-current">
  128. {currentElements}
  129. </div>
  130. {toggleOlder}
  131. <div className="page-comments-list-older collapse in" id="page-comments-list-older">
  132. {olderElements}
  133. </div>
  134. <DeleteCommentModal
  135. isShown={this.state.isDeleteConfirmModalShown}
  136. comment={this.state.commentToDelete}
  137. cancel={this.closeDeleteConfirmModal}
  138. confirmedToDelete={this.deleteComment}
  139. />
  140. </div>
  141. );
  142. }
  143. }
  144. PageComments.propTypes = {
  145. pageId: PropTypes.string,
  146. revisionId: PropTypes.string,
  147. revisionCreatedAt: PropTypes.number,
  148. crowi: PropTypes.object.isRequired,
  149. };