ColumnMessage.tsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. import React, { useEffect, useState } from 'react'
  2. import useRequest from '@ahooksjs/use-request/es'
  3. import { Checkbox, Drawer, Modal, Tabs, TabsProps, message, Button, Form, Input, Row } from 'antd'
  4. import { ReactComponent as Close } from 'assets/close.svg'
  5. import { ColumnService, IMessageDetail } from 'Column/Column.service'
  6. import styles from '../css/ColumnIndex.module.scss'
  7. import { CheckboxValueType } from 'antd/lib/checkbox/Group'
  8. const { Item } = Form
  9. interface IColumnCenterProps {
  10. open: boolean // 是否打开
  11. onClose: (type: 'editInfo' | 'openCenter' | 'openMessage') => void // 关闭
  12. }
  13. /**研选专栏 留言管理 */
  14. const ColumnMessage: React.FC<IColumnCenterProps> = props => {
  15. const { open } = props
  16. const pageSize = 10
  17. const currentIndex = 1
  18. const [messageList, setMessageList] = useState<IMessageDetail[]>([]) // 列表
  19. const [selectCheckbox, setSelectCheckbox] = useState<(string | number)[]>([]) // 选择Id
  20. const [msgTextVisible, setMsgTextVisible] = useState<boolean>(false) // 选择Id
  21. const [replyItemID, setReplyItemID] = useState<number>(0) // 选择Id
  22. const [replyParentId, setReplyreplyParentId] = useState<number>(0) // 选择Id
  23. const [tabsAct, setTabsAct] = useState<number>(1) // 选择Id
  24. const [form] = Form.useForm()
  25. useEffect(() => {
  26. console.log(11)
  27. if (open) {
  28. getColumnManageList(pageSize, currentIndex, tabsAct)
  29. }
  30. }, [open])
  31. // 列表
  32. const { run: getColumnManageList } = useRequest(ColumnService.getColumnManageList, {
  33. manual: true,
  34. formatResult: response => response.data.Data,
  35. onSuccess: res => {
  36. console.log(res)
  37. setMessageList(res.List)
  38. }
  39. })
  40. // 多选框的选择事件
  41. const checkboxChange = (e: CheckboxValueType[], item: IMessageDetail) => {
  42. const updatedMessage = messageList.map(msg => {
  43. if (item.MessageId === msg.MessageId) {
  44. if (e.length > 0 && item.CheckIds.length === 0) {
  45. const arr = []
  46. arr.push(item.MessageId)
  47. item.ChildList.forEach(child => {
  48. arr.push(child.MessageId)
  49. })
  50. return { ...msg, CheckIds: arr }
  51. } else {
  52. return { ...msg, CheckIds: [] }
  53. }
  54. } else {
  55. return msg
  56. }
  57. })
  58. let arr: number[] = []
  59. updatedMessage.forEach(_ => {
  60. arr = [...arr, ..._.CheckIds]
  61. })
  62. setSelectCheckbox(arr)
  63. setMessageList(updatedMessage)
  64. }
  65. // 设置共开的按钮点击事件
  66. const setupClickHandler = () => {
  67. postMessagePublic(selectCheckbox, 1)
  68. }
  69. // 留言的确定事件
  70. const handleFinish = (value: { Content: string }) => {
  71. console.log(value)
  72. applyCheckColumnNote(replyItemID, value.Content, replyParentId)
  73. }
  74. // 留言的取消事件
  75. const handleOnModalClose = () => {
  76. form.resetFields()
  77. setMsgTextVisible(false)
  78. }
  79. //删除留言回复的按钮
  80. const deleteHandle = (id: number) => {
  81. Modal.confirm({
  82. title: '提醒',
  83. content: '确定要删除此回复内容吗?',
  84. okText: '确定',
  85. cancelText: '取消',
  86. centered: true,
  87. closable: true,
  88. onOk: () => {
  89. postMessageDelete(id)
  90. }
  91. })
  92. }
  93. // 点击回复的按钮
  94. const replyMsgHandler = (item: IMessageDetail) => {
  95. setReplyItemID(item.YanxuanSpecialId)
  96. setReplyreplyParentId(item.MessageId)
  97. setMsgTextVisible(true)
  98. }
  99. // 点击了置顶按钮
  100. const toppingHandler = (item: IMessageDetail) => {
  101. const DoType = item.TopTime > 0 ? 0 : 1
  102. postMessageTop(item.MessageId, DoType)
  103. }
  104. // 点击取消精选
  105. const cancelSelectionHandler = (item: IMessageDetail) => {
  106. Modal.confirm({
  107. title: '提醒',
  108. content: '取消精选后,留言将回到普通留言栏下',
  109. okText: '确定',
  110. cancelText: '取消',
  111. centered: true,
  112. closable: true,
  113. onOk: () => {
  114. postMessagePublic([item.MessageId], 0)
  115. }
  116. })
  117. }
  118. // 文章详情
  119. const handleToDetail = (item: IMessageDetail) => {
  120. window.open(`/column/detail/${item.YanxuanSpecialId}`)
  121. }
  122. const items: TabsProps['items'] = [
  123. {
  124. key: '1',
  125. label: <span className="column-tabs">普通留言</span>,
  126. children: (
  127. <div className="columncenter-content">
  128. <div className="content-disclosure">
  129. <span
  130. className={selectCheckbox.length ? 'columncenter-content-btn' : 'columncenter-content-btn btn-disabled'}
  131. onClick={setupClickHandler}
  132. >
  133. 设为公开
  134. </span>
  135. <span> 留言设为公开后将在文章下展示</span>
  136. </div>
  137. {messageList.length > 0 &&
  138. messageList.map(item => (
  139. <div key={item.MessageId}>
  140. <Checkbox.Group
  141. style={{ display: 'block' }}
  142. value={item.CheckIds}
  143. onChange={(e: CheckboxValueType[]) => {
  144. checkboxChange(e, item)
  145. }}
  146. >
  147. <Checkbox value={item.MessageId}>
  148. <span style={{ fontWeight: '600' }}>{item.Content}</span>
  149. </Checkbox>
  150. <div className="columncenter-content-img-time">
  151. <img src={item.Headimgurl} alt="" />
  152. <span> {item.CreateTime}</span>
  153. </div>
  154. <div className="columncenter-content-item-title">
  155. <p className="item-title" onClick={() => handleToDetail(item)}>
  156. {item.SourceTitle}
  157. </p>
  158. <span className="columncenter-content-btn" onClick={() => replyMsgHandler(item)}>
  159. 回复
  160. </span>
  161. </div>
  162. <div className="columncenter-content-child">
  163. {item.ChildList.length > 0 &&
  164. item.ChildList.map(child => (
  165. <div key={child.MessageId} style={{ marginLeft: 20 }}>
  166. <Checkbox disabled={item.CheckIds.includes(item.MessageId)} value={child.MessageId}>
  167. {child.Content}
  168. </Checkbox>
  169. <div className="child-img-time">
  170. <div className="columncenter-content-img-time">
  171. <img src={child.Headimgurl} alt="" />
  172. <span> {child.CreateTime}</span>
  173. </div>
  174. <span
  175. className="columncenter-content-btn detele-btn"
  176. onClick={() => deleteHandle(child.MessageId)}
  177. >
  178. 删除
  179. </span>
  180. </div>
  181. </div>
  182. ))}
  183. </div>
  184. </Checkbox.Group>
  185. </div>
  186. ))}
  187. </div>
  188. )
  189. },
  190. {
  191. key: '2',
  192. label: <span className="column-tabs">公开的留言</span>,
  193. children: (
  194. <div className="columncenter-content">
  195. {messageList &&
  196. messageList.length > 0 &&
  197. messageList.map(item => (
  198. <div key={item.MessageId} style={{ marginBottom: 30 }}>
  199. <div className="columncenter-content-disclosure"> {item.Content}</div>
  200. <div className="columncenter-content-img-time">
  201. <span> {item.RealName}</span>
  202. <span style={{ marginLeft: 10 }}> {item.CreateTime}</span>
  203. </div>
  204. <div className="columncenter-content-item-title">
  205. <p className="item-title" onClick={() => handleToDetail(item)}>
  206. {item.SourceTitle}
  207. </p>
  208. <div>
  209. <span className="columncenter-content-btn" onClick={() => toppingHandler(item)}>
  210. {item.TopTime > 0 ? '已置顶' : '置顶'}
  211. </span>
  212. <span
  213. style={{ marginLeft: 10 }}
  214. className="columncenter-content-btn"
  215. onClick={() => cancelSelectionHandler(item)}
  216. >
  217. 取消精选
  218. </span>
  219. </div>
  220. </div>
  221. {item.ChildList.length > 0 &&
  222. item.ChildList.map(child => (
  223. <div key={child.MessageId} style={{ marginLeft: 20 }}>
  224. <div className="columncenter-content-disclosure"> {child.Content}</div>
  225. {child.CreateTime}
  226. </div>
  227. ))}
  228. </div>
  229. ))}
  230. </div>
  231. )
  232. }
  233. ]
  234. // 点击了tabs的change
  235. const onChange = (key: string) => {
  236. setMessageList([])
  237. setSelectCheckbox([])
  238. setTabsAct(Number(key))
  239. getColumnManageList(pageSize, currentIndex, Number(key))
  240. }
  241. // 关闭了侧边Drawer
  242. const handleOnClose = () => {
  243. props.onClose('openMessage')
  244. }
  245. // 留言的回复
  246. const { run: applyCheckColumnNote } = useRequest(ColumnService.postMessageAdd, {
  247. manual: true,
  248. onSuccess: res => {
  249. res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
  250. setMsgTextVisible(false)
  251. getColumnManageList(pageSize, currentIndex, tabsAct)
  252. }
  253. })
  254. // 删除留言的接口
  255. const { run: postMessageDelete } = useRequest(ColumnService.postMessageDelete, {
  256. manual: true,
  257. onSuccess: res => {
  258. res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
  259. getColumnManageList(pageSize, currentIndex, tabsAct)
  260. }
  261. })
  262. // 精选留言的接口
  263. const { run: postMessagePublic } = useRequest(ColumnService.postMessagePublic, {
  264. manual: true,
  265. onSuccess: res => {
  266. res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
  267. getColumnManageList(pageSize, currentIndex, tabsAct)
  268. }
  269. })
  270. // 置顶留言的接口
  271. const { run: postMessageTop } = useRequest(ColumnService.postMessageTop, {
  272. manual: true,
  273. onSuccess: res => {
  274. res.data.Success ? message.success(res.data.Msg) : message.error(res.data.Msg || res.data.ErrMsg)
  275. getColumnManageList(pageSize, currentIndex, tabsAct)
  276. }
  277. })
  278. return (
  279. <Drawer
  280. title="留言管理"
  281. placement="right"
  282. width="625px"
  283. closable={false}
  284. onClose={handleOnClose}
  285. open={props.open}
  286. extra={<Close className="com-cursor-p" onClick={handleOnClose} />}
  287. className={styles['columnindex-drawer']}
  288. >
  289. <Modal title="留言回复" centered open={msgTextVisible} onCancel={handleOnModalClose} footer={null}>
  290. <Form form={form} onFinish={handleFinish} labelAlign="left" preserve>
  291. <Item
  292. label=""
  293. name="Content"
  294. wrapperCol={{ span: 24 }}
  295. rules={[
  296. { required: true, message: '请输入内容!' },
  297. {
  298. pattern: /^[^\s]*$/,
  299. message: '禁止输入空格'
  300. }
  301. ]}
  302. >
  303. <Input.TextArea
  304. placeholder="留言回复将私信给读者,设为公开后可在文章下展示"
  305. maxLength={100}
  306. showCount={true}
  307. autoSize={{ minRows: 5, maxRows: 5 }}
  308. />
  309. </Item>
  310. <Row align="middle" justify="center">
  311. <Item>
  312. <Button onClick={handleOnModalClose} className="m-r-xs">
  313. 取消
  314. </Button>
  315. <Button type="primary" htmlType="submit">
  316. 提交
  317. </Button>
  318. </Item>
  319. </Row>
  320. </Form>
  321. </Modal>
  322. <Tabs defaultActiveKey={'1'} items={items} onChange={onChange} className="columnindex-tab-wrapper" />
  323. </Drawer>
  324. )
  325. }
  326. export default ColumnMessage