From f9edfa523f0545e72b8d4ce7be3aefbf1a80e21b Mon Sep 17 00:00:00 2001 From: wil Date: Fri, 15 Mar 2024 13:51:22 -0400 Subject: [PATCH] new video player, simlified version of trim player --- .../src/components/common/Spinner/Spinner.tsx | 8 +- .../common/VideoPlayer/VideoPlayer.tsx | 91 ++++++++++ .../components/ControlBar/ButtonPlaypause.tsx | 46 +++++ .../components/ControlBar/ControlBar.tsx | 50 ++++++ .../ControlBar/LabelTimeDuration.tsx | 42 +++++ .../components/ControlBar/index.tsx | 1 + .../components/ScrubberBar/ProgressBar.tsx | 54 ++++++ .../components/ScrubberBar/ScrubberBar.tsx | 20 +++ .../components/ScrubberBar/index.tsx | 1 + .../VideoPlayer/components/VideoTakeover.tsx | 86 ++++++++++ .../common/VideoPlayer/contexts.tsx | 3 + .../components/common/VideoPlayer/index.tsx | 2 + .../components/common/VideoPlayer/reducer.tsx | 59 +++++++ .../components/common/VideoPlayer/styles.scss | 159 ++++++++++++++++++ .../common/VideoPlayer/utilities.tsx | 29 ++++ .../common/VideoQuickTrim/VideoQuickTrim.tsx | 126 +++++++------- .../VideoQuickTrim/components/ControlBar.tsx | 72 +++++--- .../VideoQuickTrim/components/PlayCursor.tsx | 26 +-- .../VideoQuickTrim/components/ProgressBar.tsx | 42 +++-- .../components/withScrubbing.tsx | 19 ++- .../common/VideoQuickTrim/reducer.tsx | 1 - .../common/VideoQuickTrim/styles.scss | 2 + .../view/pages/components_library/sandbox.tsx | 10 +- 23 files changed, 824 insertions(+), 125 deletions(-) create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/VideoPlayer.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/components/ControlBar/ButtonPlaypause.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/components/ControlBar/ControlBar.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/components/ControlBar/LabelTimeDuration.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/components/ControlBar/index.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/components/ScrubberBar/ProgressBar.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/components/ScrubberBar/ScrubberBar.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/components/ScrubberBar/index.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/components/VideoTakeover.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/contexts.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/index.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/reducer.tsx create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/styles.scss create mode 100644 packages/fakeyou.com/src/components/common/VideoPlayer/utilities.tsx diff --git a/packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx b/packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx index e6ffa715e8..6f0fde07c7 100644 --- a/packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx +++ b/packages/fakeyou.com/src/components/common/Spinner/Spinner.tsx @@ -10,8 +10,12 @@ const Line = ({ yah }:{ yah: any }) => ; -export default function Spinner() { - return +export default function Spinner({ + size= 32 +}:{ + size?:number +}) { + return { [...Array(12)].map((l,key) => ) } ; }; \ No newline at end of file diff --git a/packages/fakeyou.com/src/components/common/VideoPlayer/VideoPlayer.tsx b/packages/fakeyou.com/src/components/common/VideoPlayer/VideoPlayer.tsx new file mode 100644 index 0000000000..e025fe7032 --- /dev/null +++ b/packages/fakeyou.com/src/components/common/VideoPlayer/VideoPlayer.tsx @@ -0,0 +1,91 @@ +import React, { + useRef, + useCallback, + useReducer, +} from "react"; + +import { VideoFakeyou } from "components/common"; +import { VideoFakeyouProps } from "../VideoFakeyou/VideoFakeyou"; +import { QuickTrimData } from "./utilities"; + +import { + reducer, + initialState, + ACTION_TYPES +} from "./reducer"; +import { + VideoElementContext +} from "./contexts"; + +import { VideoTakeover } from "./components/VideoTakeover"; +import { ScrubberBar } from "./components/ScrubberBar"; +import { ControlBar } from "./components/ControlBar"; + +import './styles.scss'; + + +interface VideoPlayerProps extends VideoFakeyouProps { + debug?: boolean + height?: number + // onSelectTrim: (values: QuickTrimData) => void; + // trimStartSeconds: number; + // trimEndSeconds: number; +} + +export const VideoPlayer = ({ + debug: propsDebug = false, + height=500, + // onSelectTrim, + // trimStartSeconds: propsTrimStartSeconds, + // trimEndSeconds : propsTrimEndSeconds, + ...rest +}: VideoPlayerProps) => { + const debug = true || propsDebug; + if(debug) console.log(`reRENDER VideoQuickTrim @${String(Date.now()).slice(-5)}`) + const [compState, dispatchCompState] = useReducer(reducer, initialState); + + const videoRef = useRef(null); + const videoRefCallback = useCallback(node => { + function handleLoadedmetadata (){ + dispatchCompState({ + type: ACTION_TYPES.ON_LOADED_METADATA, + payload:{ videoDuration: node.duration,} + }); + }; + if (node !== null) { + // DOM node referenced by ref has changed and exists + videoRef.current = node; + node.addEventListener("loadedmetadata", handleLoadedmetadata); + } // else{} DOM node referenced by ref has been unmounted + + return()=>{ + node?.removeEventListener("loadedmetadata",handleLoadedmetadata); + } + + }, [ + // No Dependency ! + ]); //END videoRefCallback\ + + return( + +
+
+ + + {/* components that takes over for spinner and warning message */} + +
{/* END of Video Wrapper */} + + +
+ + ); +} + diff --git a/packages/fakeyou.com/src/components/common/VideoPlayer/components/ControlBar/ButtonPlaypause.tsx b/packages/fakeyou.com/src/components/common/VideoPlayer/components/ControlBar/ButtonPlaypause.tsx new file mode 100644 index 0000000000..94aa11dafe --- /dev/null +++ b/packages/fakeyou.com/src/components/common/VideoPlayer/components/ControlBar/ButtonPlaypause.tsx @@ -0,0 +1,46 @@ +import React, { + useContext, + useEffect, + useState +} from "react"; + +import { + faPlay, + faPause, +} from "@fortawesome/pro-solid-svg-icons"; + +import { Button } from "components/common"; +import {VideoElementContext} from '../../contexts'; + +export function ButtonPlaypause (){ + const vidEl = useContext(VideoElementContext); + const [playpause, setPlaypause] = useState<"playing"|"paused">("paused"); + const togglePlaypause = ()=>{ + if (playpause === "playing") vidEl?.pause(); + else vidEl?.play(); + } + + useEffect(()=>{ + const setPlaying = ()=>setPlaypause("playing"); + const setPaused = ()=>setPlaypause("paused"); + if(vidEl!==null){ + vidEl.addEventListener("play", setPlaying ); + vidEl.addEventListener("pause", setPaused); + } + return()=>{ + if(vidEl!==null){ + vidEl.removeEventListener("play", setPlaying); + vidEl.removeEventListener("pause", setPaused); + } + }; + },[vidEl]); + + return( +