ReplayComments.jsx 3.0 KB

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