index.tsx 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. import React, { useCallback, useState, useEffect } from 'react'
  2. import styles from './index.module.scss'
  3. import A21vrOff from './components/A21vrOff'
  4. import A22hotListWrap from './components/A22hotListWrap'
  5. import A23pinTop from './components/A23pinTop'
  6. import A24drawerList from './components/A24drawerList'
  7. import { useSelector } from 'react-redux'
  8. import { RootState } from '@/store'
  9. import classNames from 'classnames'
  10. import A3hotList from '../A3hotList'
  11. import shareImg from '@/assets/img/share.png'
  12. import { message } from 'antd'
  13. import http from '@/utils/http'
  14. const imgArrTemp = ['like.png', 'likeAc.png']
  15. const imgArr = imgArrTemp.map(item => require(`@/assets/img/${item}`))
  16. function A2main() {
  17. const sceneCode = 'SG-dwRgbFq7Fiz'
  18. useEffect(() => {
  19. http.get(`https://count.4dage.com/api/count/detail/${sceneCode}`).then(res => {
  20. setLikeNum(res.data.starSum)
  21. })
  22. }, [])
  23. // 漫游的状态
  24. const { state3d } = useSelector((state: RootState) => state.three)
  25. // 点赞
  26. const [like, setLike] = useState(false)
  27. const [likeNum, setLikeNum] = useState(1)
  28. // 点击点赞
  29. const likeFu = useCallback(() => {
  30. if (like) return
  31. setLike(true)
  32. setTimeout(() => {
  33. http.get(`https://count.4dage.com/api/count/saveStar/${sceneCode}`).then(res => {
  34. setLikeNum(likeNum + 1)
  35. setLike(false)
  36. })
  37. }, 2000)
  38. }, [like, likeNum])
  39. // 点击分享
  40. const handleShareClick = () => {
  41. navigator.clipboard.writeText(window.location.href)
  42. message.success('链接已复制到剪贴板')
  43. }
  44. // 点击热点列表
  45. const [hotListShow, setHotListShow] = useState(false)
  46. return (
  47. <div className={styles.A2main} id='gui' style={{ display: 'none' }}>
  48. <A21vrOff />
  49. <A22hotListWrap />
  50. {/* 顶部介绍 */}
  51. <A23pinTop />
  52. {/* 主要修改的图标部分 */}
  53. <div
  54. className={classNames(
  55. 'pinBottom-container',
  56. state3d === 'panorama' ? '' : 'pinBottom-containerNo'
  57. )}
  58. >
  59. <div className='pinBottom center'>
  60. <div id='view-controllers'></div>
  61. </div>
  62. <div className='pinBottom left'>
  63. <div className='viewContainer'>
  64. <div
  65. id='previous'
  66. className='previous desktop-only ui-icon'
  67. style={{ display: 'none' }}
  68. >
  69. {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
  70. <a>
  71. <img
  72. rel='tooltip'
  73. src='images/play.png'
  74. width='24'
  75. height='24'
  76. data-original-title='播放'
  77. alt=''
  78. />
  79. </a>
  80. </div>
  81. <div id='gui-modes-map' className='ui-icon double active'>
  82. <div id='play' className='ui-icon' rel='tooltip' data-original-title='播放'>
  83. {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
  84. <a>
  85. <img src='images/play.png' alt='' />
  86. </a>
  87. {/* 鼠标移入 */}
  88. <div className='hoveImg'>自动导览</div>
  89. </div>
  90. <div id='pause' className='ui-icon' rel='tooltip' style={{ display: 'none' }}>
  91. {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
  92. <a>
  93. <img src='images/pause.png' alt='' />
  94. </a>
  95. {/* 鼠标移入 */}
  96. <div className='hoveImg'>暂停导览</div>
  97. </div>
  98. <div id='next' className='next desktop-only ui-icon wide' style={{ display: 'none' }}>
  99. {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
  100. <a>
  101. <i
  102. rel='tooltip'
  103. title=''
  104. className='icon icon-dpad-right'
  105. data-original-title='下一个'
  106. ></i>
  107. </a>
  108. </div>
  109. <div data-original-title='导览' id='pullTab' rel='tooltip' title=''>
  110. <img className='icon icon-inside' src='images/auto.png' alt='' />
  111. {/* 鼠标移入 */}
  112. <div className='hoveImg'>导览列表</div>
  113. </div>
  114. {/* 原始热点列表---隐藏 */}
  115. <div
  116. data-original-title='热点列表'
  117. id='hotList'
  118. rel='tooltip'
  119. style={{ display: 'none' }}
  120. >
  121. <img
  122. className='icon icon-inside'
  123. src='images/hotlist.png'
  124. title='热点列表'
  125. alt=''
  126. />
  127. </div>
  128. <div data-original-title='全景漫游' id='gui-modes-inside' rel='tooltip'>
  129. <img
  130. className='icon icon-inside'
  131. src={`images/inside${state3d === 'panorama' ? '_active' : ''}.png`}
  132. alt=''
  133. />
  134. {/* 鼠标移入 */}
  135. <div className='hoveImg'>全景漫游</div>
  136. </div>
  137. <div data-original-title='迷你模型' id='gui-modes-dollhouse' rel='tooltip'>
  138. <img
  139. className='icon icon-inside'
  140. src={`images/dollhouse${state3d === 'dollhouse' ? '_active' : ''}.png`}
  141. alt=''
  142. />
  143. {/* 鼠标移入 */}
  144. <div className='hoveImg'>三维视觉</div>
  145. </div>
  146. <div data-original-title='俯视图' id='gui-modes-floorplan' rel='tooltip'>
  147. <img
  148. className='icon icon-inside'
  149. src={`images/floor${state3d === 'floorplan' ? '_active' : ''}.png`}
  150. alt=''
  151. />
  152. {/* 鼠标移入 */}
  153. <div className='hoveImg'>平面视觉</div>
  154. </div>
  155. <div
  156. data-original-title='消除外壳'
  157. id='gui-remove-face'
  158. rel='tooltip'
  159. title=''
  160. style={{ display: 'none', float: 'left' }}
  161. >
  162. <img className='icon icon-inside' src='images/face.jpg' alt='' />
  163. </div>
  164. {/* 新的热点列表 */}
  165. {/* <div
  166. className='A2hotIcon'
  167. rel='tooltip'
  168. onClick={() => {
  169. // 停止自动导览
  170. window.player.director.stopTour()
  171. setHotListShow(true)
  172. }}
  173. >
  174. <img src='images/hotlist.png' alt='' />
  175. <div className='hoveImg'>热点列表</div>
  176. </div> */}
  177. </div>
  178. </div>
  179. </div>
  180. <div className='pinBottom right hideTarget'>
  181. <div className='rightViewContainer clearfix'>
  182. <div className='gui-floor'>
  183. <div className='gui-floor-title'></div>
  184. <div className='gui-floor-icon'>
  185. <span className='gui-floor-number'></span>
  186. </div>
  187. <div className='container'></div>
  188. </div>
  189. {/* 点赞 */}
  190. <div className='likeBox' onClick={likeFu}>
  191. <img src={imgArr[0]} alt='' />
  192. {/* 鼠标移入 */}
  193. <div className='hoveImg'>{likeNum}点赞</div>
  194. {/* <div className='likeNum'>{likeNum}</div> */}
  195. <div className={classNames('likeMove', like ? 'likeMoveAc' : '')}>+1</div>
  196. </div>
  197. <div
  198. data-original-title='VR'
  199. id='vr'
  200. rel='tooltip'
  201. title=''
  202. style={{ display: 'none' }}
  203. >
  204. <img className='icon icon-inside' src='images/VR.png' title='VR' alt='' />
  205. </div>
  206. <div id='volume' className='ui-icon wide'>
  207. {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
  208. <a>
  209. <img src='images/Volume btn_on.png' alt='' />
  210. </a>
  211. {/* 鼠标移入 */}
  212. <div className='hoveImg'>音乐开关</div>
  213. </div>
  214. <div className='A2_share_box' onClick={handleShareClick}>
  215. <img src={shareImg} alt='' />
  216. <div className='A2_share_text'>分享</div>
  217. </div>
  218. <div id='vr' className='ui-icon wide hidden' style={{ display: 'none' }}>
  219. {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
  220. <a>
  221. <i rel='tooltip' title='{[{ VIEW_IN_VR }]}' className='icon icon-webvr'></i>
  222. </a>
  223. </div>
  224. <div id='sharing' className='ui-icon wide hidden' style={{ display: 'none' }}>
  225. {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
  226. <a>
  227. <i rel='tooltip' title='{[{ SOCIAL_SHARING }]}' className='icon icon-share'></i>
  228. </a>
  229. </div>
  230. <div
  231. id='gui-fullscreen'
  232. className='ui-icon wide'
  233. style={{ display: 'none' }}
  234. data-placement='top'
  235. rel='tooltip'
  236. >
  237. {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
  238. <a>
  239. <img src='images/full.png' alt='' />
  240. </a>
  241. {/* 鼠标移入 */}
  242. <div className='hoveImg'>全屏</div>
  243. </div>
  244. <div
  245. id='gui-fullscreen-exit'
  246. className='ui-icon wide'
  247. data-placement='top'
  248. rel='tooltip'
  249. style={{ display: 'none' }}
  250. >
  251. {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
  252. <a>
  253. <img src='images/fullx.png' alt='' />
  254. </a>
  255. {/* 鼠标移入 */}
  256. <div className='hoveImg'>关闭全屏</div>
  257. </div>
  258. <div className='pull-right terms terms2'>
  259. {/* eslint-disable-next-line jsx-a11y/anchor-is-valid */}
  260. <a>{'{[{ TERMS }]}'}</a>
  261. </div>
  262. </div>
  263. </div>
  264. </div>
  265. {/* 底部导览列表 */}
  266. <A24drawerList />
  267. {/* 热点列表 */}
  268. <A3hotList show={hotListShow} closeFu={() => setHotListShow(false)} />
  269. </div>
  270. )
  271. }
  272. const MemoA2main = React.memo(A2main)
  273. export default MemoA2main