ColumnContentMessage.tsx 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. import React, { useEffect, useState } from 'react'
  2. import useRequest from '@ahooksjs/use-request/es'
  3. import { Input, message, Modal } from 'antd'
  4. import { ColumnService, IMessageDetail, IMsgChildrenList } from 'Column/Column.service'
  5. import { LikeOutlined, DeleteOutlined, LikeFilled } from '@ant-design/icons'
  6. import styles from '../css/ColumnMessage.module.scss'
  7. interface IColumnCenterProps {
  8. detailId: number
  9. }
  10. /**研选专栏 */
  11. const ColumnContentMessage: React.FC<IColumnCenterProps> = props => {
  12. const { detailId } = props
  13. const pageSize = 100000
  14. const currentIndex = 1
  15. const [inputShow, setInputShow] = useState<boolean>(false) // 是否显示留言输入框
  16. const [massageList, setMassageList] = useState<IMessageDetail[]>([]) // 是否显示留言输入框
  17. const [massageNum, setMassageNum] = useState<number>(0) // 是否显示留言输入框
  18. const [messageContent, setMessageContent] = useState<string>('') // 是否显示留言输入框
  19. const handleChangeMessage = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {
  20. setMessageContent(e.target.value)
  21. }
  22. const submitHandler = () => {
  23. if (messageContent) {
  24. applyCheckColumnNote(detailId, messageContent)
  25. } else {
  26. message.error('留言不能为空!')
  27. }
  28. }
  29. // 添加留言
  30. const { run: applyCheckColumnNote } = useRequest(ColumnService.postMessageAdd, {
  31. manual: true,
  32. onSuccess: res => {
  33. res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
  34. setInputShow(false)
  35. setMessageContent('')
  36. getColumnSpecialList(pageSize, currentIndex, detailId)
  37. }
  38. })
  39. // 获取留言数据
  40. const { run: getColumnSpecialList } = useRequest(ColumnService.getColumnSpecialList, {
  41. manual: true,
  42. formatResult: response => response.data.Data,
  43. onSuccess: res => {
  44. setMassageList(res.List)
  45. setMassageNum(res.PublicMessageTotal)
  46. }
  47. })
  48. // 删除留言的按钮
  49. const deleceMessageHandler = (item: IMessageDetail) => {
  50. Modal.confirm({
  51. title: '提醒',
  52. content: '确定要删除此回复内容吗?',
  53. okText: '确定',
  54. cancelText: '取消',
  55. centered: true,
  56. closable: true,
  57. onOk: () => {
  58. postMessageDelete(item.MessageId)
  59. }
  60. })
  61. }
  62. // 删除留言的接口
  63. const { run: postMessageDelete } = useRequest(ColumnService.postMessageDelete, {
  64. manual: true,
  65. onSuccess: res => {
  66. res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
  67. getColumnSpecialList(pageSize, currentIndex, detailId)
  68. }
  69. })
  70. // 留言的点赞
  71. const likeMessageHandler = (item: IMessageDetail | IMsgChildrenList) => {
  72. postMessageLike(item.MessageId, item.IsLikeCount ? 0 : 1)
  73. }
  74. // 点赞留言的接口
  75. const { run: postMessageLike } = useRequest(ColumnService.postMessageLike, {
  76. manual: true,
  77. onSuccess: res => {
  78. res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
  79. getColumnSpecialList(pageSize, currentIndex, detailId)
  80. }
  81. })
  82. useEffect(() => {
  83. if (detailId) {
  84. getColumnSpecialList(pageSize, currentIndex, detailId)
  85. }
  86. }, [detailId])
  87. return (
  88. <div>
  89. {!inputShow ? (
  90. <div
  91. className={styles['columndetail-messge-select-ipt']}
  92. onClick={() => {
  93. setInputShow(true)
  94. }}
  95. >
  96. 请写下您的留言
  97. </div>
  98. ) : (
  99. <div style={{ marginTop: 20, marginBottom: 20 }}>
  100. <Input.TextArea
  101. placeholder="留言会私信给作者,作者设置留言公开后将在文章下展示"
  102. autoSize={{ minRows: 3, maxRows: 3 }}
  103. required
  104. value={messageContent}
  105. onChange={handleChangeMessage}
  106. autoFocus
  107. />
  108. <div className={styles['columndetail-messge-ipt-btn']}>
  109. <span
  110. onClick={() => {
  111. setInputShow(false)
  112. }}
  113. >
  114. 取消
  115. </span>
  116. <span onClick={submitHandler}>提交</span>
  117. </div>
  118. </div>
  119. )}
  120. <div className={styles['disclosure-num-msg']}>{massageNum}条公开留言</div>
  121. {massageList.length > 0 &&
  122. massageList.map(item => (
  123. <div
  124. key={item.MessageId}
  125. className={`${styles[`columndetail-message-list`]} ${styles[item.Status === 0 ? 'no-disclosure' : '']}`}
  126. >
  127. <div className={styles['item-img-btn']}>
  128. <div>
  129. <img src={item.Headimgurl} />
  130. <span style={{ color: '#999999' }}>{item.CreateTime}</span>
  131. </div>
  132. <div>
  133. {item.Status === 0 ? (
  134. <div className={styles['delete-box']}>
  135. <p>未公开之前仅自己可见</p>
  136. <DeleteOutlined className={styles['delete-icon']} onClick={() => deleceMessageHandler(item)} />
  137. </div>
  138. ) : (
  139. <>
  140. <div>
  141. {item.IsLikeCount ? (
  142. <LikeFilled className={styles['collect-icon']} onClick={() => likeMessageHandler(item)} />
  143. ) : (
  144. <LikeOutlined className={styles['collect-icon']} onClick={() => likeMessageHandler(item)} />
  145. )}
  146. <span>{item.LikeCount}</span>
  147. </div>
  148. </>
  149. )}
  150. </div>
  151. </div>
  152. <div className={styles['columndetail-messge-content']}>{item.Content}</div>
  153. {item.ChildList.length > 0 &&
  154. item.ChildList.map(child => (
  155. <div key={child.MessageId} className={styles['columndetail-messge-child-list']}>
  156. <div className={styles['child-item-img-btn']}>
  157. <div>
  158. <img src={child.Headimgurl} />
  159. <span style={{ color: '#999999' }}>{child.CreateTime}</span>
  160. </div>
  161. <>
  162. <div>
  163. {child.IsLikeCount ? (
  164. <LikeFilled className={styles['collect-icon']} onClick={() => likeMessageHandler(child)} />
  165. ) : (
  166. <LikeOutlined className={styles['collect-icon']} onClick={() => likeMessageHandler(child)} />
  167. )}
  168. <span>{child.LikeCount}</span>
  169. </div>
  170. </>
  171. </div>
  172. <div className={styles['columndetail-messge-content']}>{child.Content}</div>
  173. </div>
  174. ))}
  175. </div>
  176. ))}
  177. </div>
  178. )
  179. }
  180. export default ColumnContentMessage