index.jsx 7.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. import { useState, useEffect } from 'react'
  2. import Taro from '@tarojs/taro'
  3. import withLayout from '@/layout'
  4. import { ScrollView, Image, Button } from '@tarojs/components'
  5. import ProjectListItem from '@/components/ProjectListItem/index'
  6. import { useSelector } from 'react-redux'
  7. import { fetch } from '@/utils/request'
  8. import { API_CARDS_UV, API_ITEMS_DETAIL, API_CARDS_LIST } from '@/constants/api'
  9. import { getImgURL } from '@/utils/image'
  10. import useLike from "@/utils/hooks/useLike";
  11. import '@/assets/css/iconfont.css'
  12. import './index.scss'
  13. export default withLayout((props) => {
  14. const { router, trackData } = props
  15. const { id } = router.params
  16. const [IsPull, setPull] = useState(false)
  17. const [ShowPopup, setShowPopup] = useState(false)
  18. const [PullTimer, setPullTimer] = useState(null)
  19. const [UserInfo, setUserInfo] = useState({})
  20. const [BuildingInfo, setBuildingInfo] = useState({})
  21. const [LikeNum, setLikeNum] = useState(0)
  22. const user = useSelector(state => state.user)
  23. const [PersonId, setPersonId] = useState(null)
  24. const [isSave, handleFavor] = useLike(UserInfo?.liked, {
  25. id: id || user.userInfo.person.personId,
  26. ...trackData,
  27. eventType: 'consultant'
  28. }, () => {
  29. if(!isSave) {
  30. AddHotNum()
  31. }
  32. const likeNum = isSave ? UserInfo.likeNum - 1 : UserInfo.likeNum + 1
  33. setLikeNum(likeNum)
  34. })
  35. useEffect(() => {
  36. if(UserInfo.id) {
  37. setLikeNum(UserInfo.likeNum)
  38. }
  39. }, [UserInfo])
  40. useEffect(() => {
  41. if (PersonId !== user.userInfo.person.personId) {
  42. if(id) {
  43. fetch({ url: `${API_CARDS_LIST}/${id}`, method: 'get' }).then((res) => {
  44. setUserInfo(res)
  45. })
  46. } else {
  47. setPersonId(user.userInfo.person.personId)
  48. }
  49. }
  50. }, [user])
  51. useEffect(() => {
  52. if (PersonId) {
  53. // GetUserInfo()
  54. fetch({ url: `${API_CARDS_LIST}/${PersonId}`, method: 'get' }).then((res) => {
  55. setUserInfo(res)
  56. })
  57. }
  58. }, [PersonId])
  59. useEffect(() => {
  60. if (UserInfo.buildingId && !BuildingInfo.buildingId) {
  61. GetBuildingInfo()
  62. }
  63. }, [UserInfo])
  64. const AddHotNum = () => {
  65. fetch({ url: API_CARDS_UV + `/${id || PersonId}`, method: 'post' }).then(() => {
  66. setUserInfo({...UserInfo, hotNum: (UserInfo.hotNum || 0) - 0 + 1})
  67. })
  68. }
  69. const GetBuildingInfo = () => {
  70. fetch({ url: `${API_ITEMS_DETAIL}/${UserInfo.buildingId}`, method: 'get', showToast: false }).then((res) => {
  71. setBuildingInfo(res)
  72. })
  73. }
  74. const PageRefresh = () => { // 页面下拉刷新回调
  75. setPull(true)
  76. }
  77. useEffect(() => { // 下拉刷新触发
  78. if (IsPull) {
  79. clearTimeout(PullTimer)
  80. setPullTimer(setTimeout(() => {
  81. setPull(false)
  82. }, 2000))
  83. }
  84. }, [IsPull])
  85. return (
  86. <view className='Page myHomepage'>
  87. <ScrollView scroll-y refresher-enabled refresher-triggered={IsPull} onrefresherrefresh={PageRefresh} refresher-background='#fff'>
  88. <view className='PageContent'>
  89. <view className='Card UserInfo'>
  90. <view className='flex-h Top'>
  91. <view className='Icon'>
  92. <Image mode='aspectFill' src={getImgURL(UserInfo.userPhoto || UserInfo.photo || UserInfo.avatarurl || UserInfo.avatar || UserInfo.picture)}></Image>
  93. </view>
  94. <view className='flex-item'>
  95. <view className='flex-h'>
  96. <view className='flex-item'>
  97. <text>{UserInfo.name} {UserInfo.phone}</text>
  98. </view>
  99. <text onClick={handleFavor} className='iconfont icon-dianzan' style={isSave ? { color: 'red' } : undefined}></text>
  100. <text onClick={handleFavor}>{isSave ? `已点赞` : '赞'}</text>
  101. </view>
  102. <view className='Tag'>
  103. <view>
  104. <Image mode='heightFix' src={require('@/assets/mine-icon28.png')}></Image>
  105. <text>金牌置业顾问</text>
  106. </view>
  107. </view>
  108. </view>
  109. </view>
  110. <view className='Work flex-h'>
  111. <view className='flex-item'>
  112. <text>{UserInfo.department || '-'}</text>
  113. <text>部门</text>
  114. </view>
  115. <view className='flex-item'>
  116. <text>{UserInfo.post || '-'}</text>
  117. <text>职位</text>
  118. </view>
  119. <view className='flex-item'>
  120. <text>{UserInfo.buildingName || '-'}</text>
  121. <text>楼盘</text>
  122. </view>
  123. </view>
  124. <view className='Hot flex-h'>
  125. <view className='flex-item'>
  126. {
  127. (UserInfo.visitRecords || []).map((item, index) => (
  128. <view key={`UserItem-${index}`}>
  129. <Image mode='aspectFill' src={item.avatar}></Image>
  130. </view>
  131. ))
  132. }
  133. </view>
  134. <text className='iconfont icon-renqi'></text>
  135. <text>人气值{(UserInfo.hotNum || 0) + 999}</text>
  136. </view>
  137. </view>
  138. <view className='Card DetailInfo'>
  139. <text className='Title'>详细信息</text>
  140. <view className='flex-h'>
  141. <text className='iconfont icon-dianhua'></text>
  142. <text>手机:</text>
  143. <view className='flex-item'>
  144. <text>{UserInfo.phone}</text>
  145. </view>
  146. </view>
  147. <view className='flex-h'>
  148. <text className='iconfont icon-dingwei'></text>
  149. <text>地址:</text>
  150. <view className='flex-item'>
  151. <text>{UserInfo.address || '暂无地址'}</text>
  152. </view>
  153. </view>
  154. <view className='flex-h'>
  155. <text className='iconfont icon-jianjie'></text>
  156. <text>简介:</text>
  157. <view className='flex-item'>
  158. <text className='active'>{UserInfo.description || '暂无简介'}</text>
  159. </view>
  160. </view>
  161. <view className='Btn'>
  162. <Button className='Share' open-type='share'>分享主页</Button>
  163. </view>
  164. </view>
  165. {
  166. !!BuildingInfo.buildingId &&
  167. <view className='ProjectList'>
  168. <view className='flex-h'>
  169. <view className='flex-item'>
  170. <text>项目信息</text>
  171. </view>
  172. <text onClick={() => { Taro.navigateTo({ url: `/pages/index/buildingList/index` }) }}>更多</text>
  173. <text className='iconfont icon-jiantouright'></text>
  174. </view>
  175. <view className='List'>
  176. <ProjectListItem Data={BuildingInfo}></ProjectListItem>
  177. </view>
  178. </view>
  179. }
  180. {/* bottom */}
  181. <view className='PageBottom'>
  182. <text>已经到底了~</text>
  183. </view>
  184. </view>
  185. </ScrollView>
  186. {
  187. ShowPopup &&
  188. <view className='SharePopup'>
  189. <view>
  190. <view className='flex-v'>
  191. <view className='Top flex-h'>
  192. <view className='flex-item'>
  193. <text>保存后分享图片</text>
  194. </view>
  195. <text className='iconfont icon-guanbi' onClick={() => { setShowPopup(false) }}></text>
  196. </view>
  197. <view className='flex-item'>
  198. <view>
  199. <view>
  200. <Image className='centerLabel' mode='aspectFill' src={null}></Image>
  201. </view>
  202. </view>
  203. </view>
  204. <view className='Btn'>
  205. <text>保存海报</text>
  206. </view>
  207. </view>
  208. </view>
  209. </view>
  210. }
  211. </view>
  212. )
  213. })