diff --git a/com.twin.app.shoptime/src/components/VideoPlayer/TReactPlayer.jsx b/com.twin.app.shoptime/src/components/VideoPlayer/TReactPlayer.jsx index 0d06b360..6ab48b6c 100644 --- a/com.twin.app.shoptime/src/components/VideoPlayer/TReactPlayer.jsx +++ b/com.twin.app.shoptime/src/components/VideoPlayer/TReactPlayer.jsx @@ -1,102 +1,138 @@ +import React, { useCallback, useMemo, useRef } from "react"; + import ReactPlayer from "react-player"; -import handle from '@enact/core/handle'; -import React, { useCallback, useRef, useMemo } from "react"; -var handledMediaEventsMap = -['onReady', 'onStart', 'onPlay', 'onProgress', 'onDuration', 'onPause', 'onBuffer', 'onBufferEnd', 'onSeek', 'onEnded', 'onError']; +import handle from "@enact/core/handle"; -export default function TReactPlayer({mediaEventsMap=handledMediaEventsMap, videoRef, url, ...rest}) { +var handledMediaEventsMap = [ + "onReady", + "onStart", + "onPlay", + "onProgress", + "onDuration", + "onPause", + "onBuffer", + "onBufferEnd", + "onSeek", + "onEnded", + "onError", +]; + +export default function TReactPlayer({ + mediaEventsMap = handledMediaEventsMap, + videoRef, + url, + overlayLoading, + setOverlayLoading, + ...rest +}) { const playerRef = useRef(null); - const handleEvent = useCallback((type)=> (ev)=> { - if(type === 'onReady'){ - if(videoRef ){ - const videoNode = playerRef.current.getInternalPlayer(); - videoRef(videoNode); - if(videoNode.tagName && !Object.prototype.hasOwnProperty.call(videoNode, "proportionPlayed")){ - Object.defineProperties(videoNode, { - 'error': { - get: function() { - return videoNode.networkState === videoNode.NETWORK_NO_SOURCE; - } - }, - 'loading': { - get: function() { - return videoNode.readyState < videoNode.HAVE_ENOUGH_DATA; - } - }, - 'proportionLoaded': { - get: function() { - return videoNode.buffered.length &&videoNode.buffered.end(videoNode.buffered.length - 1) / videoNode.duration; - } - }, - 'proportionPlayed': { - get: function() { - return videoNode.currentTime / videoNode.duration; - } - } - }); - }else if(!Object.prototype.hasOwnProperty.call(videoNode, "proportionPlayed")){//youtube - window.videoNode = videoNode; - videoNode.play = videoNode.playVideo; - videoNode.pause = videoNode.pauseVideo; - videoNode.seek = videoNode.seekTo; - Object.defineProperties(videoNode, { - 'currentTime': { - get: function() { - return videoNode.getCurrentTime(); - }, - set: function(time){ - videoNode.seekTo(time); - } - }, - 'duration':{ - get: function() { - return videoNode.getDuration(); - } - }, - 'paused':{ - get: function() { - return videoNode.getPlayerState() !== 1; - } - }, - 'error': { - get: function() { - return !!videoNode?.playerInfo?.videoData?.errorCode; - } - }, - 'loading': { - get: function() { - return !videoNode?.playerInfo?.videoData?.isPlayable; - ; //todo - } - }, - 'proportionLoaded': { - get: function() { - return videoNode?.playerInfo?.videoBytesLoaded >= 1; //todo - } - }, - 'proportionPlayed': { - get: function() { - return videoNode.getCurrentTime() / videoNode.getDuration(); - } - } - }); - } - } - handle.forward('onLoadStart', {type, ev}, rest); - } - handle.forward('onUpdate', {type, ev}, rest); - },[videoRef]); + const handleEvent = useCallback( + (type) => (ev) => { + if (type === "onReady") { + if (videoRef) { + if (!overlayLoading) { + setOverlayLoading(true); + } - const handledMediaEvents = useMemo(()=>{ + const videoNode = playerRef.current.getInternalPlayer(); + videoRef(videoNode); + if ( + videoNode.tagName && + !Object.prototype.hasOwnProperty.call(videoNode, "proportionPlayed") + ) { + Object.defineProperties(videoNode, { + error: { + get: function () { + return videoNode.networkState === videoNode.NETWORK_NO_SOURCE; + }, + }, + loading: { + get: function () { + return videoNode.readyState < videoNode.HAVE_ENOUGH_DATA; + }, + }, + proportionLoaded: { + get: function () { + return ( + videoNode.buffered.length && + videoNode.buffered.end(videoNode.buffered.length - 1) / + videoNode.duration + ); + }, + }, + proportionPlayed: { + get: function () { + return videoNode.currentTime / videoNode.duration; + }, + }, + }); + } else if ( + !Object.prototype.hasOwnProperty.call(videoNode, "proportionPlayed") + ) { + //youtube + window.videoNode = videoNode; + videoNode.play = videoNode.playVideo; + videoNode.pause = videoNode.pauseVideo; + videoNode.seek = videoNode.seekTo; + Object.defineProperties(videoNode, { + currentTime: { + get: function () { + return videoNode.getCurrentTime(); + }, + set: function (time) { + videoNode.seekTo(time); + }, + }, + duration: { + get: function () { + return videoNode.getDuration(); + }, + }, + paused: { + get: function () { + return videoNode.getPlayerState() !== 1; + }, + }, + error: { + get: function () { + return !!videoNode?.playerInfo?.videoData?.errorCode; + }, + }, + loading: { + get: function () { + return !videoNode?.playerInfo?.videoData?.isPlayable; //todo + }, + }, + proportionLoaded: { + get: function () { + return videoNode?.playerInfo?.videoBytesLoaded >= 1; //todo + }, + }, + proportionPlayed: { + get: function () { + return videoNode.getCurrentTime() / videoNode.getDuration(); + }, + }, + }); + } + } + handle.forward("onLoadStart", { type, ev }, rest); + } + handle.forward("onUpdate", { type, ev }, rest); + }, + [videoRef, overlayLoading] + ); + + const handledMediaEvents = useMemo(() => { const events = {}; - for (let i=0; i< mediaEventsMap.length; i++) { + for (let i = 0; i < mediaEventsMap.length; i++) { const eventName = mediaEventsMap[i]; events[eventName] = handleEvent(eventName); } return events; - },[handleEvent, mediaEventsMap]); + }, [handleEvent, mediaEventsMap]); return ( + /> ); -} \ No newline at end of file +} diff --git a/com.twin.app.shoptime/src/components/VideoPlayer/VideoPlayer.js b/com.twin.app.shoptime/src/components/VideoPlayer/VideoPlayer.js index e3fd42e1..f5f4e1b4 100644 --- a/com.twin.app.shoptime/src/components/VideoPlayer/VideoPlayer.js +++ b/com.twin.app.shoptime/src/components/VideoPlayer/VideoPlayer.js @@ -2110,6 +2110,7 @@ const VideoPlayerBase = class extends React.Component { orderPhnNo, captionEnable, overlayLoading, + setOverlayLoading, ...mediaProps } = this.props; @@ -2222,7 +2223,11 @@ const VideoPlayerBase = class extends React.Component { (VideoComponent && (((typeof VideoComponent === "function" || typeof VideoComponent === "string") && ( - + )) || (React.isValidElement(VideoComponent) && React.cloneElement(VideoComponent, mediaProps)))) || diff --git a/com.twin.app.shoptime/src/views/PlayerPanel/PlayerPanel.jsx b/com.twin.app.shoptime/src/views/PlayerPanel/PlayerPanel.jsx index 9701fedf..baee9a27 100644 --- a/com.twin.app.shoptime/src/views/PlayerPanel/PlayerPanel.jsx +++ b/com.twin.app.shoptime/src/views/PlayerPanel/PlayerPanel.jsx @@ -1298,6 +1298,7 @@ const PlayerPanel = ({ videoVerticalVisible={videoVerticalVisible} isSubtitleActive={isSubtitleActive} overlayLoading={overlayLoading} + setOverlayLoading={setOverlayLoading} > {typeof window === "object" && window.PalmSystem && (