CommentEditorLazyRenderer.jsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { createSubscribedElement } from '../UnstatedUtils';
  4. import AppContainer from '../../services/AppContainer';
  5. import UserPicture from '../User/UserPicture';
  6. import CommentEditor from './CommentEditor';
  7. class CommentEditorLazyRenderer extends React.Component {
  8. constructor(props) {
  9. super(props);
  10. this.state = {
  11. isEditorShown: false,
  12. };
  13. this.growiRenderer = this.props.appContainer.getRenderer('comment');
  14. this.showCommentFormBtnClickHandler = this.showCommentFormBtnClickHandler.bind(this);
  15. }
  16. showCommentFormBtnClickHandler() {
  17. this.setState({ isEditorShown: !this.state.isEditorShown });
  18. }
  19. render() {
  20. const { appContainer } = this.props;
  21. const username = appContainer.me;
  22. const isLoggedIn = username != null;
  23. const user = appContainer.findUser(username);
  24. const layoutType = this.props.appContainer.getConfig().layoutType;
  25. const isBaloonStyle = layoutType.match(/crowi-plus|growi|kibela/);
  26. if (!isLoggedIn) {
  27. return <React.Fragment></React.Fragment>;
  28. }
  29. return (
  30. <React.Fragment>
  31. { !this.state.isEditorShown && (
  32. <div className="form page-comment-form">
  33. <div className="comment-form">
  34. { isBaloonStyle && (
  35. <div className="comment-form-user">
  36. <UserPicture user={user} />
  37. </div>
  38. ) }
  39. <div className="comment-form-main">
  40. { !this.state.isEditorShown && (
  41. <button
  42. type="button"
  43. className={`btn btn-lg ${isBaloonStyle ? 'btn-link' : 'btn-primary'} center-block`}
  44. onClick={this.showCommentFormBtnClickHandler}
  45. >
  46. <i className="icon-bubble"></i> Add Comment
  47. </button>
  48. ) }
  49. </div>
  50. </div>
  51. </div>
  52. ) }
  53. { this.state.isEditorShown && (
  54. <CommentEditor
  55. growiRenderer={this.growiRenderer}
  56. replyTo={undefined}
  57. commentButtonClickedHandler={this.showCommentFormBtnClickHandler}
  58. >
  59. </CommentEditor>
  60. ) }
  61. </React.Fragment>
  62. );
  63. }
  64. }
  65. /**
  66. * Wrapper component for using unstated
  67. */
  68. const CommentEditorLazyRendererWrapper = (props) => {
  69. return createSubscribedElement(CommentEditorLazyRenderer, props, [AppContainer]);
  70. };
  71. CommentEditorLazyRenderer.propTypes = {
  72. appContainer: PropTypes.instanceOf(AppContainer).isRequired,
  73. };
  74. export default CommentEditorLazyRendererWrapper;