ReplayComments.jsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { Button, Collapse } from 'reactstrap';
  4. import AppContainer from '../../services/AppContainer';
  5. import PageContainer from '../../services/PageContainer';
  6. import Comment from './Comment';
  7. import { createSubscribedElement } from '../UnstatedUtils';
  8. class ReplayComments extends React.PureComponent {
  9. constructor() {
  10. super();
  11. this.state = {
  12. isOlderRepliesShown: false,
  13. };
  14. this.toggleIsOlderRepliesShown = this.toggleIsOlderRepliesShown.bind(this);
  15. }
  16. toggleIsOlderRepliesShown() {
  17. this.setState({ isOlderRepliesShown: !this.state.isOlderRepliesShown });
  18. }
  19. renderReply(reply) {
  20. return (
  21. <div key={reply._id} className="page-comment-reply ml-4 ml-sm-5 mr-3">
  22. <Comment
  23. comment={reply}
  24. deleteBtnClicked={this.props.deleteBtnClicked}
  25. growiRenderer={this.props.growiRenderer}
  26. />
  27. </div>
  28. );
  29. }
  30. render() {
  31. const isAllReplyShown = this.props.appContainer.getConfig().isAllReplyShown || false;
  32. const replyList = this.props.replyList;
  33. if (isAllReplyShown) {
  34. return (
  35. <React.Fragment>
  36. {replyList.map((reply) => {
  37. return this.renderReply(reply);
  38. })}
  39. </React.Fragment>
  40. );
  41. }
  42. const areThereHiddenReplies = (replyList.length > 2);
  43. const { isOlderRepliesShown } = this.state;
  44. const toggleButtonIconName = isOlderRepliesShown ? 'icon-arrow-up' : 'icon-options-vertical';
  45. const toggleButtonIcon = <i className={`icon-fw ${toggleButtonIconName}`}></i>;
  46. const toggleButtonLabel = isOlderRepliesShown ? '' : 'more';
  47. const shownReplies = replyList.slice(replyList.length - 2, replyList.length);
  48. const hiddenReplies = replyList.slice(0, replyList.length - 2);
  49. const hiddenElements = hiddenReplies.map((reply) => {
  50. return this.renderReply(reply);
  51. });
  52. const shownElements = shownReplies.map((reply) => {
  53. return this.renderReply(reply);
  54. });
  55. return (
  56. <React.Fragment>
  57. {areThereHiddenReplies && (
  58. <div className="page-comments-hidden-replies">
  59. <Collapse in={this.state.isOlderRepliesShown}>
  60. <div>{hiddenElements}</div>
  61. </Collapse>
  62. <div className="text-center">
  63. <Button
  64. bsStyle="link"
  65. className="page-comments-list-toggle-older"
  66. onClick={this.toggleIsOlderRepliesShown}
  67. >
  68. {toggleButtonIcon} {toggleButtonLabel}
  69. </Button>
  70. </div>
  71. </div>
  72. )}
  73. {shownElements}
  74. </React.Fragment>
  75. );
  76. }
  77. }
  78. /**
  79. * Wrapper component for using unstated
  80. */
  81. const ReplayCommentsWrapper = (props) => {
  82. return createSubscribedElement(ReplayComments, props, [AppContainer, PageContainer]);
  83. };
  84. ReplayComments.propTypes = {
  85. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  86. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  87. growiRenderer: PropTypes.object.isRequired,
  88. deleteBtnClicked: PropTypes.func.isRequired,
  89. replyList: PropTypes.array,
  90. };
  91. export default ReplayCommentsWrapper;