ResearchActivity.tsx 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import React, { useEffect, useState } from 'react'
  2. import { useHistory } from 'react-router-dom'
  3. import useRequest from '@ahooksjs/use-request/es'
  4. import { List, Spin, message } from 'antd'
  5. import { ReactComponent as CityImg } from 'assets/city.svg'
  6. import { default as ResearchActivitySvg } from 'assets/reseachactivity.svg'
  7. import { default as RecommendSvg } from 'assets/recommend.svg'
  8. import { default as GoingSvg } from 'assets/going.svg'
  9. import { default as WaitSvg } from 'assets/wait.svg'
  10. import { default as EndSvg } from 'assets/end.svg'
  11. import EmptyImg from 'assets/emptydata.png'
  12. import { useMedia } from 'Context/Media/MediaContext'
  13. import { ActivityService, IActivityTypeListItem } from 'Activity/Activity.service'
  14. import { INewPermissionType } from 'Material/components/NoPermission'
  15. import ActivityBtnComponent from 'Activity/components/ActivityBtn.component'
  16. import { IStateStringType } from 'Activity/components/ActivityBtn.component'
  17. import styles from '../css/ResearchActivity.module.scss'
  18. /**研选活动 */
  19. const ResearchActivity: React.FC = () => {
  20. const history = useHistory()
  21. const media = useMedia()
  22. const [currentPage, setCurrentPage] = useState<number>(1)
  23. const [pageSize, setPageSize] = useState<number>(10)
  24. const [actTypeID, setActTypeID] = useState<number | undefined>(undefined) // 活动类型,公司调研电话会-3
  25. const [actState, setActState] = useState<IStateStringType | undefined>(undefined) // 活动进行状态
  26. // 研选活动列表
  27. const {
  28. data: actData,
  29. loading: activityListLoading,
  30. run: getResearchActivityList
  31. } = useRequest(ActivityService.getActivityTypeList, {
  32. manual: true,
  33. formatResult: response => response.data.Data
  34. })
  35. // 获取易懂链接
  36. const { run: getYidongUrl } = useRequest(ActivityService.getYidongActivityDetail, {
  37. manual: true,
  38. onSuccess: res => {
  39. res.data.Data?.YidongActivityUrl && window.open(res.data.Data?.YidongActivityUrl, '_blank')
  40. }
  41. })
  42. useEffect(() => {
  43. getResearchActivityList({ PageSize: pageSize, CurrentIndex: 1, IsResearch: true })
  44. // eslint-disable-next-line react-hooks/exhaustive-deps
  45. }, [])
  46. // 跳转到详情页
  47. const handleToDetail = (item: IActivityTypeListItem) => {
  48. if (
  49. item?.AuthInfo?.HasPermission &&
  50. item?.AuthInfo?.HasPermission !== INewPermissionType.OK &&
  51. (item?.YidongActivityUrl || (item as IActivityTypeListItem)?.IsYidongActivity)
  52. ) {
  53. return message.error('您暂无权限参加此活动,若想参加可以申请开通对应的试用权限')
  54. }
  55. // 易懂同步过来的活动 直接跳转
  56. if ((item as IActivityTypeListItem)?.IsYidongActivity) {
  57. item.ActivityId && getYidongUrl(item.ActivityId)
  58. return
  59. }
  60. if (item?.YidongActivityUrl) {
  61. window.open(item.YidongActivityUrl)
  62. return
  63. }
  64. window.open(`${window.location.origin}/activity/detail/${(item as IActivityTypeListItem).ActivityId}`)
  65. }
  66. // 筛选进行中/已结束
  67. const handleSelectState = (state: IStateStringType) => {
  68. setActState(state === actState ? undefined : state)
  69. getResearchActivityList({
  70. PageSize: pageSize,
  71. CurrentIndex: 1,
  72. IsResearch: true,
  73. ActiveState: state === actState ? undefined : state,
  74. ActivityTypeId: actTypeID
  75. })
  76. }
  77. // 筛选公司调研电话会
  78. const handleSelectType = (type: number) => {
  79. setActTypeID(actTypeID ? undefined : type)
  80. getResearchActivityList({
  81. PageSize: pageSize,
  82. CurrentIndex: 1,
  83. IsResearch: true,
  84. ActiveState: actState,
  85. ActivityTypeId: actTypeID ? undefined : type
  86. })
  87. }
  88. const handleGetActivityData = (page: number, pageSize: number) => {
  89. setCurrentPage(page)
  90. setPageSize(pageSize)
  91. getResearchActivityList({
  92. PageSize: pageSize,
  93. CurrentIndex: page,
  94. IsResearch: true,
  95. ActiveState: actState,
  96. ActivityTypeId: actTypeID
  97. })
  98. window.scrollTo(0, 0)
  99. }
  100. const stateString = [
  101. { state: IStateStringType.Waitting, name: '未开始', className: 'waitting-label', icon: WaitSvg },
  102. { state: IStateStringType.Going, name: '进行中', className: 'going-label', icon: GoingSvg },
  103. { state: IStateStringType.End, name: '已结束', className: 'end-label', icon: EndSvg }
  104. ]
  105. const formatState = (state: string, type: 'name' | 'className' | 'icon') => {
  106. const findItem = stateString.find(item => item.state === state)
  107. return findItem ? findItem[type] : ''
  108. }
  109. return (
  110. <div className={styles['research-activity-wrapper']}>
  111. <div className="research-title-box">
  112. <div className="research-title">
  113. <img src={ResearchActivitySvg} alt="icon" className="research-act-icon" />
  114. <strong>研选活动</strong>
  115. </div>
  116. <div className="research-select">
  117. <div
  118. className={`research-select-item ${actState === IStateStringType.Going ? 'research-select-active' : ''}`}
  119. onClick={handleSelectState.bind(this, IStateStringType.Going)}
  120. >
  121. 进行中
  122. </div>
  123. <div
  124. className={`research-select-item ${actState === IStateStringType.End ? 'research-select-active' : ''}`}
  125. onClick={handleSelectState.bind(this, IStateStringType.End)}
  126. >
  127. 已结束
  128. </div>
  129. <div
  130. className={`research-select-item ${actTypeID === 3 ? 'research-select-active' : ''}`}
  131. onClick={handleSelectType.bind(this, 3)}
  132. >
  133. 公司调研电话会
  134. </div>
  135. </div>
  136. </div>
  137. <Spin spinning={activityListLoading}>
  138. {!activityListLoading && actData?.List?.length === 0 ? (
  139. <div className={styles['list-empty']}>
  140. <img src={EmptyImg} alt="没有数据" className="empty-img" />
  141. <span className="list-empty-text">暂无对应活动</span>
  142. </div>
  143. ) : (
  144. <List
  145. dataSource={actData?.List || []}
  146. renderItem={item => (
  147. <div
  148. className={`research-act-item ${item.ActivityType === 1 ? 'act-online-item' : 'act-underline-item'}`}
  149. onClick={handleToDetail.bind(this, item)}
  150. >
  151. <div className={`act-status-wrapper ${formatState(item.ActiveState, 'className')}`}>
  152. <img src={formatState(item.ActiveState, 'icon')} alt="icon" className="act-status-icon" />
  153. {formatState(item.ActiveState, 'name')}
  154. </div>
  155. <div className="research-act-oneline">
  156. <div className="research-act-state">{item.ActivityType === 1 ? '线上' : '线下'}</div>
  157. <div className="research-act-label no-wrap">{item.ActivityTypeName}</div>
  158. <div className="research-act-label no-wrap">{item.Label}</div>
  159. </div>
  160. <div className="research-act-title-line">
  161. {item.TopTime > 0 && item.ActiveState === IStateStringType.Waitting && (
  162. <img src={RecommendSvg} alt="icon" className="recommend-icon" />
  163. )}
  164. {item.IsResearchPoints ? (
  165. <div className="mfyx-label-normal mfyx-label-kd no-wrap">扣点</div>
  166. ) : item.IsExternalLabel ? (
  167. <div className="mfyx-label-normal mfyx-label-wbzy no-wrap">外部资源</div>
  168. ) : null}
  169. <span className="research-act-title">{item.ActivityName}</span>
  170. </div>
  171. <div className="research-act-time-line">
  172. <span className="research-act-time">{item.ActivityTimeText}</span>
  173. {item.City && (
  174. <span className="research-act-city">
  175. <CityImg fill="#FAA12F" className="city-icon" />
  176. <span>{item.City}</span>
  177. </span>
  178. )}
  179. </div>
  180. <div className="research-act-btn-line">
  181. <ActivityBtnComponent
  182. item={item}
  183. selfChange={true}
  184. btnSpaceSize={media.isBigMax ? 8 : 20}
  185. btnGrous={'bigcard'}
  186. />
  187. </div>
  188. </div>
  189. )}
  190. pagination={{
  191. current: currentPage,
  192. total: actData?.Paging.Totals,
  193. hideOnSinglePage: true,
  194. showSizeChanger: true,
  195. showQuickJumper: true,
  196. responsive: true,
  197. pageSize: pageSize,
  198. pageSizeOptions: [10, 20, 50, 100],
  199. onChange: handleGetActivityData
  200. }}
  201. />
  202. )}
  203. </Spin>
  204. </div>
  205. )
  206. }
  207. export default ResearchActivity