diff options
author | Michael <michael.foiani@gmail.com> | 2022-06-08 15:15:47 -0400 |
---|---|---|
committer | Michael <michael.foiani@gmail.com> | 2022-06-08 15:15:47 -0400 |
commit | 2b416e0b836af692e0ce7f121e25e167919f3681 (patch) | |
tree | 4f095b314304daad5194776be8219ace955b8117 | |
parent | f7966035392675e8670914f1df81cda9084c2cbe (diff) |
found a hacky way to stop the bug with the mouse. touch devices seems to be working in a weird way tho
-rw-r--r-- | src/client/views/nodes/RecordingBox/ProgressBar.tsx | 68 |
1 files changed, 41 insertions, 27 deletions
diff --git a/src/client/views/nodes/RecordingBox/ProgressBar.tsx b/src/client/views/nodes/RecordingBox/ProgressBar.tsx index fbb5e8a8b..3314da355 100644 --- a/src/client/views/nodes/RecordingBox/ProgressBar.tsx +++ b/src/client/views/nodes/RecordingBox/ProgressBar.tsx @@ -8,7 +8,7 @@ import { MediaSegment } from './RecordingView'; interface ProgressBarProps { videos: MediaSegment[], - setVideos, + setVideos: React.Dispatch<React.SetStateAction<MediaSegment[]>>, } interface SegmentBox { @@ -102,7 +102,8 @@ export function ProgressBar(props: ProgressBarProps) { // don't do anything if null const progressBar = progressBarRef.current if (progressBar == null || clickedSegment.id === progressBar.id) return - progressBar.setPointerCapture(e.pointerId) + const ptrId = e.pointerId; + progressBar.setPointerCapture(ptrId) const rect = clickedSegment.getBoundingClientRect() // id for segment is like 'segment-1' or 'segment-10', @@ -123,46 +124,58 @@ export function ProgressBar(props: ProgressBarProps) { const detchedSegment = document.createElement("div") initDeatchSegment(detchedSegment, rect); - function updateSegmentOrder(event: PointerEvent): void{ + const updateSegmentOrder = (event: PointerEvent): void => { event.stopPropagation(); + event.preventDefault(); - followCursor(event, detchedSegment, rect) - - const oldIndex = lastHover.index - const swapSegments = (newIndex: number) => { - if (newIndex == null) return - setOrdered(prevOrdered => { - const cpy = [...prevOrdered] - cpy[oldIndex] = cpy[newIndex] - cpy[newIndex] = prevOrdered[oldIndex] - return cpy - }) - setDragged(newIndex) + // this fixes a bug where pointerup doesn't fire while cursor is upped while being dragged + console.log('update cursor', progressBar.hasPointerCapture(ptrId), ptrId) + if (!progressBar.hasPointerCapture(ptrId)) { + placeSegmentandCleanup(); + return; } + followCursor(event, detchedSegment, rect) + const curX = event.clientX; if (curX < lastHover.minX && lastHover.index > 0) { - swapSegments(lastHover.index - 1) + swapSegments(lastHover.index, lastHover.index - 1) lastHover = updateLastHover(lastHover.index - 1) ?? lastHover } else if (curX > lastHover.maxX && lastHover.index < segments.length - 1) { - swapSegments(lastHover.index + 1) + swapSegments(lastHover.index, lastHover.index + 1) lastHover = updateLastHover(lastHover.index + 1) ?? lastHover } - } - - progressBar.addEventListener('pointermove', updateSegmentOrder) - 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'; - console.log('removed dot') + } + + const placeSegmentandCleanup = (event?: PointerEvent): void => { + event?.stopPropagation(); + event?.preventDefault(); + // remove the update event listener for pointermove + progressBar.removeEventListener('pointermove', updateSegmentOrder), { once: true } + // remove the floating segment from the DOM detchedSegment.remove() + // dragged is -1 is equiv to nothing being dragged, so the normal state + // so this will place the segment in it's location and update the segment bar setDragged(-1); - }, { once: true }) + } + + + progressBar.addEventListener('pointermove', updateSegmentOrder) + progressBar.addEventListener('pointerup', placeSegmentandCleanup, { once: true }) } + const swapSegments = (oldIndex: number, newIndex: number) => { + if (newIndex == null) return + setOrdered(prevOrdered => { + const cpy = [...prevOrdered] + cpy[oldIndex] = cpy[newIndex] + cpy[newIndex] = prevOrdered[oldIndex] + return cpy + }) + setDragged(newIndex) + } + const initDeatchSegment = (dot: HTMLDivElement, rect: DOMRect) => { dot.classList.add("segment-selected") @@ -173,6 +186,7 @@ export function ProgressBar(props: ProgressBarProps) { dot.style.height = `${rect.height}px`; dot.style.left = `${rect.x}px`; dot.style.top = `${rect.y}px`; + dot.draggable = false; document.body.append(dot) } const cleanupDetachSegment = (dot: HTMLDivElement) => { |