index.tsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. import React, { useEffect, useCallback, useMemo, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import { useDispatch, useSelector } from 'react-redux'
  4. import { Clue_APIgetClueList, getTopinfo } from '@/store/action/clue'
  5. import { RootState } from '@/store'
  6. import store from '@/store'
  7. import { ClueItem } from '@/types/api/clue'
  8. import { baseURL } from '@/utils/http'
  9. import classNames from 'classnames'
  10. import { Pagination } from 'antd'
  11. import ImageLazy from '@/components/ImageLazy'
  12. type LeftProps = {
  13. classN?: string
  14. }
  15. function Left(props: LeftProps) {
  16. const dispatch = useDispatch()
  17. const [topInfo, setTopInfo] = useState<any>()
  18. const [pagination, setPagination] = useState({
  19. current: 1,
  20. pageSize: 20
  21. })
  22. const [isFound, setIsFound] = useState<boolean>(false)
  23. const getListFu = useCallback(
  24. (pageNum: number, pageSize: number) => {
  25. dispatch(
  26. Clue_APIgetClueList({
  27. pageNum: pageNum,
  28. pageSize: pageSize,
  29. ...(isFound ? { status: 2 } : {})
  30. })
  31. )
  32. },
  33. [dispatch, isFound]
  34. )
  35. const getTopinfoFu = useCallback(async () => {
  36. const res = await dispatch(getTopinfo() as any)
  37. console.log('res', JSON.parse(res.rtf))
  38. setTopInfo(JSON.parse(res.rtf))
  39. }, [dispatch])
  40. const { list: listAll, total } = useSelector((state: RootState) => state.Clue.tableInfo)
  41. useEffect(() => {
  42. getTopinfoFu()
  43. }, [getTopinfoFu])
  44. // 状态:0:待确认 | 1:跟进中 | 2:已找到 | 3:未找到 | 4:作废
  45. useEffect(() => {
  46. getListFu(pagination.current, pagination.pageSize)
  47. }, [getListFu, pagination])
  48. // 预览视频
  49. const lookFileFu = useCallback((file: string) => {
  50. store.dispatch({
  51. type: 'layout/lookDom',
  52. payload: { src: file, type: 'video' }
  53. })
  54. }, [])
  55. return (
  56. <div className={classNames(styles.Left, props.classN)}>
  57. <div className='infoContainer'>
  58. <div className='topInfo'>
  59. <div className='topInfoItem'>
  60. <div className='title'>
  61. <img src={require('@/assets/img/buried.png')} alt='' />
  62. <div>安葬烈士</div>
  63. </div>
  64. <div className='num'>{topInfo?.[0].pcs}</div>
  65. </div>
  66. <div className='topInfoItem'>
  67. <div className='title'>
  68. <img src={require('@/assets/img/person.png')} alt='' />
  69. <div>有名烈士</div>
  70. </div>
  71. <div className='num'>{topInfo?.[1].pcs}</div>
  72. </div>
  73. <div className='topInfoItem'>
  74. <div className='title'>
  75. <img src={require('@/assets/img/person.png')} alt='' />
  76. <div>无名烈士</div>
  77. </div>
  78. <div className='num'>{topInfo?.[2].pcs}</div>
  79. </div>
  80. <div className='topInfoItem'>
  81. <div className='title'>
  82. <img src={require('@/assets/img/finding.png')} alt='' />
  83. <div>寻亲中</div>
  84. </div>
  85. <div className='num'>{topInfo?.[3].pcs}</div>
  86. </div>
  87. <div className='topInfoItem'>
  88. <div className='title'>
  89. <img src={require('@/assets/img/found.png')} alt='' />
  90. <div>已找到</div>
  91. </div>
  92. <div className='num'>{topInfo?.[4].pcs}</div>
  93. </div>
  94. </div>
  95. <div className='mainInfoBox'>
  96. <div className='tab'>
  97. <div
  98. className={isFound ? 'active' : ''}
  99. onClick={() => {
  100. setIsFound(true)
  101. setPagination({ current: 1, pageSize: 20 })
  102. }}
  103. >
  104. 寻亲案例
  105. </div>
  106. <div
  107. className={!isFound ? 'active' : ''}
  108. onClick={() => {
  109. setIsFound(false)
  110. setPagination({ current: 1, pageSize: 20 })
  111. }}
  112. >
  113. 线索更新
  114. </div>
  115. </div>
  116. <div className='mainInfoListBox'>
  117. <div className='slide'></div>
  118. <div className='mainInfoList'>
  119. {listAll?.map((item: ClueItem) => {
  120. return (
  121. <div className='mainInfo' key={item.id}>
  122. <div className='labelList'>
  123. <div className='label'>{item.type}</div>
  124. <div className='label'>{item.status}</div>
  125. </div>
  126. <div className='name'>烈士:{item.martyrName}</div>
  127. <div className='address'>
  128. {item.city + item.region + item.address}
  129. </div>
  130. {item.remark && <div className='content'>{item.remark}</div>}
  131. {item.result && <div className='content'>{item.result}</div>}
  132. {(item.img || item.video) && (
  133. <div className='media'>
  134. <>
  135. {item.img?.map((item: any, index: number) => {
  136. return (
  137. <ImageLazy
  138. width={'32%'}
  139. height={'70px'}
  140. src={item.thumb}
  141. srcBig={item.filePath}
  142. key={index}
  143. />
  144. )
  145. })}
  146. {item.video?.map((item: any, index: number) => {
  147. return (
  148. <video
  149. onClick={e => {
  150. e.stopPropagation()
  151. lookFileFu(item.filePath)
  152. }}
  153. src={baseURL + item.thumb}
  154. key={index}
  155. />
  156. )
  157. })}
  158. </>
  159. </div>
  160. )}
  161. <div className='updateTime'>更新时间:{item.updateTime}</div>
  162. </div>
  163. )
  164. })}
  165. <Pagination
  166. total={total}
  167. simple
  168. defaultPageSize={pagination.pageSize}
  169. defaultCurrent={pagination.current}
  170. current={pagination.current}
  171. onChange={(page, size) => {
  172. setPagination({ current: page, pageSize: size })
  173. getListFu(page, size)
  174. }}
  175. />
  176. </div>
  177. </div>
  178. </div>
  179. </div>
  180. </div>
  181. )
  182. }
  183. const MemoLeft = React.memo(Left)
  184. export default MemoLeft