index.tsx 12 KB

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