ReplayComments.jsx 3.2 KB

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