From ed7e5ee8082710dc67f722b98d8f4d9aa2d732b5 Mon Sep 17 00:00:00 2001 From: wil Date: Tue, 27 Feb 2024 17:44:42 -0500 Subject: [PATCH] playbar responsiveness and perfect offset math --- .../common/VideoQuickTrim/VideoQuickTrim.tsx | 92 +++++++++++++------ .../view/pages/components_library/sandbox.tsx | 7 +- 2 files changed, 70 insertions(+), 29 deletions(-) diff --git a/packages/fakeyou.com/src/components/common/VideoQuickTrim/VideoQuickTrim.tsx b/packages/fakeyou.com/src/components/common/VideoQuickTrim/VideoQuickTrim.tsx index 04705c454d..c191843df4 100644 --- a/packages/fakeyou.com/src/components/common/VideoQuickTrim/VideoQuickTrim.tsx +++ b/packages/fakeyou.com/src/components/common/VideoQuickTrim/VideoQuickTrim.tsx @@ -1,5 +1,6 @@ import React, { useCallback, + useLayoutEffect, useState, useRef, PointerEvent @@ -31,8 +32,13 @@ function formatSecondsToHHMMSS(seconds:number){ else return new Date(seconds * 1000).toISOString().slice(11, 19); } +export type QuickTrimType = { + trimStartSeconds: number; + trimEndSecondds: number; +} + interface VideoQuickTrimProps extends VideoFakeyouProps{ - onChange: ()=>void; + onSelect: (val: QuickTrimType)=>void; } type TrimState = { @@ -42,38 +48,28 @@ type TrimState = { trimEnd: number; maxDuration: number; } - -const initialState = { +const initialTrimState = { isScrubbingTrim: false, trimDuration: 3, trimStart: 0, trimEnd: 0, maxDuration: 0, } +type PlaybarState = { + playbarWidth: number; + timeCursorOffset: number; +} +const initialPlaybarState = { + playbarWidth: 0, + timeCursorOffset: 0, +} export default function VideoQuickTrim({ - onChange, + onSelect, ...rest }: VideoQuickTrimProps){ console.log("Rerender!!"); - const videoRef = useRef(null); - const [currentTimePortion, setCurretTimePortion] = useState(0); - const videoRefCallback = useCallback(node => { - if (node !== null) { - // DOM node referenced by ref has changed and exists - videoRef.current = node; - node.ontimeupdate = (e: PointerEvent)=>{ - console.log(`${node.currentTime}/${node.duration} ${node.currentTime / node.duration}`); - setCurretTimePortion( - fractionToPercentage(node.currentTime / node.duration) - ); - } - } else { - // DOM node referenced by ref has been unmounted - } - }, []); //END videoRefCallback - const trimOptions: { [key: string]: number } = { "3s": 3, "5s": 5, @@ -81,13 +77,57 @@ export default function VideoQuickTrim({ "15s" : 15, "20s" : 20, }; + + const videoRef = useRef(null); + const playbarRef = useRef(null); const trimZoneRef = useRef(null); - const playbarRef = useRef(null); + + const [{playbarWidth, timeCursorOffset}, setPlaybarState] = useState(initialPlaybarState); const [playpause, setPlaypause] = useState<'playing'|'paused'|'stopped'>('paused'); const [{ trimDuration, isScrubbingTrim, - }, setState] = useState(initialState); + }, setState] = useState(initialTrimState); + + + + const videoRefCallback = useCallback(node => { + if (node !== null) { + // DOM node referenced by ref has changed and exists + videoRef.current = node; + node.ontimeupdate = (e: PointerEvent)=>{ + setPlaybarState((curr)=>({ + ...curr, + timeCursorOffset: (node.currentTime / node.duration) * (playbarWidth-8) + })); + } + } // else{} DOM node referenced by ref has been unmounted + }, [playbarWidth]); //END videoRefCallback + + function handleWindowResize() { + if(playbarRef.current !== null){ + const newWidth = playbarRef.current.getBoundingClientRect().width; + setPlaybarState((curr)=>({ + playbarWidth: newWidth, + timeCursorOffset: (curr.timeCursorOffset / (curr.playbarWidth-8)) * (newWidth-8) + })); + } + } + const playbarRefCallback = useCallback(node => { + if(node !== null) { + playbarRef.current = node; + setPlaybarState((curr)=>({ + ...curr, + playbarWidth: node.getBoundingClientRect().width + })); + } + }, []); + useLayoutEffect(()=>{ + window.addEventListener('resize', handleWindowResize); + return () => { + window.removeEventListener('resize', handleWindowResize); + }; + },[]); const handleChangeTrimDuration = (selected: string) =>{ setState((curr)=>({ @@ -127,7 +167,7 @@ export default function VideoQuickTrim({ {/* END of Video Wrapper */} -
+
({ ...curr, - isScrubbingTrim: true, + isScrubbingTrim: false, })); } }} @@ -164,7 +204,7 @@ export default function VideoQuickTrim({ >
-
+
{/* END of Playbar */}
diff --git a/packages/fakeyou.com/src/v2/view/pages/components_library/sandbox.tsx b/packages/fakeyou.com/src/v2/view/pages/components_library/sandbox.tsx index 9bf03a4c71..f979b431bb 100644 --- a/packages/fakeyou.com/src/v2/view/pages/components_library/sandbox.tsx +++ b/packages/fakeyou.com/src/v2/view/pages/components_library/sandbox.tsx @@ -7,8 +7,9 @@ import {Container, Panel} from 'components/common'; export default function ComponentSandbox( {parentPath}:{parentPath:string} ){ - const onChange = ()=>{ + const handleCallback = (val:any)=>{ console.log('onChange is triggered') + console.log(val); } return ( ← Back @@ -17,7 +18,7 @@ export default function ComponentSandbox(
@@ -25,7 +26,7 @@ export default function ComponentSandbox(