ReplyComments.jsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. import React, { useState } 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 { createSubscribedElement } from '../UnstatedUtils';
  8. const ReplyComments = (props) => {
  9. const [isOlderRepliesShown, setIsOlderRepliesShown] = useState(false);
  10. const toggleOlderReplies = () => {
  11. setIsOlderRepliesShown(!isOlderRepliesShown);
  12. };
  13. const renderReply = (reply) => {
  14. return (
  15. <div key={reply._id} className="page-comment-reply">
  16. {reply.comment}
  17. {/* <CommentWrapper
  18. comment={reply}
  19. deleteBtnClicked={props.deleteBtnClicked}
  20. growiRenderer={props.growiRenderer}
  21. /> */}
  22. </div>
  23. );
  24. };
  25. const layoutType = props.appContainer.getConfig().layoutType;
  26. const isBaloonStyle = layoutType.match(/crowi-plus|growi|kibela/);
  27. let { replyList } = props;
  28. if (!isBaloonStyle) {
  29. replyList = replyList.slice().reverse();
  30. }
  31. const areThereHiddenReplies = replyList.length > 2;
  32. const toggleButtonIconName = isOlderRepliesShown ? 'icon-arrow-up' : 'icon-options-vertical';
  33. const toggleButtonIcon = <i className={`icon-fw ${toggleButtonIconName}`}></i>;
  34. const toggleButtonLabel = isOlderRepliesShown ? '' : 'more';
  35. const shownReplies = replyList.slice(replyList.length - 2, replyList.length);
  36. const hiddenReplies = replyList.slice(0, replyList.length - 2);
  37. const hiddenElements = hiddenReplies.map((reply) => {
  38. return renderReply(reply);
  39. });
  40. const shownElements = shownReplies.map((reply) => {
  41. return renderReply(reply);
  42. });
  43. return (
  44. <React.Fragment>
  45. {areThereHiddenReplies && (
  46. <div className="page-comments-hidden-replies">
  47. <Collapse in={isOlderRepliesShown}>
  48. <div>{hiddenElements}</div>
  49. </Collapse>
  50. <div className="text-center">
  51. <Button
  52. bsStyle="link"
  53. className="page-comments-list-toggle-older"
  54. onClick={toggleOlderReplies}
  55. >
  56. {toggleButtonIcon} {toggleButtonLabel}
  57. </Button>
  58. </div>
  59. </div>
  60. )}
  61. {shownElements}
  62. </React.Fragment>
  63. );
  64. };
  65. /**
  66. * Wrapper component for using unstated
  67. */
  68. const ReplyCommentsWrapper = (props) => {
  69. return createSubscribedElement(ReplyComments, props, [AppContainer, PageContainer]);
  70. };
  71. ReplyComments.propTypes = {
  72. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  73. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  74. replyList: PropTypes.array.isRequired,
  75. };
  76. export default ReplyCommentsWrapper;