|
@@ -1,213 +1,196 @@
|
|
|
-import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
|
|
+import React, { useCallback, useEffect, useRef, useState } from 'react'
|
|
|
import styles from './index.module.scss'
|
|
|
+import useDataUrl from '@/components/ownUse/useDataUrl'
|
|
|
+import useMove from '@/components/ownUse/useMove'
|
|
|
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 { domDelOwnFu } from '@/utils/xhrVideo'
|
|
|
import history from '@/utils/history'
|
|
|
|
|
|
function A1home() {
|
|
|
- const { dataUrlSame } = useDataUrl('home')
|
|
|
+ const { dataUrlSame } = useDataUrl()
|
|
|
|
|
|
const { touchstart, touchmove, touchend } = useMove()
|
|
|
|
|
|
// 动画视频的ref
|
|
|
const videoRef = useRef<HTMLVideoElement>(null)
|
|
|
|
|
|
- // 当前视频索引
|
|
|
- const [videoInd, setVideoInd] = useState(-1)
|
|
|
+ const [loding, setLoding] = useState(100)
|
|
|
|
|
|
- useEffect(() => {
|
|
|
- if (videoInd > -1) {
|
|
|
- setTimeout(() => {
|
|
|
- if (videoRef.current) {
|
|
|
- videoRef.current.currentTime = 0
|
|
|
- videoRef.current.play()
|
|
|
- }
|
|
|
- }, 100)
|
|
|
- }
|
|
|
- }, [videoInd])
|
|
|
-
|
|
|
- const [loding, setLoding] = useState(0)
|
|
|
+ const timeRR = useRef(-1)
|
|
|
|
|
|
useEffect(() => {
|
|
|
- if (loding >= 100) {
|
|
|
- setVideoInd(0)
|
|
|
- // 0.5s之后删除自己
|
|
|
- setTimeout(() => {
|
|
|
- domDelOwnFu('.A1base')
|
|
|
- }, 500)
|
|
|
- }
|
|
|
+ clearInterval(timeRR.current)
|
|
|
+ timeRR.current = window.setInterval(() => {
|
|
|
+ if (loding >= 100) {
|
|
|
+ clearInterval(timeRR.current)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ setLoding(loding + 1)
|
|
|
+ }, 50)
|
|
|
}, [loding])
|
|
|
|
|
|
- const lodingIng = useRef(0)
|
|
|
+ // 点击开始
|
|
|
+ const btnStartFu = useCallback(() => {
|
|
|
+ setLoding(110)
|
|
|
+ // 自动播放视频
|
|
|
+ setTimeout(() => {
|
|
|
+ if (videoRef.current) {
|
|
|
+ videoRef.current.play()
|
|
|
+ }
|
|
|
+ }, 100)
|
|
|
|
|
|
- // 5个动画视频的总长度
|
|
|
- const lodingNumRef = useRef(0)
|
|
|
+ // 0.5s之后删除自己
|
|
|
+ setTimeout(() => {
|
|
|
+ domDelOwnFu('.A1base')
|
|
|
+ }, 500)
|
|
|
+ }, [])
|
|
|
|
|
|
- // 加载完成之后的bolo地址
|
|
|
- const videoSrcArrRef = useRef<{ sort: number; name: string }[]>([])
|
|
|
+ const [ind, setInd] = useState(0)
|
|
|
|
|
|
- const [videoSrcArr, setVideoSrcArr] = useState<string[]>([])
|
|
|
+ // 向上滑动
|
|
|
+ const videoEndFu = useCallback(
|
|
|
+ (num: number) => {
|
|
|
+ // 这个页面只能向上滑
|
|
|
+ if (num === -1) return
|
|
|
+ if (ind === myData.home.videos.length - 1 && num === 1) return
|
|
|
|
|
|
- // 通过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'
|
|
|
+ setInd(ind + num)
|
|
|
+ },
|
|
|
+ [ind]
|
|
|
+ )
|
|
|
|
|
|
- req.onprogress = function (event) {
|
|
|
- if (lodingNumRef.current) {
|
|
|
- const num = lodingIng.current + event.loaded
|
|
|
+ useEffect(() => {
|
|
|
+ if (ind !== 0) {
|
|
|
+ setTimeout(() => {
|
|
|
+ const domAll: any = document.querySelectorAll('.A1videoBoxSon video')
|
|
|
+ if (domAll && domAll.length) {
|
|
|
+ domAll.forEach((v: HTMLVideoElement, i: number) => {
|
|
|
+ if (ind === i) v.play()
|
|
|
+ else v.pause()
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }, 100)
|
|
|
+ }
|
|
|
+ }, [ind])
|
|
|
|
|
|
- let percent = (num / lodingNumRef.current) * 100
|
|
|
+ // 最后一个过长动画
|
|
|
+ const [lastVideo, setLastVideo] = useState(false)
|
|
|
|
|
|
- percent = Number(percent.toFixed(0))
|
|
|
+ const videoRefLast = useRef<HTMLVideoElement>(null)
|
|
|
|
|
|
- setLoding(percent)
|
|
|
- }
|
|
|
- }
|
|
|
+ const lastVideoFu = useCallback(() => {
|
|
|
+ setLastVideo(true)
|
|
|
|
|
|
- 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))
|
|
|
- }
|
|
|
- }
|
|
|
+ setTimeout(() => {
|
|
|
+ if (videoRefLast.current) {
|
|
|
+ videoRefLast.current.play()
|
|
|
}
|
|
|
- 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])
|
|
|
+ }, 100)
|
|
|
|
|
|
- useEffect(() => {
|
|
|
- if (dataUrlSame) {
|
|
|
- getVideoNum()
|
|
|
- }
|
|
|
- }, [dataUrlSame, getVideoNum])
|
|
|
+ // 0.5s之后删除自己
|
|
|
+ setTimeout(() => {
|
|
|
+ domDelOwnFu('.A1videoBox')
|
|
|
+ }, 500)
|
|
|
+ }, [])
|
|
|
|
|
|
- // 视频播完 或者 点击下一步
|
|
|
- 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]
|
|
|
- )
|
|
|
+ return (
|
|
|
+ <div className={styles.A1home}>
|
|
|
+ {/* 初始加载画面 */}
|
|
|
+ <div
|
|
|
+ className={classNames('A1base', loding === 110 ? 'A1baseHide' : '')}
|
|
|
+ style={{ backgroundImage: `url(${dataUrlSame}${myData.home.bgImg})` }}
|
|
|
+ >
|
|
|
+ <img src={`${dataUrlSame}home/logo.png`} alt='' />
|
|
|
+ {loding >= 100 ? (
|
|
|
+ <div className='A1loding A1lodingBtn' onClick={btnStartFu}>
|
|
|
+ <img src={`${dataUrlSame}visit/btn.png`} alt='' />
|
|
|
+ <div>开始</div>
|
|
|
+ </div>
|
|
|
+ ) : (
|
|
|
+ <div className='A1loding'>{loding}%</div>
|
|
|
+ )}
|
|
|
+ </div>
|
|
|
|
|
|
- // 是否滑到了倒数第二个
|
|
|
- const isLastButOne = useMemo(() => {
|
|
|
- let flag = false
|
|
|
- if (videoInd === myData.home.video.length - 2) flag = true
|
|
|
- return flag
|
|
|
- }, [videoInd])
|
|
|
+ {/* 5个动画视频 */}
|
|
|
+ <div
|
|
|
+ className={classNames('A1videoBox', lastVideo || loding !== 110 ? 'A1videoBoxHide' : '')}
|
|
|
+ style={{
|
|
|
+ transform: `translateY(-${(100 / myData.home.videos.length) * ind}%)`,
|
|
|
+ height: `${100 * myData.home.videos.length}%`
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {myData.home.videos.map((url, index) => (
|
|
|
+ <div
|
|
|
+ key={index}
|
|
|
+ style={{ height: 100 / myData.home.videos.length + '%' }}
|
|
|
+ className='A1videoBoxSon'
|
|
|
+ >
|
|
|
+ <video
|
|
|
+ ref={ind === index ? videoRef : null}
|
|
|
+ playsInline
|
|
|
+ muted
|
|
|
+ webkit-playsinline='true'
|
|
|
+ x5-video-player-type='h5'
|
|
|
+ src={dataUrlSame + url}
|
|
|
+ >
|
|
|
+ <source type='video/mp4' />
|
|
|
+ Your browser does not support the video tag.
|
|
|
+ </video>
|
|
|
+ </div>
|
|
|
+ ))}
|
|
|
+ </div>
|
|
|
|
|
|
- // 是否到了最后一个
|
|
|
- const isLastVideo = useMemo(() => {
|
|
|
- let flag = false
|
|
|
- if (videoInd === myData.home.video.length - 1) flag = true
|
|
|
- return flag
|
|
|
- }, [videoInd])
|
|
|
+ {/* 操作按钮 */}
|
|
|
+ {loding !== 110 || lastVideo ? null : (
|
|
|
+ <div
|
|
|
+ className='A1btnBox'
|
|
|
+ onTouchStart={e => touchstart(e.touches[0].pageY)}
|
|
|
+ onTouchMove={e => touchmove(e.touches[0].pageY)}
|
|
|
+ onTouchEnd={() => touchend(val => videoEndFu(val), 'mobile')}
|
|
|
+ onMouseDown={e => touchstart(e.pageY)}
|
|
|
+ onMouseMove={e => touchmove(e.pageY)}
|
|
|
+ onMouseUp={() => touchend(val => videoEndFu(val), 'pc')}
|
|
|
+ >
|
|
|
+ <img
|
|
|
+ hidden={ind === myData.home.videos.length - 1}
|
|
|
+ className='A1videoBtn'
|
|
|
+ onClick={() => videoEndFu(1)}
|
|
|
+ src={`${dataUrlSame}home/next.png`}
|
|
|
+ alt=''
|
|
|
+ />
|
|
|
+ <div className={ind === myData.home.videos.length - 1 ? 'A1videoBtnBoxShow' : ''}>
|
|
|
+ <img className='A1videoBtnLogo' src={`${dataUrlSame}home/logo.png`} alt='' />
|
|
|
+ <div className='A1videoBtnNext' onClick={lastVideoFu}>
|
|
|
+ <img src={`${dataUrlSame}home/nextLast.png`} alt='' />
|
|
|
+ <p>点击开始</p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
|
|
|
- return (
|
|
|
- <div className={styles.A1home}>
|
|
|
- {/* 加载页面 */}
|
|
|
- <div className={classNames('A1base', videoInd < 0 ? '' : 'A1baseHide')}>
|
|
|
- <img src={`${dataUrlSame}/logo.png`} alt='' />
|
|
|
+ {/* 最后一个过长动画 */}
|
|
|
+ <div className='A1last'>
|
|
|
<video
|
|
|
- src={`${dataUrlSame}/${myData.home.videoSta}`}
|
|
|
+ ref={videoRefLast}
|
|
|
playsInline
|
|
|
muted
|
|
|
webkit-playsinline='true'
|
|
|
x5-video-player-type='h5'
|
|
|
- autoPlay
|
|
|
- loop
|
|
|
- />
|
|
|
-
|
|
|
- <div className='A1loding'>{loding}%</div>
|
|
|
+ src={dataUrlSame + myData.home.lastVideo}
|
|
|
+ onEnded={() => history.push('/visit')}
|
|
|
+ >
|
|
|
+ <source type='video/mp4' />
|
|
|
+ Your browser does not support the video tag.
|
|
|
+ </video>
|
|
|
+ <div
|
|
|
+ className='A1videoLastBtn'
|
|
|
+ style={{ backgroundImage: `url(${dataUrlSame}home/quan.png)` }}
|
|
|
+ onClick={() => history.push('/visit')}
|
|
|
+ >
|
|
|
+ 跳过
|
|
|
+ </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>
|
|
|
)
|
|
|
}
|