diff options
author | Michael <michael.foiani@gmail.com> | 2022-06-08 14:24:09 -0400 |
---|---|---|
committer | Michael <michael.foiani@gmail.com> | 2022-06-08 14:24:09 -0400 |
commit | f7966035392675e8670914f1df81cda9084c2cbe (patch) | |
tree | 3d2e4f68b2f3dfa7d84bbd7562b354e46d640200 | |
parent | d570ab0d8ea08363c651caf8ee67c43c5a5823a3 (diff) |
Refactor code, but there is a bug. May go back.
-rw-r--r-- | src/client/views/nodes/RecordingBox/ProgressBar.tsx | 147 |
1 files changed, 91 insertions, 56 deletions
diff --git a/src/client/views/nodes/RecordingBox/ProgressBar.tsx b/src/client/views/nodes/RecordingBox/ProgressBar.tsx index 34a771367..fbb5e8a8b 100644 --- a/src/client/views/nodes/RecordingBox/ProgressBar.tsx +++ b/src/client/views/nodes/RecordingBox/ProgressBar.tsx @@ -2,7 +2,7 @@ import { resolveTxt } from 'dns'; import { videointelligence } from 'googleapis/build/src/apis/videointelligence'; import { isInteger } from 'lodash'; import * as React from 'react'; -import { useEffect, useState, useCallback, useRef } from "react" +import { useEffect, useState, useCallback, useRef, useMemo } from "react" import "./ProgressBar.scss" import { MediaSegment } from './RecordingView'; @@ -11,33 +11,52 @@ interface ProgressBarProps { setVideos, } +interface SegmentBox { + endTime: number, + startTime: number, + order: number, +} +interface CurrentHover { + index: number, + minX: number, + maxX: number +} + export function ProgressBar(props: ProgressBarProps) { const progressBarRef = useRef<HTMLDivElement | null>(null) // array for the order of video segments const [segments, setSegments] = useState<JSX.Element[]>([]); - const [ordered, setOrdered] = useState<Object[]>([]); + const [ordered, setOrdered] = useState<SegmentBox[]>([]); - const [clicked, setClicked] = useState<number>(-1); + const [dragged, setDragged] = useState<number>(-1); // const totalTime = useMemo(() => props.videos.lastElement().endTime, [props.videos]) const totalTime = () => props.videos.lastElement().endTime + // const memoTotal = useMemo(totalTime, [props.videos]) useEffect(() => { - const segmentsJSX = ordered.map((vid, i) => - <div id={`segment-${i.toString()}`} className={ clicked === i ? 'segment-hide' : 'segment'} style={{ width: `${((vid.endTime - vid.startTime) / totalTime()) * 100}%` }}>{vid.order}</div>); + const segmentsJSX = ordered.map((seg, i) => + <div id={`segment-${i.toString()}`} className={ dragged === i ? 'segment-hide' : 'segment'} style={{ width: `${((seg.endTime - seg.startTime) / totalTime()) * 100}%` }}>{seg.order}</div>); setSegments(segmentsJSX) - }, [clicked, ordered]) + }, [dragged, ordered]) useEffect(() => { - setOrdered(props.videos.map((vid, order) => { - //const { endTime, startTime } = vid - // TODO: not tranfer the blobs around - return { ...vid, order }; - })) + const order = props.videos.length + if (order) { + const { endTime, startTime } = props.videos.lastElement(); + setOrdered(prevOrdered => { + return [...prevOrdered, { endTime, startTime , order }]; + }); + } + // }props.videos.map((vid, order) => { + // //const { endTime, startTime } = vid + // // TODO: not tranfer the blobs around + // return { ...vid, order }; + // })) }, [props.videos]); @@ -60,12 +79,10 @@ export function ProgressBar(props: ProgressBarProps) { // } // } - const updateLastHover = (index) => { - // id for segment is like 'segment-1' or 'segment-10' - const segId = index - console.log(segId) + const updateLastHover = (segId: number): CurrentHover | null => { + // get the segId of the segment that will become the new bounding area const rect = progressBarRef.current?.children[segId].getBoundingClientRect() - console.log(rect) + if (rect == null) return null return { index: segId, minX: rect.x, @@ -73,51 +90,46 @@ export function ProgressBar(props: ProgressBarProps) { } } - const onPointerDown = (e: React.PointerEvent<HTMLDivElement>) =>{ - // e.persist() - // console.log('event', e) + const onPointerDown = (e: React.PointerEvent<HTMLDivElement>) => { + console.log('pointer down') // don't move the videobox element e.stopPropagation() - const progressBar = progressBarRef.current - if (progressBar == null) return - console.log('progressbar', progressBar) - - // progressBar.addEventListener('pointermove', updateSegmentOrder) - - + // get the segment the user clicked on to be dragged const clickedSegment = e.target as HTMLDivElement & EventTarget + // get the profess bar ro add event listeners + // don't do anything if null + const progressBar = progressBarRef.current + if (progressBar == null || clickedSegment.id === progressBar.id) return + progressBar.setPointerCapture(e.pointerId) + const rect = clickedSegment.getBoundingClientRect() - setClicked(parseInt(clickedSegment.id.split('-')[1])) - let lastHover = { - index: parseInt(clickedSegment.id.split('-')[1]), + // id for segment is like 'segment-1' or 'segment-10', + // so this works to get the id + const segId = parseInt(clickedSegment.id.split('-')[1]) + // set the selected segment to be the one dragged + setDragged(segId) + + // this is the logic for storing the lower X bound and upper X bound + // to know whether a swap is needed between two segments + let lastHover: CurrentHover = { + index: segId, minX: rect.x, maxX: rect.x + rect.width, } - // clickedSegment.style.backgroundColor = `inherit`; - const dot = document.createElement("div") - dot.classList.add("segment-selected") - dot.style.transitionDuration = '0s'; - dot.style.position = 'absolute'; - dot.style.zIndex = '999'; - dot.style.width = `${rect.width}px`; - dot.style.height = `${rect.height}px`; - document.body.append(dot) - const dragSegment = (event: PointerEvent): void => { - // event.stopPropagation() - dot.style.left = `${event.clientX - rect.width/2}px`; - dot.style.top = `${event.clientY - rect.height/2}px`; - } + // create the div element that tracks the cursor + const detchedSegment = document.createElement("div") + initDeatchSegment(detchedSegment, rect); - const updateSegmentOrder = (event: PointerEvent): void => { + function updateSegmentOrder(event: PointerEvent): void{ event.stopPropagation(); - dragSegment(event) + followCursor(event, detchedSegment, rect) const oldIndex = lastHover.index - const swapSegments = (newIndex) => { + const swapSegments = (newIndex: number) => { if (newIndex == null) return setOrdered(prevOrdered => { const cpy = [...prevOrdered] @@ -125,32 +137,55 @@ export function ProgressBar(props: ProgressBarProps) { cpy[newIndex] = prevOrdered[oldIndex] return cpy }) - setClicked(newIndex) + setDragged(newIndex) } const curX = event.clientX; if (curX < lastHover.minX && lastHover.index > 0) { swapSegments(lastHover.index - 1) - lastHover = updateLastHover(lastHover.index - 1) + lastHover = updateLastHover(lastHover.index - 1) ?? lastHover } else if (curX > lastHover.maxX && lastHover.index < segments.length - 1) { swapSegments(lastHover.index + 1) - lastHover = updateLastHover(lastHover.index + 1) + lastHover = updateLastHover(lastHover.index + 1) ?? lastHover } } - progressBar.setPointerCapture(e.pointerId) progressBar.addEventListener('pointermove', updateSegmentOrder) - progressBar.addEventListener('pointerup', (event) => { - progressBar.removeEventListener('pointermove', updateSegmentOrder), { once: true } + progressBar.addEventListener('pointerup', () => { + progressBar.removeEventListener('pointermove', updateSegmentOrder), { once : true } // clickedSegment.style.position = clickedSegment.style.zIndex = 'inherit'; // progressBar.removeEventListener('pointermove', updateSegmentOrder), { once: true } // clickedSegment.style.backgroundColor = 'red'; - setClicked(-1); - // updateSegmentOrder(event); - dot.remove(); - }) + console.log('removed dot') + detchedSegment.remove() + setDragged(-1); + }, { once: true }) + } + + + const initDeatchSegment = (dot: HTMLDivElement, rect: DOMRect) => { + dot.classList.add("segment-selected") + dot.style.transitionDuration = '0s'; + dot.style.position = 'absolute'; + dot.style.zIndex = '999'; + dot.style.width = `${rect.width}px`; + dot.style.height = `${rect.height}px`; + dot.style.left = `${rect.x}px`; + dot.style.top = `${rect.y}px`; + document.body.append(dot) + } + const cleanupDetachSegment = (dot: HTMLDivElement) => { + dot.remove() } + const followCursor = (event: PointerEvent, dot: HTMLDivElement, rect: DOMRect): void => { + // event.stopPropagation() + // const { width, height } = dot.getBoundingClientRect() + const { width, height } = rect; + dot.style.left = `${event.clientX - width/2}px`; + dot.style.top = `${event.clientY - height/2}px`; + } + return ( <div className="progressbar" id="progressbar" onPointerDown={onPointerDown} ref={progressBarRef}> |