62 lines
1.4 KiB
JavaScript
62 lines
1.4 KiB
JavaScript
import { useEffect, useMemo, useState } from 'react'
|
|
import { useVideoPlayer } from 'expo-video'
|
|
|
|
const usePlaybackPlayer = ({ item, isActive }) => {
|
|
const baseVideoUrl = item?.playbackUrl || null
|
|
const videoUrl = baseVideoUrl
|
|
|
|
const videoPlayer = useVideoPlayer(videoUrl || null, (player) => {
|
|
player.loop = false
|
|
player.muted = false
|
|
player.timeUpdateEventInterval = 0.2
|
|
})
|
|
|
|
const shouldAutoPlay = isActive
|
|
|
|
useEffect(() => {
|
|
if (!videoPlayer) return
|
|
if (shouldAutoPlay) {
|
|
try {
|
|
videoPlayer.currentTime = 0
|
|
videoPlayer.play()
|
|
} catch (e) {}
|
|
} else if (videoPlayer?.playing) {
|
|
try {
|
|
videoPlayer.pause()
|
|
} catch (e) {}
|
|
}
|
|
}, [shouldAutoPlay, videoPlayer])
|
|
|
|
useEffect(() => {
|
|
return () => {
|
|
try {
|
|
if (videoPlayer?.playing) videoPlayer.pause()
|
|
} catch (e) {}
|
|
}
|
|
}, [videoPlayer])
|
|
|
|
const [currentTimeS, setCurrentTimeS] = useState(0)
|
|
useEffect(() => {
|
|
if (!isActive) return
|
|
const id = global.setInterval(() => {
|
|
try {
|
|
setCurrentTimeS(Number(videoPlayer?.currentTime || 0))
|
|
} catch (e) {}
|
|
}, 250)
|
|
return () => global.clearInterval(id)
|
|
}, [isActive, videoPlayer])
|
|
|
|
const playerState = useMemo(
|
|
() => ({
|
|
videoUrl,
|
|
videoPlayer,
|
|
currentTimeS,
|
|
}),
|
|
[videoPlayer, videoUrl, currentTimeS]
|
|
)
|
|
|
|
return playerState
|
|
}
|
|
|
|
export default usePlaybackPlayer
|