index.tsx 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. import React, { useCallback, useMemo, useState } from 'react'
  2. import styles from './index.module.scss'
  3. import BaseImg from '@/components/BaseImg'
  4. import { baseURL, isPc, myData } from '@/utils/http'
  5. import EndVideo from '@/components/EndVideo'
  6. import NextPage from '@/components/NextPage'
  7. import classNames from 'classnames'
  8. import FloorBtn from '@/components/FloorBtn'
  9. import HotIcon from '@/components/HotIcon'
  10. import Hot2 from '../A2visit/PanoVideo/Hot2'
  11. import { PlowHotType } from '@/types'
  12. import useLoding from '@/components/ownUse/useLoding'
  13. import BtnRight from '@/components/BtnRight'
  14. function A6plow() {
  15. // 初始显示和隐藏
  16. const [cutVideoShow, setCutVideoShow] = useState(false)
  17. // 控制视频播放的方法
  18. const videoPlayFu = useCallback((index: number) => {
  19. setTimeout(() => {
  20. const domAll: any = document.querySelectorAll('.A6video')
  21. if (domAll && domAll.length) {
  22. domAll.forEach((v: HTMLVideoElement, i: number) => {
  23. if (index === i) v.play()
  24. else {
  25. v.pause()
  26. v.currentTime = 0
  27. }
  28. })
  29. }
  30. }, 100)
  31. }, [])
  32. // 点击继续
  33. const btnStart = useCallback(() => {
  34. setCutVideoShow(true)
  35. }, [])
  36. // 点击 跳下一个章节
  37. const [lastVideo, setLastVideo] = useState(false)
  38. // 左侧按钮的选中
  39. const [leftAc, setLeftAc] = useState(0)
  40. const leftAcFu = useCallback(
  41. (index: number) => {
  42. videoPlayFu(index)
  43. setLeftAc(index)
  44. },
  45. [videoPlayFu]
  46. )
  47. // 底部文字
  48. const floorTxt = useMemo(() => {
  49. return myData.plow.info[leftAc].txt
  50. }, [leftAc])
  51. // 先加载背景图 序列帧等 在加载视频
  52. const { imgNow, imgNumFu } = useLoding(3)
  53. // 汉代庄园田耕记二维码
  54. const [code, setCode] = useState(false)
  55. // 蔬菜-庄家切换
  56. const [staCut, setStaCut] = useState('蔬菜')
  57. // useEffect(() => {
  58. // setLeftAc(0)
  59. // }, [staCut])
  60. // 打开热点
  61. const [acName, setAcName] = useState('')
  62. const hotInfo = useMemo(() => {
  63. let info = {} as PlowHotType
  64. const temp = [...myData.plow.isSSSArr, ...myData.plow.info[leftAc].hot]
  65. if (temp && temp.find(v => v.name === acName)) {
  66. info = temp.find(v => v.name === acName)
  67. }
  68. return info
  69. }, [acName, leftAc])
  70. return (
  71. <div className={styles.A6plow}>
  72. {/* 初始静态图 */}
  73. <BaseImg
  74. isShow={cutVideoShow}
  75. iconSrc={`${baseURL}plow/mulu.png`}
  76. parentFu={() => btnStart()}
  77. bgImg={`${baseURL}${myData.plow.baseImg}`}
  78. imgNow={imgNow}
  79. imgNumFu={imgNumFu}
  80. bird='tianJian'
  81. num={50}
  82. />
  83. {/* 蔬菜的盒子 */}
  84. <div
  85. className='A6SS'
  86. hidden={staCut !== '蔬菜'}
  87. style={{ backgroundImage: `url(${baseURL}plow/bg.jpg)` }}
  88. >
  89. {/* 热点 */}
  90. {myData.plow.isSSSArr.map((v: PlowHotType, i) => (
  91. <HotIcon
  92. isModel={v.isModel ? true : false}
  93. style={{
  94. top: v.locPage.top,
  95. left: v.locPage.left
  96. }}
  97. key={i}
  98. index={i}
  99. clickSon={() => setAcName(v.name)}
  100. hoverSrc={v.hoverSrc}
  101. isXiao={0.67}
  102. />
  103. ))}
  104. </div>
  105. {/* 底部2个按钮 */}
  106. {imgNow ? (
  107. <div className='A6floorBox' hidden={!cutVideoShow}>
  108. {myData.plow.flooBtn.map((v, i1) => (
  109. <div
  110. onClick={() => {
  111. setStaCut(v)
  112. // 每次切换都是播放第4个视频
  113. leftAcFu(0)
  114. }}
  115. className={classNames(v === staCut ? 'A6FrowAc' : '')}
  116. key={v}
  117. >
  118. {v}
  119. </div>
  120. ))}
  121. </div>
  122. ) : null}
  123. {/* 庄稼 主要内容 */}
  124. {imgNow ? (
  125. <div className={classNames('A6main', cutVideoShow ? 'A6mainShow' : '')}>
  126. {/* 左侧title */}
  127. <div
  128. className='A6Lbtn'
  129. hidden={staCut !== '庄稼'}
  130. style={{ backgroundImage: `url(${baseURL}plow/leftBg.png)` }}
  131. >
  132. {myData.plow.info.map((item, index) => (
  133. <div
  134. hidden={item.name === '施肥'}
  135. key={index}
  136. className='A6LbtnRow'
  137. onClick={() => leftAcFu(index)}
  138. style={{
  139. backgroundImage: `url(${baseURL}plow/left${leftAc === index ? 'Ac' : ''}.png)`,
  140. color: leftAc === index ? '#BD7656' : '#DACB8B'
  141. }}
  142. >
  143. {item.name}
  144. </div>
  145. ))}
  146. </div>
  147. {/* 底部文字 */}
  148. <div
  149. hidden={staCut !== '庄稼'}
  150. className='A6txt'
  151. style={{ backgroundImage: `url(${baseURL}plow/txtBg.png)` }}
  152. dangerouslySetInnerHTML={{ __html: floorTxt }}
  153. ></div>
  154. {/* 视频加热点 */}
  155. <div className='A6videoBox'>
  156. {myData.plow.info.map((item, index) => (
  157. <div className={classNames(leftAc === index ? 'A6vShow' : '')} key={index}>
  158. <video
  159. className='A6video'
  160. playsInline
  161. muted
  162. webkit-playsinline='true'
  163. x5-video-player-type='h5'
  164. loop
  165. >
  166. <source type='video/mp4' src={baseURL + item.videoSrc} />
  167. Your browser does not support the video tag.
  168. </video>
  169. {/* 热点 */}
  170. {item.hot.map((v: PlowHotType, i) =>
  171. v.name === '汉代农具' ? (
  172. <div
  173. onClick={() => setAcName('汉代农具')}
  174. key={i}
  175. className='A6leftBtn'
  176. style={{ backgroundImage: `url(${baseURL}chef/chuBtn.png)` }}
  177. >
  178. 汉代农具
  179. </div>
  180. ) : (
  181. <HotIcon
  182. isModel={v.isModel ? true : false}
  183. style={{
  184. top: v.locPage.top,
  185. left: v.locPage.left
  186. }}
  187. key={i}
  188. index={i}
  189. clickSon={() => setAcName(v.name)}
  190. hoverSrc={v.hoverSrc}
  191. isXiao={0.67}
  192. />
  193. )
  194. )}
  195. </div>
  196. ))}
  197. </div>
  198. {/* 跳到下一章 */}
  199. <NextPage clickSon={() => setLastVideo(true)} txt='结束饮宴' />
  200. {/* 右下角按钮 */}
  201. <FloorBtn plowFu={() => setCode(true)} />
  202. </div>
  203. ) : null}
  204. {acName && hotInfo.name ? (
  205. <Hot2 data={hotInfo.data} closeFu={() => setAcName('')} name={hotInfo.name} />
  206. ) : null}
  207. {/* 二维码弹窗 */}
  208. {imgNow ? (
  209. <div className={classNames('A6codeBox', code ? 'A6codeBoxShow' : '')}>
  210. <img className='A6cimg' src={baseURL + 'plow/code.png'} alt='' />
  211. <p>{isPc ? '扫码二维码,体验小游戏' : '长按图片,保存二维码'}</p>
  212. <p>{isPc ? '' : '体验小游戏'}《汉代庄园田耕记》</p>
  213. {/* 右下角的返回按钮 */}
  214. <BtnRight imgName='back' clickSon={() => setCode(false)} title='返回' />
  215. </div>
  216. ) : null}
  217. {/* 结尾动画 */}
  218. {imgNow ? (
  219. <EndVideo
  220. lastVideo={lastVideo}
  221. delDom='.A6main'
  222. src={baseURL + myData.plow.lastVideo}
  223. path='/xianJu'
  224. noBtn={true}
  225. />
  226. ) : null}
  227. </div>
  228. )
  229. }
  230. const MemoA6plow = React.memo(A6plow)
  231. export default MemoA6plow