|
@@ -1,12 +1,215 @@
|
|
|
-import React, { useRef } from 'react'
|
|
|
+import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
|
|
import styles from './index.module.scss'
|
|
|
-import { Button } from 'antd'
|
|
|
-import UseDataUrl from '@/components/ownUse/UseDataUrl'
|
|
|
+import { myData } from '@/utils/http'
|
|
|
+import { domDelOwnFu, videoLodingNumFu } from '@/utils/xhrVideo'
|
|
|
+import classNames from 'classnames'
|
|
|
+import useMove from '@/components/ownUse/useMove'
|
|
|
+import useDataUrl from '@/components/ownUse/useDataUrl'
|
|
|
+import history from '@/utils/history'
|
|
|
|
|
|
function A1home() {
|
|
|
- const { dataUrl, dataUrlSame } = UseDataUrl('home')
|
|
|
+ const { dataUrlSame } = useDataUrl('home')
|
|
|
|
|
|
- return <div className={styles.A1home}></div>
|
|
|
+ const { touchstart, touchmove, touchend } = useMove()
|
|
|
+
|
|
|
+ // 动画视频的ref
|
|
|
+ const videoRef = useRef<HTMLVideoElement>(null)
|
|
|
+
|
|
|
+ // 当前视频索引
|
|
|
+ const [videoInd, setVideoInd] = useState(-1)
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (videoInd > -1) {
|
|
|
+ setTimeout(() => {
|
|
|
+ if (videoRef.current) {
|
|
|
+ videoRef.current.currentTime = 0
|
|
|
+ videoRef.current.play()
|
|
|
+ }
|
|
|
+ }, 100)
|
|
|
+ }
|
|
|
+ }, [videoInd])
|
|
|
+
|
|
|
+ const [loding, setLoding] = useState(0)
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (loding >= 100) {
|
|
|
+ setVideoInd(0)
|
|
|
+ // 0.5s之后删除自己
|
|
|
+ setTimeout(() => {
|
|
|
+ domDelOwnFu('.A1base')
|
|
|
+ }, 500)
|
|
|
+ }
|
|
|
+ }, [loding])
|
|
|
+
|
|
|
+ const lodingIng = useRef(0)
|
|
|
+
|
|
|
+ // 5个动画视频的总长度
|
|
|
+ const lodingNumRef = useRef(0)
|
|
|
+
|
|
|
+ // 加载完成之后的bolo地址
|
|
|
+ const videoSrcArrRef = useRef<{ sort: number; name: string }[]>([])
|
|
|
+
|
|
|
+ const [videoSrcArr, setVideoSrcArr] = useState<string[]>([])
|
|
|
+
|
|
|
+ // 通过blob预加载 src为原视频的视频地址
|
|
|
+ const videoLodingFu = useCallback((src: string, sort: number) => {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ const req = new XMLHttpRequest()
|
|
|
+ req.open('GET', src, true)
|
|
|
+ req.responseType = 'blob'
|
|
|
+
|
|
|
+ req.onprogress = function (event) {
|
|
|
+ if (lodingNumRef.current) {
|
|
|
+ const num = lodingIng.current + event.loaded
|
|
|
+
|
|
|
+ let percent = (num / lodingNumRef.current) * 100
|
|
|
+
|
|
|
+ percent = Number(percent.toFixed(0))
|
|
|
+
|
|
|
+ setLoding(percent)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ req.onload = function (event) {
|
|
|
+ lodingIng.current += event.total
|
|
|
+ if (this.status === 200) {
|
|
|
+ const videoBlob = this.response
|
|
|
+ const blobSrc = URL.createObjectURL(videoBlob)
|
|
|
+ videoSrcArrRef.current.push({ sort, name: blobSrc })
|
|
|
+ if (videoSrcArrRef.current.length === myData.home.video.length) {
|
|
|
+ videoSrcArrRef.current = videoSrcArrRef.current.sort((a, b) => a.sort - b.sort)
|
|
|
+ setVideoSrcArr(videoSrcArrRef.current.map(v => v.name))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ req.send()
|
|
|
+ })
|
|
|
+ }, [])
|
|
|
+
|
|
|
+ const getVideoNum = useCallback(() => {
|
|
|
+ myData.home.video.forEach(async v => {
|
|
|
+ const temp = await videoLodingNumFu(`${dataUrlSame}/${v.name}`)
|
|
|
+ lodingNumRef.current += temp
|
|
|
+
|
|
|
+ await videoLodingFu(`${dataUrlSame}/${v.name}`, v.sort)
|
|
|
+ })
|
|
|
+ }, [dataUrlSame, videoLodingFu])
|
|
|
+
|
|
|
+ useEffect(() => {
|
|
|
+ if (dataUrlSame) {
|
|
|
+ getVideoNum()
|
|
|
+ }
|
|
|
+ }, [dataUrlSame, getVideoNum])
|
|
|
+
|
|
|
+ // 视频播完 或者 点击下一步
|
|
|
+ const videoEndFu = useCallback(
|
|
|
+ (num: number) => {
|
|
|
+ if (videoInd === myData.home.video.length - 2 && num === 1) return
|
|
|
+ if (videoInd === 0 && num === -1) return
|
|
|
+ setVideoInd(videoInd + num)
|
|
|
+ },
|
|
|
+ [videoInd]
|
|
|
+ )
|
|
|
+ const onSwipeChange = useCallback(
|
|
|
+ (val: number) => {
|
|
|
+ videoEndFu(val)
|
|
|
+ },
|
|
|
+ [videoEndFu]
|
|
|
+ )
|
|
|
+
|
|
|
+ // 是否滑到了倒数第二个
|
|
|
+ const isLastButOne = useMemo(() => {
|
|
|
+ let flag = false
|
|
|
+ if (videoInd === myData.home.video.length - 2) flag = true
|
|
|
+ return flag
|
|
|
+ }, [videoInd])
|
|
|
+
|
|
|
+ // 是否到了最后一个
|
|
|
+ const isLastVideo = useMemo(() => {
|
|
|
+ let flag = false
|
|
|
+ if (videoInd === myData.home.video.length - 1) flag = true
|
|
|
+ return flag
|
|
|
+ }, [videoInd])
|
|
|
+
|
|
|
+ return (
|
|
|
+ <div className={styles.A1home}>
|
|
|
+ {/* 加载页面 */}
|
|
|
+ <div className={classNames('A1base', videoInd < 0 ? '' : 'A1baseHide')}>
|
|
|
+ <img src={`${dataUrlSame}/logo.png`} alt='' />
|
|
|
+ <video
|
|
|
+ src={`${dataUrlSame}/${myData.home.videoSta}`}
|
|
|
+ playsInline
|
|
|
+ muted
|
|
|
+ webkit-playsinline='true'
|
|
|
+ x5-video-player-type='h5'
|
|
|
+ autoPlay
|
|
|
+ loop
|
|
|
+ />
|
|
|
+
|
|
|
+ <div className='A1loding'>{loding}%</div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ {/* 5个视频动画页面 */}
|
|
|
+ {videoInd > -1 && videoSrcArr.length ? (
|
|
|
+ <>
|
|
|
+ {isLastVideo ? (
|
|
|
+ <div className='A1videoLast'>
|
|
|
+ <video
|
|
|
+ ref={videoRef}
|
|
|
+ src={videoSrcArr[videoSrcArr.length - 1]}
|
|
|
+ playsInline
|
|
|
+ muted
|
|
|
+ webkit-playsinline='true'
|
|
|
+ x5-video-player-type='h5'
|
|
|
+ onEnded={() => history.push('/visit')}
|
|
|
+ />
|
|
|
+ <div
|
|
|
+ className='A1videoLastBtn'
|
|
|
+ style={{ backgroundImage: `url(${dataUrlSame}/quan.png)` }}
|
|
|
+ onClick={() => history.push('/visit')}
|
|
|
+ >
|
|
|
+ 跳 过
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ ) : (
|
|
|
+ <div
|
|
|
+ className='A1video'
|
|
|
+ onTouchStart={e => touchstart(e.touches[0].pageY)}
|
|
|
+ onTouchMove={e => touchmove(e.touches[0].pageY)}
|
|
|
+ onTouchEnd={() => touchend(val => onSwipeChange(val), 'mobile')}
|
|
|
+ onMouseDown={e => touchstart(e.pageY)}
|
|
|
+ onMouseMove={e => touchmove(e.pageY)}
|
|
|
+ onMouseUp={() => touchend(val => onSwipeChange(val), 'pc')}
|
|
|
+ >
|
|
|
+ <video
|
|
|
+ ref={videoRef}
|
|
|
+ src={videoSrcArr[videoInd]}
|
|
|
+ playsInline
|
|
|
+ muted
|
|
|
+ webkit-playsinline='true'
|
|
|
+ x5-video-player-type='h5'
|
|
|
+ onEnded={() => videoEndFu(1)}
|
|
|
+ loop={videoInd === videoSrcArr.length - 2}
|
|
|
+ />
|
|
|
+ {isLastButOne ? (
|
|
|
+ <>
|
|
|
+ <img className='A1videoBtnLogo' src={`${dataUrlSame}/logo.png`} alt='' />
|
|
|
+ <img
|
|
|
+ className='A1videoBtn'
|
|
|
+ onClick={() => setVideoInd(videoSrcArr.length - 1)}
|
|
|
+ src={`${dataUrlSame}/nextLast.png`}
|
|
|
+ alt=''
|
|
|
+ />
|
|
|
+ </>
|
|
|
+ ) : (
|
|
|
+ <img onClick={() => videoEndFu(1)} src={`${dataUrlSame}/next.png`} alt='' />
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
+ </>
|
|
|
+ ) : null}
|
|
|
+ </div>
|
|
|
+ )
|
|
|
}
|
|
|
|
|
|
const MemoA1home = React.memo(A1home)
|