通用评论

index.js 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. import React from "react";
  2. import PropTypes from "prop-types";
  3. import { Icon, Button, Popover, Input } from "antd";
  4. import { MAX_UPLOAD_NUMBER } from "../../constant";
  5. import Upload from "./Upload";
  6. import Emoji from "./Emoji";
  7. import "./index.css";
  8. const { TextArea } = Input;
  9. // 设置 Editor 组件的默认值
  10. // 不能在 Editor.defaultProps 中设置
  11. // 因为 Editor 在 ComponentInput 中调用
  12. // 在 ComponentInput 中,需要使用 Editor 的 props 覆盖 ComponentInput 传入的 props
  13. const EditorDefaultProps = {
  14. rows: 5,
  15. placeholder: "说点什么吧...",
  16. showEmoji: true,
  17. showUpload: true,
  18. submitText: "发表",
  19. onChange: () => {}
  20. };
  21. class Editor extends React.Component {
  22. constructor(props) {
  23. super(props);
  24. this.state = {
  25. showUpload: false
  26. };
  27. this.handleClickEmoji = this.handleClickEmoji.bind(this);
  28. this.handleShowUpload = this.handleShowUpload.bind(this);
  29. }
  30. componentDidMount() {}
  31. handleClickEmoji(emojiId) {
  32. this.props.onChangeEmoji(emojiId);
  33. }
  34. handleShowUpload(showUpload) {
  35. if (typeof showUpload === "boolean") {
  36. this.setState({ showUpload: showUpload });
  37. } else {
  38. this.setState({ showUpload: !this.state.showUpload });
  39. }
  40. }
  41. render() {
  42. const props = { ...EditorDefaultProps, ...this.props };
  43. const {
  44. value,
  45. onChange,
  46. onSubmit,
  47. loading,
  48. placeholder,
  49. fileList,
  50. onChangeFileList,
  51. rows,
  52. onUpload,
  53. showEmoji,
  54. showUpload,
  55. submitText
  56. } = props;
  57. return (
  58. <div className="editor">
  59. <TextArea
  60. value={value}
  61. onChange={e => onChange(e.target.value)}
  62. rows={rows}
  63. placeholder={placeholder}
  64. />
  65. <div className="toolbar">
  66. <div style={{ float: "left", margin: "8px 11px" }}>
  67. {showEmoji && (
  68. <Popover
  69. trigger="click"
  70. placement="bottomLeft"
  71. autoAdjustOverflow={false}
  72. content={
  73. <div style={{ width: 200 }}>
  74. <Emoji onClick={this.handleClickEmoji} />
  75. </div>
  76. }
  77. overlayClassName="feed"
  78. >
  79. <Icon type="smile-o" className="icon" />
  80. </Popover>
  81. )}
  82. {showUpload && (
  83. <Popover
  84. visible={this.state.showUpload}
  85. overlayStyle={{ zIndex: 999 }}
  86. content={
  87. <div
  88. style={{ width: 112 * MAX_UPLOAD_NUMBER, minHeight: 100 }}
  89. >
  90. <Upload
  91. onChangeFileList={onChangeFileList}
  92. onUpload={onUpload}
  93. fileList={fileList}
  94. />
  95. </div>
  96. }
  97. placement="bottomLeft"
  98. title={
  99. <div style={{ margin: "5px auto" }}>
  100. <span>
  101. 上传图片
  102. <span style={{ color: "#666", fontWeight: 400 }}>
  103. (您还能上传{MAX_UPLOAD_NUMBER - fileList.length}张图片)
  104. </span>
  105. </span>
  106. <Icon
  107. type="close"
  108. onClick={() => this.handleShowUpload(false)}
  109. style={{
  110. float: "right",
  111. cursor: "pointer",
  112. marginTop: 4
  113. }}
  114. />
  115. </div>
  116. }
  117. >
  118. <Icon
  119. type="picture"
  120. className="icon"
  121. style={{ marginLeft: 10 }}
  122. onClick={() => this.handleShowUpload(true)}
  123. />
  124. </Popover>
  125. )}
  126. </div>
  127. <div style={{ float: "right", margin: "5px 11px" }}>
  128. <Button onClick={onSubmit} type="primary" loading={loading}>
  129. {submitText}
  130. </Button>
  131. </div>
  132. </div>
  133. </div>
  134. );
  135. }
  136. }
  137. Editor.propTypes = {
  138. rows: PropTypes.number,
  139. placeholder: PropTypes.string,
  140. showEmoji: PropTypes.bool,
  141. showUpload: PropTypes.bool,
  142. submitText: PropTypes.string,
  143. onChange: PropTypes.func
  144. };
  145. export default Editor;