ReplayComments.jsx 3.1 KB

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